Mybatis批量插入或更新(可以不使用id)

it2022-05-05  185

今天开发的时候有个需求批量插入和更新,在网上搜了一写资料做个总结 按照传统的做法:

先查询数据库有没有对应的主键没有找到主键则新增,找到主键则修改

但是这样写有两个问题 效率太差,每次执行都要执行2个sql 高并发的情况下数据会出问题,不能保证原子性 我们可以通过 ON DUPLICATE KEY UPDATE 达到以上目的, 且能保证操作的原子性和数据的完整性。 单条数据插入和更新

//新增or更新数据 public Boolean InsertOrUpdate_Info(MyInfo info); <insert id="InsertOrUpdate_Info" parameterType="MyInfo"> insert into movieinfo (id,title,type) values (#{id},#{title},#{type}) ON DUPLICATE KEY UPDATE title = #{title},type = #{type} </insert>

多条数据插入和更新

//批量新增or更新数据 public Boolean InsertOrUpdate_List(List<MyInfo> info); <insert id="InsertOrUpdate_List" parameterType="MyInfo"> insert into UesrInfo (id,type,name) values <foreach collection ="list" item="info" separator="," > (#{info.id},#{info.type},#{info.name}) </foreach> ON DUPLICATE KEY UPDATE type = VALUES(type),name = VALUES(name) </insert>

insert 语句就不多说了,这里解释一下ON DUPLICATE KEY UPDATE title = #{title},type = #{type},大意为:如果数据库找到对应的主键id,则更新title和type这两个字段。(注意:这里要将id传进去,不传的话永远都是新增数据) 但是我们的id一般都是主键,插入的时候使用mysql自动生成,那么可以这样写

<insert id="InsertOrUpdate_List" parameterType="MyInfo"> insert into UesrInfo (type,name) values <foreach collection ="list" item="info" separator="," > (#{info.type},#{info.name}) </foreach> ON DUPLICATE KEY UPDATE type = VALUES(type),name = VALUES(name) </insert>

把id去掉, type 和 name要在数据库中建一个唯一索引


最新回复(0)