項目用的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);
有不懂的可以留言給我,希望可以幫到你!!!
