zoukankan      html  css  js  c++  java
  • mybatisplus 实现真实批量插入

    一.背景

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


    作者:cchilei

    -------------------------------------------

    个性签名:竹杖芒鞋轻胜马 一蓑烟雨任平生

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

  • 相关阅读:
    Web前端开发资源集锦
    刮刮卡效果
    html5游戏驴子跳
    Bootstrap3实现的响应式幻灯滑动效果个人作品集/博客网站模板
    40款免费社交图标素材
    移动端的推拉效果导航菜单-支持响应式及其多层菜单
    通过HTML5 Visibility API检测页面活动状态
    HTML5游戏开发引擎Pixi.js新手入门讲解
    滚动触发的翻转式文字引用效果
    11个实用的CSS学习工具
  • 原文地址:https://www.cnblogs.com/cchilei/p/15656319.html
Copyright © 2011-2022 走看看