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类型才需要判断是否!='',其他类型完全没有必要判断!=''。    

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

-----------------------------------后期补充-----------------------------------

Mybatis异常:
java.lang.IllegalArgumentException: invalid comparison:java.util.Date and java.lang.String

原因:在Mapper.xml中对非字符串类型的数据进行了是否为空判断,如date、decimal类型的数据进行 != ''就会报如上错误,只有字符串才需要非空判断

参考地址:https://www.cnblogs.com/coffee9527/p/9179941.html

-----------------------------------后期补充-----------------------------------

=与==关于引号的使用

=情况

<if test="isMapping!=null and isMapping != '1'">

==时,单引号双引号对换

<if test='isMapping!=null and isMapping == "1"'>

参考地址:https://www.cnblogs.com/sxdcgaq8080/p/9443023.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值