【RuoYi-Vue-Plus】学习笔记 22 - Mybatis-Plus(四)批量插入功能(中篇)saveBatch 实现与分析(MyBatis-Plus 源码)

2年前 (2022) 程序员胖胖胖虎阿
368 0 0

文章目录

    • 前言
    • 参考目录
    • 批量插入功能的代码实现
      • V3.X 版本使用
      • V4.X 版本使用
      • Debug & 测试结果(V4.X)
    • 批量插入功能的调用流程分析
      • ##、流程简图(重点)
      • ##、版本差异及其原因
      • V3.#2、`ServicePlusImpl#saveBatch`
      • V3.#3、`ServiceImpl#executeBatch`
      • V4.#2、`BaseMapperPlus#insertBatch`
      • #4、`SqlHelper#executeBatch`
      • #5、`SqlHelper#executeBatch`
    • 需要注意的点(下篇主要内容)

前言

承接上篇,继续聊聊批量插入功能。

其实这个功能本身不算太难,所以本文会对比一下框架 V3.5.0 以及 V4.0.1 两个版本之间的差异。

参考目录

  • MP官方文档 - Service CRUD 接口

批量插入功能的代码实现

参照官方文档:

【RuoYi-Vue-Plus】学习笔记 22 - Mybatis-Plus(四)批量插入功能(中篇)saveBatch 实现与分析(MyBatis-Plus 源码)

以框架中 TestDemo 为例。

V3.X 版本使用

  1. 实现类中继承 ServicePlusImplIServicePlus 实现类)
    【RuoYi-Vue-Plus】学习笔记 22 - Mybatis-Plus(四)批量插入功能(中篇)saveBatch 实现与分析(MyBatis-Plus 源码)
    这一步一般是框架中使用代码生成功能时就会做好,如果是自己添加的实现类也是继承相应类即可。
  2. 调用方法 service.saveBatch
    【RuoYi-Vue-Plus】学习笔记 22 - Mybatis-Plus(四)批量插入功能(中篇)saveBatch 实现与分析(MyBatis-Plus 源码)

V4.X 版本使用

  1. Mapper 继承 BaseMapperPlus
    【RuoYi-Vue-Plus】学习笔记 22 - Mybatis-Plus(四)批量插入功能(中篇)saveBatch 实现与分析(MyBatis-Plus 源码)
    这一步同样是框架中使用代码生成功能时就会做好。
  2. 调用方法 mapper.insertBatch
    【RuoYi-Vue-Plus】学习笔记 22 - Mybatis-Plus(四)批量插入功能(中篇)saveBatch 实现与分析(MyBatis-Plus 源码)

Debug & 测试结果(V4.X)

BaseMapperPlus#insertBatch
【RuoYi-Vue-Plus】学习笔记 22 - Mybatis-Plus(四)批量插入功能(中篇)saveBatch 实现与分析(MyBatis-Plus 源码)
SqlHelper#executeBatch
【RuoYi-Vue-Plus】学习笔记 22 - Mybatis-Plus(四)批量插入功能(中篇)saveBatch 实现与分析(MyBatis-Plus 源码)
可以看到控制台的输出是单条的,注意这里是一个 sqlSession 完成所有插入,并不是 1000 个sqlSession 来执行。

数据库表数据:
【RuoYi-Vue-Plus】学习笔记 22 - Mybatis-Plus(四)批量插入功能(中篇)saveBatch 实现与分析(MyBatis-Plus 源码)
至此功能测试完成。

因为底层执行流程一样,所以 V3.X 版本就不再赘述了。

批量插入功能的调用流程分析

##、流程简图(重点)

因为是不同版本对比进行说明,所以画了简图方便说明。
【RuoYi-Vue-Plus】学习笔记 22 - Mybatis-Plus(四)批量插入功能(中篇)saveBatch 实现与分析(MyBatis-Plus 源码)

##、版本差异及其原因

Service 差异:
【RuoYi-Vue-Plus】学习笔记 22 - Mybatis-Plus(四)批量插入功能(中篇)saveBatch 实现与分析(MyBatis-Plus 源码)
【RuoYi-Vue-Plus】学习笔记 22 - Mybatis-Plus(四)批量插入功能(中篇)saveBatch 实现与分析(MyBatis-Plus 源码)
差异原因:

从上面简图可以看出来,底层的调用流程并不复杂,并且底层方法都是一样的,在群里 狮子大佬 也说过:

【RuoYi-Vue-Plus】学习笔记 22 - Mybatis-Plus(四)批量插入功能(中篇)saveBatch 实现与分析(MyBatis-Plus 源码)

至于为什么不用 Service 的而要重新写到 Mapper 中,在框架更新日志中可以找到答案:

【RuoYi-Vue-Plus】学习笔记 22 - Mybatis-Plus(四)批量插入功能(中篇)saveBatch 实现与分析(MyBatis-Plus 源码)

V3.#2、ServicePlusImpl#saveBatch

【RuoYi-Vue-Plus】学习笔记 22 - Mybatis-Plus(四)批量插入功能(中篇)saveBatch 实现与分析(MyBatis-Plus 源码)

V3.#3、ServiceImpl#executeBatch

【RuoYi-Vue-Plus】学习笔记 22 - Mybatis-Plus(四)批量插入功能(中篇)saveBatch 实现与分析(MyBatis-Plus 源码)

V4.#2、BaseMapperPlus#insertBatch

【RuoYi-Vue-Plus】学习笔记 22 - Mybatis-Plus(四)批量插入功能(中篇)saveBatch 实现与分析(MyBatis-Plus 源码)
在下面的 insertBatch 方法其实和 ServiceImpl#executeBatch(V3.#3)调用的方法就是同一个了。

#4、SqlHelper#executeBatch

【RuoYi-Vue-Plus】学习笔记 22 - Mybatis-Plus(四)批量插入功能(中篇)saveBatch 实现与分析(MyBatis-Plus 源码)

#5、SqlHelper#executeBatch

【RuoYi-Vue-Plus】学习笔记 22 - Mybatis-Plus(四)批量插入功能(中篇)saveBatch 实现与分析(MyBatis-Plus 源码)
所有的流程到这里就结束了。

需要注意的点(下篇主要内容)

  1. 要使用批处理功能,需要在配置文件中(spring.datasource.dynamic.datasource.master.url)添加以下参数:rewriteBatchedStatements=true
  2. 相比起 SQL 注入器,两种插入方式哪个速度更优?

以上两点,我会放到下篇去进行说明。

相关文章

暂无评论

暂无评论...