案例:
当使用mybatis传入参数为Integer类型,使用条件构造语句时偶尔会导致判断错误。如下
select * from tbl_user where 1=1
<if test="flag != null and flag != '' ">
and flag = #{flag}
</if>
当flag传入参数为0,会导致条件构造失败;SQL执行结果不是我们想要的
原因分析:
mybatis
在预编译sql
时,使用OGNL
表达式来解析if
标签,对于Integer
类型属性,在判断不等于''
时,会返回''
的长度,也就是0
源码:(s.length() == 0) ? 0.0 : Double.parseDouble( s )
因此表达式 flag != ''
被当做 flag
!= 0
来判断,所以当flag为0
时,if
条件判断不通过
总结:
if
条件判断number
类型,没必要判断''
的情况,只需判断null
的情况即可;
如果非要判断''
的情况,那么要考虑到等于0
的情况,即<if test="flag != '' or flag == 0">