on duplicate key update 的用法說明(解決批量操作數據,有就更新,沒有就新增)mybatis批量操作數據更新和添加


項目用的ORM框架是用springdatajpa來做的,有些批量數據操作的話,用這個效率太低,所以用mybatis自己寫sql優化一下。

一般情況,我們肯定是先查詢,有就修改,沒有就添加,這樣的話,單個操作還好,如果是大量數據的話,每次都需要先查后改(如果用springdatajpa的話,添加之前還得查一遍),太消耗資源了。

那么mysql有沒有解決的辦法呢?當然是有的,我查了一些資料,有兩種辦法,一種是使用使用replace into ,還有一種是on duplicate key update來解決,我先來演示一下這兩種辦法的區別。

首先創建一個表(我設置的username列唯一,用戶名不可重復)

CREATE TABLE user_table(
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(10) UNIQUE KEY,
    address VARCHAR(10)
)

添加一條數據

INSERT INTO user_table (id,username,address) VALUE (NULL,'胡俊傑','北京')

 目的:先查詢數據是否存在,再修改(用一條語句實現),胡俊傑不在北京了,跑去黑龍江了

REPLACE INTO user_table(id,username,address) VALUE (NULL,'胡俊傑','黑龍江')

sql運行之后,顯示2行收到影響。

 

 

 之后再觀察數據庫的數據,姓名沒變,地址變了,而且id也變了

 

 

 說明replace into是先刪除原來的,再新增。

這個顯然是不好的,加入有個場景,這個表的id是一個表的外鍵,那么這樣就會造成錯誤,所以我們引入方法2來解決。

方法二:

現在,把胡俊傑在安排回北京。sql語句如下

INSERT INTO user_table(id,username,address) VALUE (NULL,'胡俊傑','北京') ON DUPLICATE KEY UPDATE address = '北京'
INSERT INTO user_table(id,username,address) VALUE (NULL,'胡俊傑','北京') ON DUPLICATE KEY UPDATE address = VALUES(address) //這兩種方法都可以,下面這個可以動態綁定傳來的值

這次依舊是2行發生改變,我們再看數據庫的數據

 

 

 

 

 

 id沒有改變,只改變了地址,這種辦法是最實用的了。

接下來演示一下mybatis傳入list批量修改該怎么做

@Insert("<script>  insert into user_table (username,age,address)"+
            "  values  <foreach collection ='users' item='item' index= 'index' separator =','> " +
            "(#{item.username},#{item.age},#{item.address}) </foreach >" +
            " ON DUPLICATE KEY UPDATE  username = values(username), age = values(age) ,address = values(commaddr) </script>")
    void insert(@Param("users") List<User> users);

 有不懂的可以留言給我,希望可以幫到你!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM