Mysql Mybatis批量插入和批量更新数据
Mysql Mybatis批量插入和批量更新数据
- 1、之前使用的批量更新方式
- 2、本次使用的批量更新方式
- 3、对应的批量更新xml
- 4、批量插入的方法
- 5、对应的批量插入xml
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 idUNION ALLselect'bbb' as name,'bbb' as idUNION ALLselect'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.nameWHERE 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>
通过编写代码生成模版,可以自动生成对应数据库的实体类、批量新增方法、批量更新方法