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);

 有不懂的能够留言给我,但愿能够帮到你!!!

相关文章
相关标签/搜索