1. 程式人生 > 其它 >關於mybatis-plus 中saveOrUpdateBatch的方法重寫,不根據主鍵更新

關於mybatis-plus 中saveOrUpdateBatch的方法重寫,不根據主鍵更新

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 條件

來建立一個臨時表與原來的資料進行對比,這時候使用MATCHED關鍵字來看是否匹配上了,匹配上了則使用update語句沒有匹配上則使用insert語句。

但是這個方法在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索引否則的話會尋找不到對比資料,那麼會就只會進行新增操作。

此方法自用,歡迎指正!