在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加上安全的用户认证详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-01-013行代码快速实现Spring Boot Oauth2服务功能
oauthserver是一个基于Spring Boot Oauth2的完整的独立的Oauth服务器。仅仅需要创建相关数据表,修改数据库的连接信息,你就可以得到一个Oauth服务器。这篇文章给大家介绍3行代码快速实现Spring Boot Oauth2服务功能,需要的朋友参考下吧2018-04-04SpringBoot使用JdbcTemplate访问操作数据库基本用法
这篇文章主要介绍了SpringBoot使用JdbcTemplate访问操作数据库基本用法,Spring对数据库的操作在jdbc上s面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。下文详细内容需要的小伙伴可以参考一下2022-02-02mybatis-plus 执行insert(),实体的id自动更新问题
这篇文章主要介绍了mybatis-plus 执行insert(),实体的id自动更新问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-12-12spring-boot.version2.6升级到2.7.18后security报错问题
这篇文章主要介绍了spring-boot.version2.6升级到2.7.18后security报错问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-08-08浅谈SpringMVC HandlerInterceptor诡异问题排查
这篇文章主要介绍了浅谈SpringMVC HandlerInterceptor诡异问题排查,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2019-05-05
最新评论