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

項目用的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);

 有不懂的能夠留言給我,但願能夠幫到你!!!

相關文章
相關標籤/搜索