vlambda博客
学习文章列表

MySQL+MyBatis一条命令批量插入或更新

要进行插入或更新,通常都是先查询,判断是否存在再进行插入或更新,在高并发的时候容易出现错误


表结构:


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


@Datapublic 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>