说在前面:

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

参考地址: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"'>即可。

相关文章:

  • 2022-12-23
  • 2021-10-23
  • 2021-11-16
  • 2021-09-26
  • 2022-12-27
  • 2021-12-28
  • 2022-01-02
  • 2021-08-03
猜你喜欢
  • 2021-10-30
  • 2021-07-28
  • 2021-10-15
  • 2022-03-06
  • 2022-12-23
  • 2022-12-23
  • 2021-07-10
相关资源
相似解决方案