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

Posted 法式小奶包

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>


以上是关于MySQL+MyBatis一条命令批量插入或更新的主要内容,如果未能解决你的问题,请参考以下文章

mybatis+mysql批量插入和批量更新

MySQLのmybatis批量插入数据

Mybatis 插入一条或批量插入 返回带有自增长主键记录

mybatis批量插入,批量更新 com.mysql.jdbc.exceptions.MySQLSyntaxErrorException

MyBatis动态批量插入更新Mysql数据库的通用实现方案

Mybatis批量插入或更新的正确姿势