1. 程式人生 > >MyBatis中進行批量更新(MySQL資料庫)

MyBatis中進行批量更新(MySQL資料庫)

一、簡介

在程式開發過程中,往往會遇到需要更新一批資料(批量更新)的情況,這種情況通常有兩種方法進行解決。這兩種方法各有優點與缺點,這就需要我們根據實際業務需要進行取捨。

二、操作

1、逐條更新(不推薦)

直接在程式上使用迴圈對資料庫進行資料更新,使用這樣的方式是最簡單、最不容易出錯的方式。也不會出現因為一條資料更新失敗,而導致全部資料更新失敗。

執行Java程式碼如下:


updateBatch(List<Demo> demos){ 
    for(User user : users){ 
        try{ 
            demoMapper.update(user);
        } catch
(Exception e){ //如果更新失敗可以做一些其他的操作,比如說打印出錯日誌等 logger.error("更新資料失敗,失敗資料為:{},異常資訊為:{}", user, e.getMessage()) } } }

執行SQL語句如下:

update 
    user
set
    mark = #{mark}  
where 
    id = #{id}

雖然這樣做簡單省事,但是會產生一個較大的問題,那就是執行效率問題。由於是迴圈執行,資料庫連線連線釋放,再連線再釋放,知道迴圈結束。大量的佔用資料庫連線池內連線,從而影響執行效率。

2、批量更新(推薦)

批量更新是使用SQL的批量更新方式進行,使用 CASE ... WHEN ... THAN... 的語法進行批量操作。我們藉助 MyBatis<foreach> 語法進行SQL拼接成可以批量更新的SQL語句 。

我們以將表中特定id資料的mark欄位修改為制定值為例。

Java程式中Dao層程式碼寫法如下:


public intupdateBatch(List<User> idList);

MyBatis的xml檔案中書寫方法如下:


<update id="updateBatch" parameterType="java.util.List"
> update demo set mark = CASE <foreach collection="list" item="m" index="index"> <if test="m.mark!= null and m.mark!= ''"> when id = #{m.id} then #{m.mark} </if> </foreach> END WHERE id in <foreach collection="list" item="m" index="index" open="(" separator="," close=")"> #{m.id} </foreach> </update>

按照如上方式,執行SQL過程中就會一次性將資料批量更新入資料庫中。

之所以可以使用 CASE ... WHEN 方式進行批量更新,主要是因為 in 關鍵字的特性。 使用 in 關鍵字作為條件進行讀操作或者是寫操作時,實際相當於多個 or 條件進行疊加。

使用 in 關鍵字的查詢語句

SELECT id FROM user WHERE id in (1, 2, 3);

與如下使用 or 關鍵字的查詢SQL等價

SELECT id FROM user WHERE id = 1 or id = 2 or id = 3

假設 in 關鍵字中有 m 個條件,實際進行執行過程時,就會執行 m 次,最後將執行結果合併到一起(讀寫操作都是如此)。