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