MyBatis if判断解析Integer为0的属性不成立;MyBatis动态SQL表达式的“坑”;

说在前面:

      遇到问题时在网上看到两篇文章,虽然都能解决问题,但是第一篇的原因解释有问题,第二篇解释对了,但是太累赘,所以整合了一下。已放入原作者地址,若觉得不详细可以去原作者那里继续研究。

参考地址:https://www.cnblogs.com/chenhao-/p/7206482.html

场景描述:

       使用Mybatis时,常常会判断属性是否为空,当type为Integer类型,并且type值为0时,该if判断却为false。

<if test="type != null and type != ''">  
    and type = #{type}   
</if>  

解决办法:

      删除and及后面的判断

<if test="type != null">  
    and type = #{type}   
</if>  

原因:

      参考地址:https://www.jianshu.com/p/91ed365c0fdd

       Mybatis的源码中表达式是用OGNL解析的,OGNL对于boolean的定义和JavaScript有点像,即:0==''这是一个true的条件,大家可以在浏览器的控制台尝试,如下图。可以不难理解<if test="type != null and type != ''">  ,当type=0时会出现的问题了。问题的根源来自编码的不规范,只有String类型才需要判断是否!='',其他类型完全没有必要判断!=''。    MyBatis if判断解析Integer为0的属性不成立;MyBatis动态SQL表达式的“坑”;

        这里有必要再提一个“坑”,如果你有类似于String str ="A"; <if test="str!= null and str == 'A'">这样的写法时,你要小心了。因为单引号内如果为单个字符时,OGNL将会识别为Java 中的 char类型,显然String 类型与char类型做==运算会返回false,从而导致表达式不成立。解决方法很简单,修改为<if test='str!= null and str == "A"'>即可。