MySQL+MyBatis一条命令批量插入或更新
要进行插入或更新,通常都是先查询,判断是否存在再进行插入或更新,在高并发的时候容易出现错误
表结构:
以下sql语句可以实现存在就更新,不存在则插入
INSERT INTO test (user_name,age,num,class)
VALUES
( 'tom',12,10,'class a'),
( 'may',13,100,'class b')
ON
DUPLICATE KEY
UPDATE num= VALUES(num),class= VALUES(class)
这句语句的意思是,插入的数据假如跟唯一键冲突就改为更新,“test”表设置“user_name”和“age”为组合唯一键,假如插入的数据同时跟这两个字段的数据冲突就执行更新操作,那么更新哪些字段呢?就是这句:
UPDATE num= VALUES(num),class= VALUES(class)
冲突的话就更新"num"和“class”字段
表本来是空的,可以看到,数据已经插入
唯一键“user_name”和age字段值不变,修改其他字段值再执行一次
INSERT INTO test (user_name,age,num,class)
VALUES
( 'tom',12,101,'class a1'),
( 'may',13,102,'class b1')
ON
DUPLICATE KEY
UPDATE num= VALUES(num),class= VALUES(class)
可以看到数据被更新了
MyBatis写法:
void insetOrUpdate(@Param("list") List<TestDto> list);
public class TestDto {
private String userName;
private Integer age;
private Integer num;
private String className;
}
<insert id="insetOrUpdate">
INSERT INTO test (user_name,age,num,class)
VALUES
<foreach collection ="list" item="testDto" index= "index" separator =",">
(
#{testDto.userName}, #{testDto.age}, #{testDto.num}, #{testDto.className}
)
</foreach >
ON
DUPLICATE KEY
UPDATE num= VALUES(num),class= VALUES(class)
</insert>