【MyBatis框架】mapper配置文件-foreach标签

foreach标签

下面介绍一下一个mapper配置文件中的foreach标签(注意,要跟着前面的总结来看,这里使用的例子是结合前面的工程写的,大部分代码没有再赘述)
foreach的做用是向sql传递数组或List,mybatis使用foreach解析

1.1需求
在用户查询列表和查询总数的statement中增长多个id输入查询。
sql语句以下:

两种方法:
SELECT * FROM USER WHERE id=1 OR id=3 OR id=5
SELECT * FROM USER WHERE id IN(1,3,5)

1.2在输入参数类型中添加List<Integer> ids传入多个id
public class UserQueryVo {
//传入多个id
private List<Integer> ids;
public List<Integer> getIds() {
return ids;
}

public void setIds(List<Integer> ids) {
this.ids = ids;
}
......
}

1.3修改mapper.xml
WHERE id=1 OR id=3 OR id=5
在查询条件中,查询条件定义成一个sql片断,须要修改sql片断。html

<pre name="code" class="html"><!-- 定义sql片断 
id:sql片断的惟一标识 
在sql片断中不要加入where
经验:通常咱们定义sql片断是为了可重用性,是基于单表来定义sql片断,
这样的话这个sql片断可重用性才高-->
<sql id="query_user_where">
    <if test="ids!=null">
        <!-- 使用foreach遍历传入ids 
        collection指定输入对象中集合属性
        item每次遍历生成的对象名
        open开始遍历时要拼接的串
        close开始遍历时要拼接的串
        separator遍历的两个对象中间须要拼接的串
        -->
        <!-- 使用实现下边的sql拼接 
        WHERE (id=1 OR id=3 OR id=5)-->
        <foreach collection="ids" item="user_id" open="AND (" close=")" separator="OR">
            <!-- 每次遍历要拼接的串 -->
            id=#{user_id}
        </foreach>
    </if>
</sql>

<!-- 用户信息综合查询 -->
    <select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" 
                                resultType="cn.edu.hpu.mybatis.PO.UserCustom">
        select * from user 
        
        <!-- where标签能够自动去掉第一个and -->  
        <where>
            <!-- 应用sql片断的id,若是refid指定的id再也不本mapper文件中,须要前边加namespace -->
            <include refid="query_user_where"></include>
            <!-- 在这里还可能要引用其余的sql片断 -->
        </where>
    </select>

在mapper接口类中添加相应方法:java

//用户管理的Dao接口
public interface UserMapper {
    
    //用户信息综合查询
    public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
    ......
}

1.4测试代码sql

//用户信息综合查询
    @Test
    public void testFindUserList() throws Exception{
        
        SqlSession sqlSession=sqlSessionFactory.openSession();
        
        //建立UserMapper代理对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        
        //建立包装对象,设置查询条件
        UserQueryVo userQueryVo=new UserQueryVo();
        //传入多个Id
        List<Integer> ids=new ArrayList<Integer>();
        ids.add(1);
        ids.add(3);
        ids.add(5);
        //将ids经过userQueryVo传入statement中
        userQueryVo.setIds(ids);
        
        //调用userMapper的方法
        List<UserCustom> users=userMapper.findUserList(userQueryVo);
        
        for (int i = 0; i < users.size(); i++) {
            UserCustom user=(UserCustom)users.get(i);
            System.out.println(user.getId()+":"+user.getUsername());
        }
    }

测试结果:
1:张三
3:刘莉莉
5:刘三姐数组

能够看到,sql语句select * from user WHERE ( id=? OR id=? OR id=? ) 经过foreach输出成功

1.5另一个sql的实现:mybatis

<!-- 使用实现下边的sql拼接 
AND ID IN(1,3,5)-->
<foreach collection="ids" item="user_id" open="AND ID IN(" close=")" separator=",">
    <!-- 每次遍历要拼接的串 -->
    #{user_id}
</foreach>
相关文章
相关标签/搜索