項目用的ORM框架是用springdatajpa來作的,有些批量數據操做的話,用這個效率過低,因此用mybatis本身寫sql優化一下。mysql
通常狀況,咱們確定是先查詢,有就修改,沒有就添加,這樣的話,單個操做還好,若是是大量數據的話,每次都須要先查後改(若是用springdatajpa的話,添加以前還得查一遍),太消耗資源了。spring
那麼mysql有沒有解決的辦法呢?固然是有的,我查了一些資料,有兩種辦法,一種是使用使用replace into ,還有一種是on duplicate key update來解決,我先來演示一下這兩種辦法的區別。sql
首先建立一個表(我設置的username列惟一,用戶名不可重複)數據庫
CREATE TABLE user_table( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(10) UNIQUE KEY, address VARCHAR(10) )
添加一條數據mybatis
INSERT INTO user_table (id,username,address) VALUE (NULL,'胡俊傑','北京')
目的:先查詢數據是否存在,再修改(用一條語句實現),胡俊傑不在北京了,跑去黑龍江了框架
REPLACE INTO user_table(id,username,address) VALUE (NULL,'胡俊傑','黑龍江')
sql運行以後,顯示2行收到影響。優化
以後再觀察數據庫的數據,姓名沒變,地址變了,並且id也變了spa
說明replace into是先刪除原來的,再新增。code
這個顯然是很差的,加入有個場景,這個表的id是一個表的外鍵,那麼這樣就會形成錯誤,因此咱們引入方法2來解決。blog
方法二:
如今,把胡俊傑在安排回北京。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);
有不懂的能夠留言給我,但願能夠幫到你!!!