MyBatis中進行批量更新(MySQL資料庫)
阿新 • • 發佈:2019-02-19
一、簡介
在程式開發過程中,往往會遇到需要更新一批資料(批量更新)的情況,這種情況通常有兩種方法進行解決。這兩種方法各有優點與缺點,這就需要我們根據實際業務需要進行取捨。
二、操作
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 次,最後將執行結果合併到一起(讀寫操作都是如此)。