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);
    }

查询结果: