为什么在动态SQL中where条件判断的时候后面跟上and不会报错

本文探讨了在使用MyBatis框架进行数据库操作时,如何正确处理动态SQL语句,特别是当条件判断中包含AND或OR关键字时,MyBatis的处理机制能够智能地去除多余的逻辑运算符,避免SQL语法错误,确保查询语句的正确性和效率。

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

假如现在我们要查询一个姓张的且名字大于25的人:

xml中的写法

select <include refid="userCols" /> from user
<where>
	<if test="name != null and name != ''">
		and name like concat(#{name}, '%')
	</if>
	
	<if test="age != null and age != ''">
		and age &gt; #{age}
	</if>
</where>

接口中的写法

public List findUsersByName(@Param(“name”) String name, @Param(“age”) Integer age);

如果一个人的姓名为空的话,第一个if语句就不会执行,但是后面的if语句成立的话,会形成
select * from user where and age &gt; #{age},这种sql语句在执行过程中是会报错的,但是实际运行时却没有报错,sql语句变成了select id, name, age from user where ? like concat (?, ‘%’) ,and不见了?,为什么,且在没有名字的情况下记录User [id=4, name=, age=26]也被查了出来,在查阅了各种资料之后,才知道,如果标签返回的内容是以AND 或OR 开头的,where语句会将多余的and或or剔除掉。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值