又出现了,入参param1=1的时候筛选结果正确,param1=0的时候筛选失效的问题,真的是不管写几次都无法就这个bug和Mybatis和解……
https://www.jb51.net/article/240595.htmhttps://www.jb51.net/article/240595.htm参考以上文章
非String类型使用obj != null即可
String类型通常要加一个空串的判断obj != null and obj != '',如果入参类型对应的判断方式使用正确,不会有问题。
入参是一个数字类型,如Long,但是在判空时使用obj != null and obj != '',这种做法本身就是错误的,你会发现,当Long值传0的时候,obj == ''是成立的,就导致了完全出乎预料的结果。其中mybatis的处理方式是,当发现你用一个数字类型的对象和串比较的时候,他会将串转换成数字类型,非空串的时候是没有问题的,空串的时候,mybatis将空串转换成数字0,这就是mybatis做的实现,问题根源是对非字符串类型做了空串判断的错误操作。
最后的结论就是,数字类型的对象不要使用空串判断表达式obj != ''。
<if test="param1 != null and param1 != ''">
and param_1 = #{param1}
</if>
在param1为整型的前提下,如果传参为0,Mybatis会认为0和空字符串相等,从而不执行该if下的语句,导致错误,应改为:
<if test="param1 != null">
and param_1 = #{param1}
</if>
非String类型不判断 !=''