在Mybatis使用Integer与''进行比较的坑及解决

 更新时间:2023年03月31日 08:37:36   作者:WINGZINGLIU  
这篇文章主要介绍了在Mybatis使用Integer与''进行比较的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

使用Integer与''进行比较的坑

前段时间遇到一个bug,就是修改某一个integer类型的值的时候,除了修改为0 其他的值都可以进行修改。只要想把这个字段改成0 就似乎没有走update这个字段的语句。(前段时间比较忙也就没有记下这个笔记)

相信很多朋友在使用Mybatis的时候都会去使用通用一点的insert或者update语句,类似加入以下这种判断来进行复用。

<if test="orgName != null and orgName != ''">
    orgName =#{orgName ,jdbcType=VARCHAR},
</if>

也就是只有orgName有有效值的时候才会进入set语句,但是在对于Integer类型下的判断就会有一定的影响。

经过我的测试发现mybatis会将Integer值的0等于空字符串''

例如传入的num的值为0,if标签里面一样写

num != null and num != ''

当num的值为0 ,mybatis会当做0等于空串,也就不会进入此if里面的代码块。

比如update语句,如果传进来的值为0那么这个字段就不会被update掉。

也就是说在对Integer类型的值进行判断的时候,只需要加入!= null 即可。

Integer类型参数在Mybatis中的比较问题

案例

当使用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">

最后

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解决IDEA target文件夹越来越大的问题

    解决IDEA target文件夹越来越大的问题

    这篇文章主要介绍了解决IDEA target文件夹越来越大的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 详解JAVA中获取文件MD5值的四种方法

    详解JAVA中获取文件MD5值的四种方法

    这篇文章主要介绍了JAVA中获取文件MD5值的四种方法,获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过MessageDigest类进行MD5加密,第三步转换成16进制的MD5码值,需要的朋友可以参考下
    2022-08-08
  • Java 遍历list和map的方法

    Java 遍历list和map的方法

    这篇文章主要介绍了Java 遍历list和map的方法,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-12-12
  • Spring事务管理方法步骤解析

    Spring事务管理方法步骤解析

    这篇文章主要介绍了Spring事务管理方法步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java阻塞队列必看类:BlockingQueue快速了解大体框架和实现思路

    Java阻塞队列必看类:BlockingQueue快速了解大体框架和实现思路

    这篇文章主要介绍了Java阻塞队列必看类:BlockingQueue快速了解大体框架和实现思路,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • 剑指Offer之Java算法习题精讲求和篇

    剑指Offer之Java算法习题精讲求和篇

    跟着思路走,之后从简单题入手,反复去看,做过之后可能会忘记,之后再做一次,记不住就反复做,反复寻求思路和规律,慢慢积累就会发现质的变化
    2022-03-03
  • Java的枚举,注解和反射(二)

    Java的枚举,注解和反射(二)

    今天小编就为大家分享一篇关于Java枚举,注解与反射原理说明,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-07-07
  • SpringBoot整合Solr实现文档检索

    SpringBoot整合Solr实现文档检索

    Solr高度可靠、可扩展和容错,提供分布式索引、复制和负载平衡查询、自动故障转移和恢复、集中配置等,Solr 为世界上许多最大的 Internet 站点的搜索和导航功能提供支持,本文将给大家介绍SpringBoot整合Solr实现文档检索,需要的朋友可以参考下
    2023-08-08
  • Java开发实现人机猜拳游戏

    Java开发实现人机猜拳游戏

    这篇文章主要为大家详细介绍了Java开发实现人机猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • 关于Java中重定向传参与取值

    关于Java中重定向传参与取值

    这篇文章主要介绍了Java中重定向传参与取值问题,重定向不仅可以重定向到当前应用程序中的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源,本文给大家介绍的非常详细,需要的朋友可以参考下
    2023-05-05

最新评论