场景:

在实际使用中发现mybaitsPlus的批量插入方法,并没有实现真正的批量插入,而是不断遍历循环插入;

问题:

如何实现真实批量插入?

解决:

1、方法一:
在数据库连接配置文件中,使用rewriteBatchedStatements=true
在这里插入图片描述
测试结果:速度确实有所提高,但是耗时仍然还是比较大

2、方法二:
直接采用手写sql的方式:

import cn.mindgd.domain.WarehouseDetail;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface WarehouseDetailMapper extends BaseMapper<WarehouseDetail> {
    @Insert("<script>" +
            "INSERT INTO warehouse_detail(warehouse_record_id,material_id,a_number,b_number)VALUES" +
            "<foreach collection='warehouseDetails' item='warehouseDetail'   separator=','> " +
            "(#{warehouseDetail.warehouseRecordId},#{warehouseDetail.materialId},#{warehouseDetail.aNumber},#{warehouseDetail.bNumber})" +
            "</foreach> " +
            "</script>")//批量建议手写sql
    boolean insertBatch(@Param("warehouseDetails") List<WarehouseDetail> warehouseDetails);
}

效率很高

3、方法三:
导入pom依赖:

   <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-extension</artifactId>
            <version>3.4.0</version>
        </dependency>

1)创建配置类:

import com.example.bootmybatisplus.injector.EasysqlInjector;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * 插件
 */
@EnableTransactionManagement
@Configuration
@MapperScan("com.baomidou.cloud.service.*.mapper*")
public class MybatisPlusConfig {

    //需要注入的Bean
    @Bean
    public EasysqlInjector easysqlInjector() {
        return new EasysqlInjector();
    }
    
}

2)创建注入器,替代mybatisPlus默认的sql规则,因为mybatisPlus要适应多种数据库,采用默认通用策略,所以mysql针对性的批量操作并没有开启;

import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn;

import java.util.List;

public class EasysqlInjector extends DefaultSqlInjector {

    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
        List<AbstractMethod> methodList = super.getMethodList(mapperClass);
        methodList.add(new InsertBatchSomeColumn());
        return methodList;
    }


}

3)创建通用mapper

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
public interface EasyBaseMapper<T> extends BaseMapper<T> {
    /**
     * 批量插入 仅适用于MysqL
     * @param entityList 实体列表
     * @return 影响行数
     */
    Integer insertBatchSomeColumn(List<T> entityList);
}

我们自定的mapper类以前是继承BaseMapper,而现在要继承EasyBaseMapper ;如下:
在这里插入图片描述
对应service写法:
在这里插入图片描述
在这里插入图片描述
测试结果:10万数据速度提高了5倍之多;

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐