Mybatis xml if tag tips

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当我们使用 <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>

使用toString()

select * from user
<where>
   name like #{name}
   <if test="isChinese == '1'.toString()">
   	and coutry = 'China'
   </if>
</where>

感兴趣的朋友可以深入了解一下 mybatis 是如何解析 if 里面的表达式的
以及OGNL 语言

OGNL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值