1.需求及解决方案:
需求:批量插库,如果数据存在则进行更新,如果数据不存在则进行插入
示例:
<insert id="batchUpdate" parameterType="java.util.List">
insert into tb_list
(col1,col2,col3,col4)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.col1},
#{item.col2},
#{item.col3},
#{item.col4})
</foreach>
ON DUPLICATE KEY UPDATE
col1= values(col1)
</insert>
效果:更新1983条数据使用时间在2秒之内,包括数据的对比
2020-12-13 01:42:58.654 [http-nio-8100-exec-2] INFO com...
2020-12-13 01:43:01.848 [http-nio-8100-exec-2] DEBUG c.m.d.d.u.TbQrcQrcWhiteListMapper.batchUpdate - ==> Preparing: insert into ...
2020-12-13 01:43:02.553 [http-nio-8100-exec-2] DEBUG c.m.d.d.u.TbQrcQrcWhiteListMapper.batchUpdate - <== Updates: 1983
2.replace into和insert into区别
replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中,
1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。
2. 否则,直接插入新数据。
要注意的是:插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据
3.ON DUPLICATE KEY UPDATE
1:ON DUPLICATE KEY UPDATE需要有在INSERT语句中有存在主键或者唯一索引的列,并且对应的数据已经在表中才会执行更新操作。而且如果要更新的字段是主键或者唯一索引,不能和表中已有的数据重复,否则插入更新都失败。
2:不管是更新还是增加语句都不允许将主键或者唯一索引的对应字段的数据变成表中已经存在的数据