摘要:本文介绍了MySQL与Mybatis中的批量素材操作优化技巧。对比传统的循环单条更新方式,重点展示了MySQL8.0以上使用CTE(公用表表达式)进行批量更新的高效方案,借助构建临时表完成关联更新,并提供了对应的XML配置示例。同时介绍了批量插入的实现方法,包括SQL语句写法及XML配置。作者建议每次操作控制在1000条数据以内,并分享了实际测试数据(更新10000条需25

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>

通过编写代码生成模版,可以自动生成对应数据库的实体类、批量新增方法、批量更新方法

posted @ 2025-07-27 11:12  yjbjingcha  阅读(37)  评论(0)    收藏  举报