mybatis批量添加时数字丢失精度问题

  背景:参与开发的系统A要与系统B交互,系统B使用的是SQLServer数据库,为了快速开发当时想采用dblink实现,但为了安全性起见,还是采用接口实现,接口的客户端和服务端都是自己写,采用的Mybatis操作数据库,批量插入。

问题:A系统的数据同步至B系统时,小数的精度丢失了。

排查:断点跟踪了接口客户端、服务端的数据,到插入SQLServer数据库之前数字数据都是正确的,而且字段的数据类型为Decimal(14,5),后来找同事求助,同事百度查说,应该是mybatis批量插入导致的。

解决方案:

在批量插入SQL时,cast(#{item.amount,jdbcType=DECIMAL} as decimal(14,5)) ,如:

<insert id="saveGChangeMxBy" >
  insert into JY_GCHANGE_MX (PK, HZID, MXID,
    GCODE, BATCHCODE, BATCHNO,
    PRODUCEDATE, AMOUNT, STOCKNAME
    )
  VALUES
  <foreach collection="list" item="item" index="index" separator =",">
    (
    #{item.pk,jdbcType=INTEGER},#{item.hzid,jdbcType=INTEGER},#{item.mxid,jdbcType=INTEGER},#{item.goodscode,jdbcType=VARCHAR},
    #{item.batchcode,jdbcType=VARCHAR}, #{item.batchno,jdbcType=VARCHAR},#{item.producedate,jdbcType=DATE},cast(#{item.amount,jdbcType=DECIMAL} as decimal(14,5)),#{item.stockname,jdbcType=NVARCHAR}
    )
  </foreach>
</insert>
 

而后在网上还查到另一种解决方案(未试):

 

公司最近的项目用的是sqlserver数据库,maven依赖为:

<dependency>
              <groupId>com.microsoft.sqlserver</groupId>
              <artifactId>mssql-jdbc</artifactId>
              <version>6.4.0.jre7</version>
</dependency>
执行批量插入语句时,原本小数点后有三位小数,检查数据库发现小数点后的数字全变为0了,这让朕百思不得其解啊!于是乎检查mapper.xml文件发现没问题,debug跑了一下,发现执行流程没问题,到执行语句前,小数点后数字都还是存在的,但是执行语句后,数据库里数据变成了.000,最后把sqlserver驱动换成了sqljdbc4,重新执行代码后,数据库里的数据一切正常.下面是sqlserver4的maven依赖

<dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>sqljdbc4</artifactId>
</dependency>
不过要使用sqljdbc4必须先把jar包先安装到本地仓库才可使用,因为中央仓库没有这玩意.
--------------------- 
转载:https://blog.csdn.net/fanyuna/article/details/84135701 
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值