当我们使用 <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' 也不会生效
解决办法:
1.外层用单引号, 里面用双引号
select * from user <where> name like #{name} <if test='isChinese == "1"'> and coutry = 'China' </if> </where>
2.使用toString()
select * from user <where> name like #{name} <if test="isChinese == '1'.toString()"> and coutry = 'China' </if> </where>
感兴趣的朋友可以深入了解一下 mybatis 是如何解析 if 里面的表达式的
以及OGNL 语言