MyBatis动态SQL的foreach标签

向sql传递数组或List,mybatis使用foreach解析,如下:

根据多个id查询用户信息

SELECT * FROM user WHERE id IN (1,10,24)

步骤一:​ 改造QueryVo

如下图在pojo中定义list属性ids存储多个用户id,并添加getter/setter方法

步骤二:​ UserMapper.xml添加sql

<!-- 根据ids查询用户 -->
<select id="queryUserByIds" parameterType="queryVo" resultType="user">
SELECT * FROM `user`
<where>
<!-- foreach标签,进行遍历 -->
<!-- collection:遍历的集合,这里是QueryVo的ids属性 -->
<!-- item:遍历的项目,可以随便写,,但是和后面的#{}里面要一致 -->
<!-- open:在前面添加的sql片段 -->
<!-- close:在结尾处添加的sql片段 -->
<!-- separator:指定遍历的元素之间使用的分隔符 -->
<foreach collection="ids" item="item" open="id IN (" close=")"
separator=",">
#{item}
</foreach>
</where>
</select>

测试方法如下图:

@Test
public void testQueryUserByIds() {
// mybatis和spring整合,整合之后,交给spring管理
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// 创建Mapper接口的动态代理对象,整合之后,交给spring管理
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

// 使用userMapper执行根据条件查询用户
QueryVo queryVo = new QueryVo();
List<Integer> ids = new ArrayList<>();
ids.add(1);
ids.add(10);
ids.add(24);
queryVo.setIds(ids);

List<User> list = userMapper.queryUserByIds(queryVo);

for (User u : list) {
System.out.println(u);
}

// mybatis和spring整合,整合之后,交给spring管理
sqlSession.close();
}

运行结果如下图:

31MyBatis - 动态SQL的 foreach标签_spring