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>

四.繼承默認方法注入

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM