mybatis-plus批量插入数据

saveBatch

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

特点:分批插入,batchsize分为一次sql提交
如果有10000条数据,batchSize为1000,则分为10次事务提交,每个事务提交1000条insert语句

1、继承ServiceImpl

public class AppAttentionServiceImpl extends ServiceImpl<AttentionMapper,AttentionDO>  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最后加上rewriteBatchedStatements=true,测试发现速度果然提升

jdbc:mysql://172.29.1.100:5000/bd_cloud_vehicle_dev?rewriteBatchedStatements=true

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

最后会拼接为如下sql: insert into table values (x1, y1, z1), (x2, y2, z2), (x…, y…, z…);

特点:拼接成一个sql提交

开启方式:需要我们配合SQL注入器来开启,分为三个步骤:

1、自定义SQL注入器

新建一个名为InsertBatchSqlInjector 的类,继承DefaultSqlInjector,,添加InsertBatchSomeColumn方法(当然,类名可以根据自己的喜好来)

public class MySqlInjector extends DefaultSqlInjector {

    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
        List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);
        methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));
        return methodList;
    }
}

2、将SQL注入器交给Spring容器

在MybatisPlusConfig类中,将刚才创建的SQL注入器InsertBatchSqlInjector 注册为一个bean。

@Configuration
public class MybatisPlusConfig {

    @Bean
    public MySqlInjector sqlInjector() {
        return new MySqlInjector();
    }
}

3、编写自定义MyBaseMapper继承BaseMapper,并编写insertBatchSomeColumn()方法

新建MyBaseMapper类,继承BaseMapper,并在此类中配置insertBatchSomeColumn()方法。

public interface MyBaseMapper<T> extends BaseMapper<T> {
    /**
     * 以下定义的 4个 method 其中 3 个是内置的选装件
     */
    int insertBatchSomeColumn(List<T> entityList);
}

4、需要批量插入的Mapper继承自定义MyBaseMapper

@Mapper
public interface StudentMapper extends MyBaseMapper<Student> {

    @SelectProvider(value = MySelectProvider.class, method = "getSql")
    Student select(String sql);
}

5、调用insertBatchSomeColumn()方法

ruoyi中对BaseMapperX拓展的insertBatch

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

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

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

效率

大数据量:InsertBatchSomeColumn > saveBatch > insertBatch

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MybatisPlus是一个基于Mybatis的增强工具库,在Mybatis的基础上加入了许多实用的增强功能,其中就包括批量插入。 通过MybatisPlus实现批量插入,可以通过以下步骤实现: 1. 创建一个List对象,用于存储要批量插入数据。 2. 在实体类中使用注解@TableId(value = "id", type = IdType.AUTO)来指定主键生成策略。 3. 在Mapper接口中定义一个批量插入的方法,方法参数类型为List,使用注解@Param来指定参数名称。 4. 在Mapper映射文件中,使用foreach标签遍历List集合中的数据,将数据插入到数据库中。 举例来说,假设我们要批量插入学生信息,代码实现如下: 1. 创建一个List对象: List<Student> list = new ArrayList<>(); 2. 在实体类中使用注解@TableId指定主键生成策略: @TableId(value = "id", type = IdType.AUTO) public class Student { private Long id; ... } 3. 在Mapper接口中定义批量插入的方法: void insertBatch(@Param("list") List<Student> list); 4. 在Mapper映射文件中,使用foreach标签遍历List集合中的数据: <insert id="insertBatch" parameterType="java.util.List"> insert into student(id, name, age, gender) values <foreach collection="list" item="item" separator=","> (#{item.id}, #{item.name}, #{item.age},#{item.gender}) </foreach> </insert> 通过以上步骤,就可以轻松地实现MybatisPlus批量插入。值得注意的是,在使用批量插入时,需要考虑数据库中的主键是否重复,需要根据具体情况选择不同的主键生成策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞得更高肥尾沙鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值