mybatis动态SQL-<foreach>标签实现in集合
在一些业务场景下,有时需要批量插入、批量更新或者查询时参数在多个条件中匹配,比如说查询时在多个条件中匹配,我们使用原生SQL正常会用IN,比如id IN (1,2,3)。在mybatis中可以使用${ids}去直接取值,但我们都知道${}方式去取值,不能防止SQL注入,想要方式SQL注入的话,就要用#{}的方式去取值,如果用#{}去取值,就要配合使用<foreach>标签来满足需求了。
<foreach>标签可以对数组、Map或实现了Iterable接口(常见的如List、Set)的对象进行遍历。数组在处理时会转换为List对象,因此<foreach>标签遍历的对象可以分为两大类,分别是Iterable类和Map类。
下面开始具体分析,代码参照《SpringBoot整MyBatis》中的代码:
查询数据时使用<foreach>标签:
在SysUserMapper.xml中增加id="selectInList"的<select>映射:
<select id="selectInList" resultMap="sysUserMap">
select <include refid="sysUserSql"/>
from sys_user where id in
<foreach collection="idList" open="(" close=")" separator="," item="id" index="i">
#{id}
</foreach>
</select>
SysUserMapper.java新增方法:
/**
* @Description 根据idList数组中的id查找人员信息
* @Author chengjunyu
* @Date 2022/1/24 22:05
* @Param idList
* @Return java.util.List<com.example.mybatis.model.SysUser>
* @Exception
*/
List<SysUser> selectInList(Integer[] idList);
SysUserService.java新增方法:
/**
* @Description 根据idList数组中的id查找人员信息
* @Author chengjunyu
* @Date 2022/1/24 22:06
* @Param idList
* @Return java.util.List<com.example.mybatis.model.SysUser>
* @Exception
*/
List<SysUser> selectInList(String idString);
SysUserServiceImpl.java新增方法:
/**
* @param idString
* @Description 根据idList数组中的id查找人员信息
* @Author chengjunyu
* @Date 2022/1/24 22:06
* @Param idList
* @Return java.util.List<com.example.mybatis.model.SysUser>
* @Exception
*/
@Override
public List<SysUser> selectInList(String idString) {
String[] idArr = null;
if(idString.indexOf(",") > 0) {
idArr = idString.split(",");
}
int length = idArr.length;
Integer[] idList = new Integer[length];
for (int i = 0; i<length; i++) {
idList[i] = Integer.valueOf(idArr[i]);
}
return sysUserMapper.selectInList(idList);
}
SysUserController.java新增方法:
@GetMapping("/selectInList")
public List<SysUser> selectInList(String idString) {
return sysUserService.selectInList(idString);
}
查询结果: