优化mybatisPlus批量新增,新增mapper层批量新增方法,附带代码生成vm模板。

news2024/10/5 20:26:44

文章目录

  • 一、主题
  • 二、效果展示
  • 三、mybatis-plus源码分析
  • 四、优化思路
  • 五、代码优化
    • 方法一:修改批量新增SQL
    • 方法二:使用insertBatchSomeColumn 方法

一、主题

经发现,mybatisPlus只有Service中存在saveBatch()方法,而Mapper中不存在批量新增的方法,深入了解,发现mybatisPlus的Service中saveBatch()方法也是循环一条一条插入数据库。如果发现数据量较大,运行时间较长。所以文本针对mapper无批量新增和效率实现新增优化。

二、效果展示

这里使用600条数据在模拟mybatisPlus新增和优化之后的新增。看一下有什么区别
在这里插入图片描述
输出的结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到600条数据,mybatisPlus自带的批量新增使用时间8s,而通过修改SQL的方法只用了1秒。

三、mybatis-plus源码分析

通过效果图中可以看到批量新增本质上还是insert触发单个新增,这样无异于循环新增。
在这里插入图片描述

四、优化思路

上述mybatis-plus中源码中只是循环插入实现的批量新增,优化方式有以下几个思路。可能还有别的优化思路,欢迎评论区讨论发言。本文只实现思路1和3

  1. 把批量数据拼接成一个insert的SQL语句。
  2. 多线程任务去批量新增。
  3. 根据mybatis-plus预留的 insertBatchSomeColumn 方法。可能

五、代码优化

方法一:修改批量新增SQL

  1. 此方法手动给mapper新增一个批量新增方法,如效果展示的代码中goodsLabelValueService.saveBatchList(labelGoodsValueList2);

  2. Service中

    int saveBatchList(List<LabelGoodsValue> labelGoodsValueList);
    
  3. serviceImpl中

    	@Override
    	public int saveBatchList(List<LabelGoodsValue> labelGoodsValueList) {
    		return baseMapper.saveBatchList(labelGoodsValueList);
    	}
    
  4. Mapper.java中

    int saveBatchList(@Param("list") List<LabelGoodsValue> labelGoodsValueList);
    
  5. Mapper.xml中

    	<insert id="saveBatchList">
    		insert into label_goods_value
    		( id,label_id , label_name , goods_spu_id , goods_spu_name , sort , create_time , update_time , spu_code  ) values
    		<foreach item="item" index="index" collection="list" separator=",">
    			(#{item.id},#{item.labelId}, #{item.labelName}, #{item.goodsSpuId}, #{item.goodsSpuName}, #{item.sort}, #{item.createTime}, #{item.updateTime}, #{item.spuCode})
    		</foreach>
    	</insert>
    
  • 看到这里,这里提取Mapper.xml的方法,使代码生成的VM的自动生成(VM是mybatisPlus代码生成的模板)

    	<insert id="saveBatchList">
            insert into $tableName
            (#foreach($column in $columns) ${column.columnName} #if($foreach.count != $columns.size()),#end#end) values
            <foreach item="item" index="index" collection="list" separator=",">
                (#foreach($column in $columns) #{item.${column.lowerAttrName}}#if($foreach.count != $columns.size()),#end#end)
            </foreach>
        </insert>
    

方法二:使用insertBatchSomeColumn 方法

  1. 新建 Sql 注射器 BatchSqlInjector

    import com.baomidou.mybatisplus.annotation.FieldFill;
    import com.baomidou.mybatisplus.core.injector.AbstractMethod;
    import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
    import com.baomidou.mybatisplus.core.metadata.TableInfo;
    import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn;
    import java.util.List;
    
    public class BatchSqlInjector 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. MybatisPlusConfig 配置 BatchSqlInjector Bean

    import com.baomidou.mybatisplus.annotation.DbType;
    import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    @EnableTransactionManagement
    @Configuration
    public class MybatisPlusConfig {
        /**
         * 批量插入
         *
         * @return
         */
        @Bean
        public BatchSqlInjector easySqlInjector() {
            return new BatchSqlInjector();
        }
    }
    
    
    
  3. 配置 BatchBaseMapper 继承 BaseMapper

    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import java.util.Collection;
    
    public interface BatchBaseMapper<T> extends BaseMapper<T> {
        /**
         * 批量插入 仅适用于mysql
         *
         * @param entityList 实体列表
         * @return 影响行数
         */
        Integer insertBatchSomeColumn(Collection<T> entityList);
    }
    
    
  4. 业务 Mapper 继承 BatchBaseMapper

    @Repository
    public interface ISapCustomerMapper extends BatchBaseMapper<SapCustomerPO> {
    
    }
    
    
  5. service 创建 createBatch 作为新的批量插入方法

    public class SapCustomerServiceImpl extends ServiceImpl<ISapCustomerMapper, SapCustomerPO> {
    
        void createBatch(List<SapCustomerPO> entityList) {
            if(!entityList.isEmpty()){
                baseMapper.insertBatchSomeColumn(entityList);
            }
        }
    }
    
  6. 注意事项:

    1. 在使用 MyBatis-Plus 进行批量新增指定字段时,需要注意以下几点:
    2. 每次新增的数据量不要过大,建议每批次新增的数据量控制在 1000 条以内。
    3. 要新增的指定字段不能为 null,需要手动设置默认值。
    4. 如果要新增的指定字段在实体类中有对应的字段值,会被忽略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1124462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

博客后台模块续更(五)

十一、后台模块-菜单列表 菜单指的是权限菜单&#xff0c;也就是一堆权限字符串 1. 查询菜单 1.1 接口分析 需要展示菜单列表&#xff0c;不需要分页。可以针对菜单名进行模糊查询。也可以针对菜单的状态进行查询。菜单要按照父菜单id和orderNum进行排序 请求方式 请求路径…

从0开始学云计算之服务器:服务的定义,特点,应用场景,分类

服务器定义 服务器是计算机的一种。它比普通计算机运行速度更快、负载更高且价格更高。 服务器的英文名称为“Server”&#xff0c;是指在网络上提供各种服务的高性能计算机。作为网络的节点&#xff0c;存储、处理网络上80%的数据、信息&#xff0c;因此也被称为x络的灵魂。 …

三、机器学习基础知识:Python常用机器学习库(Pandas)

文章目录 1、Pandas2、Series数据结构2.1 Series的创建2.2 Series的索引与访问2.3 Series的常见操作 3、DataFrame对象3.1 DataFrame的创建与索引3.2 DataFrame的访问3.3 DataFrame的常见操作 4、数据对齐5、缺失数据处理6、Pandas存取文件 1、Pandas Pandas 库是以Numpy库为基…

互联网医院牌照|互联网医院牌照资质申请流程和所需材料

那么不同的企业基于不同的业务板块&#xff0c;所需要搭建的互联网医院也存在差异&#xff0c;平衡好自身业务及互联网医疗建设二者间的关系&#xff0c;是企业建设互医的基础需求&#xff0c;那么互联网医院牌照办理流程和材料都包含哪些呢&#xff1f;接下来就给大家介绍下。…

短视频矩阵系统软件源码

短视频矩阵系统软件源码 视频成为获得免费流量最便宜的渠道&#xff0c;平台给所有视频最基础的保底流量。如果按照一个视频最低500流量计算&#xff0c;5个账户就是2500的流量&#xff0c;200个视频就是50W流量&#xff0c;如果从其他渠道获得50W流量是个很困难的事情。短视频…

第四章 文件管理 三、文件目录

目录 一、文件控制块 1、定义&#xff1a; 2、要进行哪些操作 &#xff08;1&#xff09;搜索: &#xff08;2&#xff09;创建文件: &#xff08;3&#xff09;删除文件: &#xff08;4&#xff09;显示目录: &#xff08;5&#xff09;修改目录: 二、目录结构 1、单…

QSOP24封装的语音芯片优势列举

1. 封装紧凑&#xff1a;QSOP24封装采用了更小的封装尺寸&#xff0c;相比于其他大型封装&#xff0c;它的体积更小、尺寸更紧凑。这使得它在空间受限的应用中更加适用&#xff0c;可以方便地集成到小型或薄型设备中&#xff0c;提供更高的设计灵活性。 2. 强大的功能&#xf…

Go之流程控制大全: 细节、示例与最佳实践

引言 在计算机编程中&#xff0c;流程控制是核心的组成部分&#xff0c;它决定了程序应该如何根据给定的情况执行或决策。以下是Go语言所支持的流程控制结构的简要概览&#xff1a; 流程控制类型代码if-else条件分支if condition { } else { }for循环for initialization; con…

el-table相同的值合并单元格+多级表头

<el-table border :data"costList" :span-method"objectSpanMethod" ><el-table-column label"类别" prop"类别" width"120"> </el-table-column><el-table-column label"费用科目" prop&qu…

如何给照片添加水印?请看下面3个简单教程

如何给照片添加水印&#xff1f;随着智能手机的普及和不断提升的拍摄技术&#xff0c;如今人们可以轻松使用手机进行高质量的照片拍摄。从老人到小孩&#xff0c;每个人都可以在日常生活中捕捉到美好瞬间&#xff0c;并将其记录下来。作为一种表达自己的方式&#xff0c;现在手…

重拾潜行初心,用艾尔莎EA B760M-E D5玩转《刺客信条:幻景》

不知不觉&#xff0c;《刺客信条》系列游戏已经推出了有近20部作品。为了体现游戏的差异化&#xff0c;育碧经常会在新作上进行不同程度的玩法修改&#xff0c;然而在多部作品的变化与改动以后&#xff0c;许多玩家已经开始出现了审美疲劳&#xff0c;并怀念起了初代经典而纯粹…

2018年亚太杯APMCM数学建模大赛A题老年人平衡能力的实时训练模型求解全过程文档及程序

2018年亚太杯APMCM数学建模大赛 A题 老年人平衡能力的实时训练模型 原题再现 跌倒在老年人中很常见。跌倒可能会导致老年人出现许多并发症&#xff0c;因为他们的康复能力通常较差&#xff0c;因此副作用可能会使人衰弱&#xff0c;从而加速身体衰竭。此外&#xff0c;对跌倒…

深度分析微软未来十年在AI领域的投资机会

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;人工智能不仅仅是一个概念&#xff0c;还是一场旨在提高生产率的技术革命&#xff0c;并且有可能在未来十年让全球GDP增长10%。 &#xff08;2&#xff09;由于庞大的用户规模&…

数字化转型“黑话”知多少?一文让你不仅听得懂、还会落地执行

何为OEE&#xff1f;如何提升OEE&#xff1f; 从上图可知&#xff0c;客户是机加工行业的&#xff0c;而机加工行业属于重资产行业&#xff0c;主要以设备生产为主&#xff0c;管好设备、提升设备的综合效率&#xff08;OEE&#xff09;。效率高了&#xff0c;毛利率自然也会增…

java--三元运算符、运算符的优先级

1.三元运算符介绍 1.格式&#xff1a;条件表达式&#xff1f;值1&#xff1a;值2&#xff1b; 2.执行流程&#xff1a;首先计算关系表达式的值&#xff0c;如果值为true&#xff0c;返回值1&#xff0c;如果为false&#xff0c;返回值2 2.运算符优先级 1.在表达式中&#xf…

2016年408真题复盘

紫色标记是认为有一定的思维难度或重点总结 红色标记是这次刷真题做错的 记录自己对题目的一些想法与联系&#xff0c;可能并不太关注题目本身。 分数用时 选择部分10/23 78/8044min大题部分10/2361/7076min总分139120min 摘自知乎老哥&#xff1a;“我做历年真题时&#xff0c…

Unity中Shader的Fallback

文章目录 前言一、解决 Pass 复用的方案方案一&#xff1a;使用之前的UsePass方案&#xff0c;把ShadowCaster的Pass提出来到一个单独的Shader中&#xff0c;在使用的时候直接使用 UsePass方案二&#xff1a;使用Fallback功能 前言 Unity中Shader的Fallback&#xff0c;我们在…

g++ 重要编译参数

一. -g 产生带调试信息的可执行文件test 产生带调试信息的可执行文件test&#xff0c;如果不加-g&#xff0c;输出的test是不包含调试信息的。加了-g 才可以被GDB所调试。 g -g test.cpp -o test二. -o 优化源代码 优化指省略掉代码中从未使用过的变量&#xff0c;直接将常量…

成集云 | 云椒集成用友T | 解决方案

源系统成集云目标系统 方案介绍 云椒SAAS管理系统&#xff0c;帮助餐饮企业实现精细化管理、批量化生产、标准化出品、连锁化经营、降本增效、食安控制的全流程解决方案。该系统为团餐企业的转型和发展持续赋能&#xff0c;打造全产业链生命周期的可持续发展服务平台&#xf…

纺织工厂数字孪生3D可视化管理平台,推动纺织产业数字化转型

近年来&#xff0c;我国加快数字化发展战略部署&#xff0c;全面推进制造业数字化转型&#xff0c;促进数字经济与实体经济深度融合。以数字孪生、物联网、云计算、人工智能为代表的数字技术发挥重要作用。聚焦数字孪生智能工厂可视化平台&#xff0c;推动纺织制造业数字化转型…