mybatis-plus 实现真实地批量插入

一,背景

最近mybatis-plus框架的更新,让我们基础开发中如虎添翼。其中基本的增删改查,代码生成器想必大家用着那叫一个爽。本人在使用中,也遇到一些坑。

比如savebatch,saveorupdatebatch,看着这不是批量新增,批量新增或更新嘛,看着api进行开发,感觉也太好用啦。

开发完一测试,速度跟蜗牛一样,针对大数据量真是无法忍受。在控制台上发现,怎么名义上是批量插入,还是一条一条的进行插入,难怪速度龟速。

一,解决办法

查阅网上资料,大体有两种解决方案:

  1. 使用mybatis的xml,自己进行sql语句编写。该方法一个缺点是如果表的字段较多,有个几十个字段,写批量新增,批量新增修改的sql语句真是个噩梦。

    INSERT INTO t 
      (id, age) 
    VALUES 
      (3, 28),
      (4, 29) 
    ON DUPLICATE KEY UPDATE
      id = VALUES(id),
      age = VALUES(age);
    
    
  2. mybatis-plus 新添加了一个sql注入器,通过sql注入器可以实现批量新增,批量新增修改功能。一次注入,随时使用,使用极其方便。
    缺点就是项目启动时候,会进行sql注入器注册,稍微影响启动速度。

三,添加依赖

<!--mybatis plus extension,包含了mybatis plus core-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-extension</artifactId>
    <version>3.4.3.4</version>
</dependency>

四, 继承默认方法注入

mybatis-plus-extension

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;
    }
}

五, 在 MybatisPlusConfig 配置文件中注入 Bean

@Configuration
@EnableTransactionManagement
public class MybatisPlusConfig {

    /**
     * 分页插件
     */
//    @Bean
//    public PaginationInterceptor paginationInterceptor() {
//        PaginationInterceptor page = new PaginationInterceptor();
//        page.setDialectType("mysql");
//        return new PaginationInterceptor();
//    }

    // 最新版
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

    @Bean
    public MetaObjectHandler metaObjectHandler() {
        return new MyMetaObjectHandler();
    }

    @Bean
    public GlobalConfig globalConfiguration() {
        GlobalConfig conf = new GlobalConfig();
        // 自定义的注入需要在这里进行配置
        conf.setSqlInjector(easySqlInjector());
        return conf;
    }

    @Bean
    public EasySqlInjector easySqlInjector() {
        return new EasySqlInjector();
    }

六, 扩展自带 BaseMapper

在 mapper 包下新建 EasyBaseMapper 接口,扩展自带 BaseMapper

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继承。

public interface MonitorReportRecordMapper extends EasyBaseMapper<MonitorReportRecord> {
}

service层使用。

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xinchen.admin.modules.monitoranalysis.mapper.MonitorReportRecordMapper;
import com.xinchen.api.monitoranalysis.entity.MonitorReportRecord;
import com.xinchen.api.utils.DateUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

@Service
public class MonitorReportRecordService extends ServiceImpl<MonitorReportRecordMapper, MonitorReportRecord> {

    @Transactional(rollbackFor = Exception.class)
    public void updateMonitorRecord(List<MonitorReportRecord> insertList) {
        this.baseMapper.insertBatchSomeColumn(insertList);
    }
}


原文:mybatis-plus 实现真实批量插入 - cchilei - 博客园
作者: cchilei