mybatis-plus批量插入数据
admin
2024-03-26 10:23:56

mybatis-plus批量插入数据

      • saveBatch
        • 这样会非常慢?
      • InsertBatchSomeColumn(批量插入 仅适用于mysql,一次插入多条数据)
      • ruoyi中对BaseMapperX拓展的insertBatch
      • 效率

saveBatch

将传入的实体List分为1000个一批,每个调用sqlSession.insert(sqlStatement, entity),insert完一批做一次

特点:分批插入,batchsize分为一次sql提交

1、继承ServiceImpl

public class AppAttentionServiceImpl extends ServiceImpl  implements AppAttentionService  {}

2、使用saveBatch

this.saveBatch(infoList);
this.saveBatch(infoList,1000);//每1000个拼接成一个sql进行提交

这样会非常慢?

sqlSession.flushStatements(),看起来是没有问题,但是就是速度非常慢。查阅相关资料发现,要批量执行的话,JDBC连接URL字符串中需要新增一个参数:rewriteBatchedStatements=true

MySQL的JDBC连接的url中要加rewriteBatchedStatements参数,并保证5.1.13以上版本的驱动,才能实现高性能的批量插入。
MySQL JDBC驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,批量插入实际上是单条插入,直接造成较低的性能。
只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行SQL
另外这个选项对INSERT/UPDATE/DELETE都有效

解决:

在jdbc连接url最后加上jdbc:mysql://172.29.1.100:5000/bd_cloud_vehicle_dev?rewriteBatchedStatements=true,测试发现速度果然提升

InsertBatchSomeColumn(批量插入 仅适用于mysql,一次插入多条数据)

insert into table values (x1, y1, z1), (x2, y2, z2), (x…, y…, z…);

只需要继承BaseMapper就可以有这个方法

特点:拼接成一个sql提交

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;public interface EasyBaseMapper extends BaseMapper {/*** 批量插入 仅适用于mysql* @param entityList 实体列表* @return 影响行数* 注释:这个方法自己编写就好,会有自动提示*/Integer insertBatchSomeColumn(List entityList);
}

ruoyi中对BaseMapperX拓展的insertBatch

其实就是帮我们写了个for循环,一次插入一条数据

特点:逐条插入,适合少量数据插入,或者对性能要求不高的场景

default void insertBatch(Collection entities) {entities.forEach(this::insert);
}

效率

大数据量:InsertBatchSomeColumn > saveBatch > insertBatch

相关内容

热门资讯

把音乐厅搬进喀斯特溶洞是什么体...   近日,一场融合多元艺术形式的洞穴音乐会在贵州省修文县举行,五百余名观众在喀斯特溶洞之中,感受了一...
教师专享福利!北京这些景区免票... 新京报讯 据首都教育消息,教师节将至,北京多家景区为老师们准备了专属免票福利!这份优惠合集已整理好,...
黑茶,喝的是一种境界与健康 在专门用来喝黑茶的茶具“飘逸杯”里,黑茶茶汤看起来并不像“黑茶”这个名字那样黑黢黢的一团。 玻璃器皿...
上海旅游节大巡游花车阵容抢先看... 2026上海旅游节大巡游9月12日外滩启幕,21辆全新主题花车携手21支境内外表演方队联袂登场,邀你...
原创 8... 上周门诊来了位 62 岁的张阿姨,得糖尿病快五年了,平时管嘴特别严,糖果、点心、甜饮料一概不碰,连水...