经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MyBatis » 查看文章
mybatis 解决将数值0识别成空字符串的问题
来源:jb51  时间:2021/6/15 14:18:17  对本文有异议

今天遇到一个问题

我在用java的BigDecimal对象时,值是0.00000;该对象不是空的,是new出来的,我需要将该值插入数据库,数据库对于该值的接收字段类型是decimal。

我使用的Mybatis。mybatis中的语句大致如下:

  1. UPDATE user_consumption
  2. <trim prefix="SET" suffixOverrides=",">
  3. <if test="totalConsumption!=null" and totalConsumption!=''>
  4. total_consumption = #{totalConsumption},
  5. </if>
  6. </trim>
  7. WHERE
  8. id = #{id} and state = 'A'

其中totalConsumption就是java对象中类型为BigDecimal的对象,该变量映射到数据库表中的字段是total_consumption。但是你mybatis的xml文件中的语句如上述缩写,你需要设的值是0.00000,此时运行的时候你会发现报错,报错如下:

报错指出sql语句是这样子的,没有需要set的值

  1. UPDATE user_consumption WHERE id = #{id} and state = 'A'

从报错的语句可以看出,Mybatis认为totalConsumption这个量是null或者空字符串,但是totalConsumption明明是New出来的,不会是空的,那么唯一的可能就是mybatis将值为0.00000的totalConsumption识别为空字符串了,事实也确实如此,改天我会看看源代码,再贴到这边,以后记住mybatis 会将数值0识别成空字符串。

解决方式:

对于上述的问题的修改就是将判断空字符串的判断语句去掉即可。但是这并不是通用解决方案,因为我问题中的BigDecimal是需要New出来的,就算不是New出来的,也不会在进入mybatis之前变成空字符串,所以我可以直接把空字串去掉,

  1. UPDATE user_consumption
  2. <trim prefix="SET" suffixOverrides=",">
  3. <if test="totalConsumption!=null">
  4. total_consumption = #{totalConsumption},
  5. </if>
  6. </trim>
  7. WHERE
  8. id = #{id} and state = 'A'

但是对于那些不需要new的数据类型,就比如你Java中是Integer,此时你最好把类型换成string,就不会出现这种情况了。

mybatis 获取数据为null(注解方式)

在使用 muybatis 获取 mysql 的日期数据的时候,其中一个数据一直为空,而其他在同一实体中的数据却可以正常获取。

此种情况很可能是 mysql 中的数据与 java 实体类数据映射失败的原因,使用注解开发时,要求实体类数据中属性必须和 mysql 中的属性名一致(除非你进行映射转换的配置),可以忽略大小写。

这次的问题就在于其中一个属性少写了一个字母,导致和mysql 那边匹配不上

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号