一、应用情景介绍


在实际的项目开发过程中,常常遇到批量保存数据的场景,当数据量比较少,比如只有几条数据的情况下,我们可以使用 for 循环来 insert 数据,但如果数据量比较多的情况下就不行,特别是并发的情况下,因为这样会增加数据库的负担。

我们通过查看 mybatis-plus 源码发现,mybatis-plusIService API 接口提供了批量插入的接口:

public interface IService<T> {....../*** 插入(批量)** @param entityList 实体对象集合*/@Transactional(rollbackFor = Exception.class)default boolean saveBatch(Collection<T> entityList) {return saveBatch(entityList, DEFAULT_BATCH_SIZE);}......

查看该批量插入的实现方法源码:

public boolean saveBatch(Collection<T> entityList, int batchSize) {String sqlStatement = sqlStatement(SqlMethod.INSERT_ONE);try (SqlSession batchSqlSession = sqlSessionBatch()) {int i = 0;// 在for循环中循环调用insertfor (T anEntityList : entityList) {batchSqlSession.insert(sqlStatement, anEntityList);if (i >= 1 && i % batchSize == 0) {batchSqlSession.flushStatements();}i++;}batchSqlSession.flushStatements();}return true;
}

从源码可以看到,所谓的批量插入就是一个 for 循环插入,很明显,这不是我们想要结果。而当我们继续阅读 mybatis-plus 的源码可以发现,在 com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn 包中已经为我们实现了真正意义上的批量插入方法,这里就不贴实现的源码了,有兴趣的可以去看看。

因此,我们需要做的就是生效该批量了插入方法,从而可以让我们通过 Mapper 来调用它。

二、实现批量插入


1、引入依赖

<!-- mybatis plus 与 springboot 整合的依赖 -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.0</version>
</dependency><!-- mybatis plus extension 包含了 mybatis plus core -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-extension</artifactId><version>3.4.0</version>
</dependency>

2、编写自定义SQL注入类

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;/*** @Description: 支持自定义SQL注入方法* @author 王廷云* @date 2021/9/8 16:58*/
public class CustomSqlInjector extends DefaultSqlInjector {@Overridepublic List<AbstractMethod> getMethodList(Class<?> mapperClass) {// 获取父类SQL注入方法列表List<AbstractMethod> methodList = super.getMethodList(mapperClass);// 将批量插入方法添加进去methodList.add(new InsertBatchSomeColumn());return methodList;}}

在这里,我们先获取默认的 SQL 注入方法列表,然后再讲批量插入方法添加进去。默认的方法列表有哪些呢,下面是我通过断点调试的截图:

可以看到,默认就是我们常用的 InsertDeleteUpdateSelectOne 等方法。

3、将该类注入到 Bean 中

@Configuration
public class MybatisPlusConfig {@Beanpublic CustomSqlInjector customSqlInjector() {return new CustomSqlInjector();}}

4、将批量插入方法扩展进 BaseMapper 中

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.Collection;/*** 自定义Mapper,添加批量插入接口*/
public interface CustomMapper<T> extends BaseMapper<T> {/*** 批量插入* @param entityList 实体列表* @return 影响行数*/Integer insertBatchSomeColumn(Collection<T> entityList);}

注意: 不要忘记在启动类 Application 中添加 @MapperScan(basePackages = "xxx.xxx") 使该 Mapper 被扫描到。

5、测试验证

1)在数据库中创建用户表

CREATE TABLE `user`(`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '主键',`name` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '姓名',`age` INT(4) NOT NULL DEFAULT 0 COMMENT '年龄',PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

2)编写实体类

@Data
@Accessors(chain = true)
@TableName("user")
public class User {@TableId(type = IdType.AUTO)private Integer id;@TableField(value = "name")private String name;@TableField(value = "age")private Integer age;}

3)编写 Mapper 接口

public interface UserMapper extends CustomMapper<User> {}

4)编写 DAO 层

@Repository
public class UserDao {@Autowiredprivate UserMapper userMapper;public void insertBatch(List<User> userList) {userMapper.insertBatchSomeColumn(userList);}}

5)编写 Service 层

@Service
public class UserService {@Autowiredprivate UserDao userDao;/*** 批量插入用户*/public void insertUserBatch() {List<User> list = new ArrayList<>();list.add(new User().setName("Andy").setAge(18));list.add(new User().setName("wang").setAge(20));userDao.insertBatch(list);}}

6)测试

当调用 UserServiceinsertUserBatch() 方法时,就会触发批量插入,查看 SQL 输出日志:

JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@2458318b] will not be managed by Spring
==>  Preparing: INSERT INTO user (name,age) VALUES (?,?) , (?,?)
==>  Parameters: Andy(String), 18(Integer), wang(String), 20(Integer)
<==  Updates: 2

可以看到,批量插入的 SQL 是真正意义上的批量插入。

注意: 查看 Mybatis-plusSQL 输出日志需要添加配置:

mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

【MyBatis-Plus】之批量插入相关推荐

  1. Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案

    Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案 参考文章: (1)Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案 (2)https://www.cnblogs. ...

  2. Java mybatis实现mysql批量插入

    记录下来方便自己,同时也希望能对比较迷惑的小盆友有所帮助 1.把批量插入的数据生成一个List集合 2.用java控制一次插入的条数和集合 // 每次插入10条int len = count, inc ...

  3. 16、mybatis动态sql 批量插入

    文章目录 1.EmployeeMapper 2.EmployeeMapper.xml(以逗号间隔执行一条语句)(推荐) 3.Test 4.以分号间隔执行每条语句(第二种方式) 5.Oracle下的批量 ...

  4. MyBatis foreach语句批量插入数据

    本例技术:Spring+SpringMVC+MyBatis+Oracle 问题描述:需要将程序里的一个集合保存到数据库里,集合的类型对应数据库的一个实体,若在程序里遍历集合再一条条保存到数据库表中有点 ...

  5. Mybatis Plus 实现批量插入

    Mybatis Plus 的 IService 接口中提供了批量插入的方法,然而,它的内部实现逻辑竟然是这样的: 居然是循环单条插入?!逗人玩嘛,好吧,自己动手,丰衣足食. 一. 添加依赖 <! ...

  6. 转:Mybatis与JDBC批量插入数据库哪个更快

    转自 http://www.cnblogs.com/fnz0/p/5713102.html, https://www.cnblogs.com/wxw7blog/p/8706797.html [转]: ...

  7. Mybatis 批量操作(批量插入、批量更新、批量删除)总结

    文章目录 一.批量插入 二.批量更新 三.批量删除 一.批量插入 <insert id="insertBatch" parameterType="java.util ...

  8. mybatis以及mybatisplus批量插入问题

    1. 思路分析: 批量插入是我们日常开放经常会使用到的场景,一般情况下我们也会有两种方案进行实施,如下所示. 方案一 就是用 for 循环循环插入: 优点:JDBC 中的 PreparedStatem ...

  9. mybatis逆向工程和批量插入

    逆向工程 导包 <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>my ...

  10. MyBatis 使用 foreach 批量插入

    yml文件 spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/ ...

最新文章

  1. 大规模数据中心如何重塑整个IT
  2. jquery ajax error函数和及其参数详细说明
  3. centos系统下安装python3以及pip3
  4. 了解.NET中的垃圾回收
  5. 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 Fishing Master
  6. 【渝粤题库】国家开放大学2021春1258房屋建筑混凝土结构设计题目
  7. python画圣诞树代码解读_实战 | 教你用Python画各种版本的圣诞树
  8. 京东金融 App 收集隐私?开源库程序员不背锅!
  9. 正在将错误信息上传至服务器,android - 将Base64编码的图像上传到服务器-400服务器错误 - 堆栈内存溢出...
  10. Kafka使用经验小结
  11. 百度地图 android 圈区域,Android 百度地图定位半径圈范围自定义
  12. Android给图片添加带半透明背景的水印
  13. opencv 4.5.5 imread 失败(报错)的处理方式
  14. java视频生成缩略图_Java中使用ffmpeg生成视频缩略图
  15. MacBook Air如何清理缓存
  16. 第八节课-深度学习软件
  17. 《管理学》课堂笔记(领导)
  18. 什么是「设计模式」?
  19. 部署blog的时候,出现了以下错误
  20. jadx工具介绍及使用

热门文章

  1. PVC塑料加速老化测试介绍
  2. 计算机数的表示数制转换视频,第一讲计算机中的数制及其转换.ppt
  3. Android 分享图片到WhatsApp,Messenger,Facebook
  4. html事件unload,jQuery之load、unload、onunload和onbeforeunload - liuyueyue
  5. 一个通用即时通讯(IM)系统的设计
  6. 学习JavaScript第一弹(上)——ECMAScript(JavaScript基础)
  7. C/C++语言实现 学生管理系统
  8. 5G网络与4G相比,有什么区别?
  9. 五大最佳开源java性能监控工具
  10. 今天题不难,写个题解吧