在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">

最后

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

相关文章

  • spring cloud-给Eureka Server加上安全的用户认证详解

    spring cloud-给Eureka Server加上安全的用户认证详解

    这篇文章主要介绍了spring cloud-给Eureka Server加上安全的用户认证详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • SpringBoot异步实现的8种方式

    SpringBoot异步实现的8种方式

    异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,本文主要介绍了SpringBoot异步实现的8种方式,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • 3行代码快速实现Spring Boot Oauth2服务功能

    3行代码快速实现Spring Boot Oauth2服务功能

    oauthserver是一个基于Spring Boot Oauth2的完整的独立的Oauth服务器。仅仅需要创建相关数据表,修改数据库的连接信息,你就可以得到一个Oauth服务器。这篇文章给大家介绍3行代码快速实现Spring Boot Oauth2服务功能,需要的朋友参考下吧
    2018-04-04
  • 解决IDEA中同项目引用报红问题

    解决IDEA中同项目引用报红问题

    在IDEA中,如果项目引用报红,可能是因为IDEA的引用缓存问题,可以通过File->Invalidate Caches/Restart清空缓存并重建索引来解决,这个方法可以帮助解决同项目中引用找不到的问题,恢复正常的项目引用,消除报红
    2024-09-09
  • 阿里规范:为何boolean类型变量命名禁用is开头

    阿里规范:为何boolean类型变量命名禁用is开头

    这篇文章主要给大家介绍了关于阿里规范:为何boolean类型变量命名禁用is开头的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • SpringBoot使用JdbcTemplate访问操作数据库基本用法

    SpringBoot使用JdbcTemplate访问操作数据库基本用法

    这篇文章主要介绍了SpringBoot使用JdbcTemplate访问操作数据库基本用法,Spring对数据库的操作在jdbc上s面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。下文详细内容需要的小伙伴可以参考一下
    2022-02-02
  • mybatis-plus 执行insert(),实体的id自动更新问题

    mybatis-plus 执行insert(),实体的id自动更新问题

    这篇文章主要介绍了mybatis-plus 执行insert(),实体的id自动更新问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java数组反转方式

    Java数组反转方式

    这篇文章主要介绍了Java数组反转方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • spring-boot.version2.6升级到2.7.18后security报错问题

    spring-boot.version2.6升级到2.7.18后security报错问题

    这篇文章主要介绍了spring-boot.version2.6升级到2.7.18后security报错问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 浅谈SpringMVC HandlerInterceptor诡异问题排查

    浅谈SpringMVC HandlerInterceptor诡异问题排查

    这篇文章主要介绍了浅谈SpringMVC HandlerInterceptor诡异问题排查,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05

最新评论