Mysql Mybatis批量插入和批量更新数据
1、之前使用的批量更新方式
以前批量更新数据时,都是使用updateById一条一条 for循环更新,或者使用mybatis xml拼接多条update执行,如下面的sql,然后需要在jdbcurl中配置可以执行多条sql
update sys_user set name = 'aaa' where id = 'aaa';
update sys_user set name = 'bbb' where id = 'bbb';
update sys_user set name = 'ccc' where id = 'ccc';
2、本次使用的批量更新方式
mysql8.0以上支持CTE,使用CTE可以构建一个临时表出来我们可以将要更新的数据构建一个临时表,然后通过临时表和要更新的表关联进行更新,如下SQL,此方式只能指定字段更新或者全量更新,注意每次更新的数据不要太多,比如1000行就可以,自己测试过更新10000条数据需要25秒,因为数据库服务器不在本地,对性能影响较大。
with tmp1 as(
select
'aaa' as name,
'aaa' as id
UNION ALL
select
'bbb' as name,
'bbb' as id
UNION ALL
select
'ccc' as name,
'ccc' as id
)
update sys_user,tmp1 set
sys_user.name = tmp1.name
where sys_user.id = tmp1.id
3、对应的批量更新xml
<update id="updateBatchHandle">
WITH tmp1 AS (
<foreach collection="list" item="item" separator=" UNION ALL ">
SELECT
#{item.name} AS name,
#{item.id} AS id
</foreach>
)
UPDATE sys_user, tmp1
SET
sys_user.name= tmp1.name
WHERE
sys_user.id = tmp1.id
</update>
4、批量插入的方法
注意每次更新的数据不要太多,比如1000行就可以,自己测试过插入10000条数据需要10秒,因为数据库服务器不在本地,对性能影响较大。
insert into sys_user(id,name)
values
('aaa','aaa'),
('bbb','bbb'),
('ccc','ccc')
5、对应的批量插入xml
<insert id="insertBatchHandle">
INSERT INTO sys_user (id,name)
VALUES
<foreach collection ="list" item="item" separator =",">
(#{item.id},#{item.name})
</foreach>
</insert>
通过编写代码生成模版,可以自动生成对应数据库的实体类、批量新增方法、批量更新方法