Mysql Mybatis批量插入和批量更新数据

发布于:2025-06-28 ⋅ 阅读:(20) ⋅ 点赞:(0)

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>

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


网站公告

今日签到

点亮在社区的每一天
去签到