MyBatis【问题 02】使用#{}导致的问题(#{}并非简单地将传入数据前后添加单引号)及解决方法

简介: MyBatis【问题 02】使用#{}导致的问题(#{}并非简单地将传入数据前后添加单引号)及解决方法

1.问题说明

传递参数如下:

Map<String, Object> parameter = new HashMap<>(2);
  parameter.put("test","少儿','历史");
  commonMapper.test(parameter);

Mapper内的SQL如下:

<select id="test" parameterType="map" resultType="map">
        SELECT * FROM test
        WHERE NAME IN ( #{test} )
    </select>

实际执行的SQL如下:

Execute SQL:SELECT * FROM test WHERE NAME IN ( '少儿'',''历史' )

想要执行的SQL:

SELECT * FROM test WHERE NAME IN ( '少儿','历史' )

2.问题解决

2.1 方案一

Java代码拼写inStr

/**
     * 带逗号的字符串转换成SQL里的inStr("a,b,c"->'a','b','c')
     *
     * @param stringWithComma 用逗号分隔的字符串 "a,b,c"
     * @return inStr可以用在SQL的in语句内 'a','b','c'
     */
    public String getInStr(String stringWithComma) {
        String splitSymbolComma = ",";
        ArrayList<String> strList = CollectionUtil.toList(stringWithComma.split(splitSymbolComma));
        return strList.stream().collect(Collectors.joining("\',\'", "\'", "\'"));
    }

此时Mapper使用${}进行注入:

<select id="test" parameterType="map" resultType="map">
        SELECT * FROM test
        WHERE NAME IN ( ${test} )
    </select>

2.2 方案二

将in参数转换成arraylist传递给Mapper动态生成筛选SQL:

<delete id="test" parameterType="map">
        SELECT * FROM test WHERE NAME IN 
        <foreach collection="array" item="type" open="(" separator="," close=")">
            #{type}
        </foreach>
   </delete>
   <delete id="test" parameterType="map">
        SELECT * FROM test WHERE NAME IN 
        <foreach collection="list" item="type" open="(" separator="," close=")">
            #{type}
        </foreach>
   </delete>
目录
相关文章
|
1月前
|
Java 数据库连接 mybatis
Mybatis Plus保存数据返回主键id
Mybatis Plus保存数据返回主键id
20 1
|
2月前
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
22 1
|
2月前
|
Java 关系型数据库 数据库连接
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
32 1
|
2月前
Mybatis+mysql动态分页查询数据案例——条件类(HouseCondition)
Mybatis+mysql动态分页查询数据案例——条件类(HouseCondition)
17 1
|
2月前
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
26 1
|
2月前
Mybatis+mysql动态分页查询数据案例——房屋信息的实现类(HouseDaoMybatisImpl)
Mybatis+mysql动态分页查询数据案例——房屋信息的实现类(HouseDaoMybatisImpl)
23 2
|
5月前
|
SQL Java 数据库连接
MyBatis练习(1)数据表中的数据封装成JavaBean
MyBatis练习(1)数据表中的数据封装成JavaBean
34 0
|
2月前
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
17 1
|
7天前
|
SQL 前端开发 Java
通过使用Mybatis插件来实现数据的分页功能
通过使用Mybatis插件来实现数据的分页功能
|
27天前
|
存储 XML Java
mybatis使用内部类处理一对多类型数据2
mybatis使用内部类处理一对多类型数据2