当我们使用 <if> 实现动态sql时, 需要注意, 单个字符比较问题。
例如:
List<User> queryUserByParam(Map<String, Object> param);
select * from user
<where>
name like #{name}
<if test="isChinese == '1'">
and coutry = 'China'
</if>
</where>
Map<String, object> param = new HashMap<>();
param.put("name", "张三");
param.put("isChinese ", "1");
userMapper.queryUserByParam(param);
查询结果不会过滤China用户,
此时if 条件是不成立的, 因为上面的写法 isChinese == '1' ‘1’ 会解析为单个字符, 因此条件总是不成立, 所以 and coutry = 'China' 也不会生效
解决办法:
- 外层用单引号, 里面用双引号
select * from user
<where>
name like #{name}
<if test='isChinese == "1"'>
and coutry = 'China'
</if>
</where>
使用toString()
select * from user
<where>
name like #{name}
<if test="isChinese == '1'.toString()">
and coutry = 'China'
</if>
</where>
感兴趣的朋友可以深入了解一下 mybatis 是如何解析 if 里面的表达式的
以及OGNL 语言

本文探讨了在使用MyBatis进行动态SQL构建时,关于单个字符比较的问题。当条件如`isChinese=='1'`时,由于解析原因,条件始终无法满足。解决方案包括使用单引号内嵌双引号或调用`toString()`方法确保字符串正确解析。深入理解MyBatis的OGNL表达式解析对于避免此类问题至关重要。
1303

被折叠的 条评论
为什么被折叠?



