關於mybatis-plus 中saveOrUpdateBatch的方法重寫,不根據主鍵更新
阿新 • • 發佈:2022-05-21
mybatis-plus 中saveOrUpdateBatch都是採用預設策略(主鍵)作為判斷該資料存在與否的依據,當我們需要使用其他欄位作為判斷條件的時候,發現不論怎麼使用都不行。
這個時候可以採取簡單的方式,list在程式碼裡面迴圈裡面使用saveOrUpdate來進行一條一條更新,但是一條一條更新會太慢,當資料太大時也是不行的。
所以這裡採用自己重寫saveOrUpdateBatch方式進行實現:
Oracle資料庫:
<update id="saveOrUpdateBatch"> MERGE INTO t_oe_type t1 USING (<foreach collection="list" item="item" index="index" separator="union"> SELECT #{item.CategoryId} as category_id, #{item.CategoryName} as category_name, #{item.Brands}as brands FROM DUAL </foreach> ) t2 on (t1.category_id=t2.category_id) WHEN MATCHED THEN UPDATE SET t1.category_name=t2.category_name,t1.brands=t2.brands WHEN NOT MATCHED THEN INSERT ( category_id, category_name, brands) VALUES (t2.category_id,t2.category_name,t2.brands) </update>
這裡是採用oracle獨有的 MERGE INTO xxxtable 表1 USING 資料來源 表2 on 條件
但是這個方法在orcale資料庫中可以進行使用,但是在mysql中不行,因為mysql中沒有 MERGE INTO USING 這個語法,這時候我們需要重新換個思路去解決
mysql資料庫:
<update id="saveOrUpdateBatch"> INSERT INTO t_oe_type ( category_id, category_name, brands ) select * from ( <foreach collection="list" item="item" index="index" separator="union"> SELECT #{item.CategoryId} as category_id, #{item.CategoryName} as category_name, #{item.Brands}as brands FROM DUAL </foreach> ) t2
on duplicate KEY UPDATE category_name = t2.category_name,brands = t2.brands </update>
mysql因為沒有 MERGE INTO USING 這個語法 所以我們採用mysql特有的 on duplicate KEY UPDATE 來進行資料處理,這樣也可以實現saveOrUpdateBatch操作,但是這個有一個限制條件,那就是當前傳入引數中必須要有一列是主鍵或UNIQUE索引否則的話會尋找不到對比資料,那麼會就只會進行新增操作。
此方法自用,歡迎指正!