⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/Crystalqy/article/details/115574709 「Crystalqy」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

MyBatis-Plus(简称MP)是一个MyBatis的增强工具,旨在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。

特点

「无侵入:」 只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑

「损耗小:」 启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作

「强大的 CRUD 操作:」 内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求

「支持 Lambda 形式调用:」 通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错

「支持主键自动生成:」 支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题

「支持 ActiveRecord 模式:」 支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作

「支持自定义全局通用操作:」 支持全局通用方法注入( Write once, use anywhere )

「内置代码生成器:」 采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用

「内置分页插件:」 基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询

「分页插件支持多种数据库:」 支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库

「内置性能分析插件:」 可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询

「内置全局拦截插件:」 提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

MP功能强大,但是上线后发现有一个问题,他内置的saveBatch批量插入功能有着巨大的隐患,查看源码发现他是这么实现的

其中关键的方法executeBatch源码为:

启动服务后,用Postman调试,后台打印如下:

从图上可以看出这个所谓的批量插入接口,其实就是一个for循环插入,所以会对数据库产生很大的压力,第一反应是手工实现,这样

INSERT INTO test (a, b, c) VALUES
<foreach collection="list" item="item" separator=",">
(#{item.a}, #{item.b}, #{item.c})
</foreach>

但是仔细阅读源码发现,他的CRUD方法其实都是实现了一个叫做AbstractMethod的类的,类继承如图

其中我们看到有一个方法是InsertBatchSomeColumn,这个方法实际上就是我们手写的那种批量插入的功能的实现了,我们现在要做的是把这个方法注入到我们的工程中,并且替换掉之前的saveBatch方法

第一步:新增我们自己的SQL注入器,用来扩展批量插入

public class CxmSqlInjector extends DefaultSqlInjector{

@Override
public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
// 防止父类的方法不可使用
List<AbstractMethod> methodList = super.getMethodList(mapperClass);
// 添加批量插入的方法
methodList.add(new InsertBatchSomeColumn());
return methodList;
}

}

第二步:把上面的类注入到Spring中

第三步:在我们的BaseDAO中声明该方法

第四步:重写saveBatch

最后再调用saveBatch的时候就会发现完成了批量插入的时候不是for 循环插入了,大功告成!!!

文章目录
  1. 1. 特点