1. 程式人生 > >mybatis 批量新增並更新已有資料

mybatis 批量新增並更新已有資料

工作中有一個功能需求,需要呼叫對方介面得到資料並更新到資料庫中。在網上找了好多沒找到有現成的東西,都是單獨的批量更新,批量新增。需求要求進行批量處理的時候無則新增,有則更新。

一開始使用的是呼叫儲存過程的方法,在過程中處理這樣的操作,但是當資料量過大時事務管理會成為效能的瓶頸。幾十上百萬的資料頻繁更新的時候效能就無法達到要求了,決定想其他的辦法。

先宣告是oracle資料庫,oracle中並沒有mysql中replace這樣的關鍵字,後來無意中找到了MERGE INTO 這個關鍵字。它就是insert和update的合體,這個關鍵字具體解釋網上有很多就不多說了。下邊貼出mybatis中sql,各位夥伴如果遇到同樣需求可以嘗試使用。

<insert id="save表List" parameterType="java.util.List">
MERGE INTO 要儲存的表 T1
USING 
(
<foreach collection="itemList" item="item" index="index" separator="union">
select #{item.欄位1} 欄位1, #{item.欄位2} 欄位2,#{item.欄位3} 欄位3
  FROM DUAL
  </foreach>
  ) T2
ON ( T1.欄位1=T2.欄位1)
WHEN MATCHED THEN
  UPDATE SET T1.欄位2 = T2.欄位2, T1.欄位3 = T2.欄位3
WHEN NOT MATCHED THEN 
  INSERT (欄位1,欄位2,欄位3) 
  VALUES (T2.欄位1, T2.欄位2, T2.欄位3)

  </insert>

首先傳入需要批量處理的list在USING中進行迴圈,之後如果表中有滿足 T1.欄位1=T2.欄位1  這個條件的資料則進行更新,沒有則進行新增,需要注意的一點是在ON中的判斷的欄位不允許在更新中出現,否則會報錯。

以上可以滿足需要批量進行新增和更新已有資料的操作,具體多少資料提交一次可視情況而定。

另外有一個沒有解決的問題,就是當資料中含有大欄位的時候比如clob欄位字元過長會有報錯,因為oracle中不允許兩個單引號之間的長度超過4000,這塊暫時還沒有解決相容的方法就是在構建list的時候判斷一下這個欄位是不是過長,如果過長的話還是利用儲存過程這樣的方式單獨處理。