当前位置: 首页 > news >正文

mybatis-plus原生的批量插入

前言

写这篇文章主要是替mybatis-plus辟谣一下,之前听很多小伙伴说它不支持批量插入,确实,service里的saveBatch的底层逻辑还是一条一条的foreach插入,但是我们用它baseMapper中的insert即可实现批量插入

探索

tips:不熟悉的小伙伴还是推荐去官网了解一下:MyBatis-Plus 🚀 为简化开发而生

  • 先说结论:直接用baseMapper的insert方法即可实现批量插入,即下面
baseMapper.insert(list);

重点:但是要确保插入的字段都有值,或者说如果该值为NULL,也要显示的写出来,不要忽略

  • 源码分析:我的版本是3.5.10.1,大家其实很容易就能通过上面的baseMapper.insert(list)方法点到下面的源码里面
  • 疑惑分析:这段源码其实不复杂,相信小伙伴都能看懂,这段逻辑就是正儿八经的批量插入逻辑,但是为什么运行起来就分批次了呢,或者最差的情况变成一条一条的插入了呢,问题其实都在后面进行拼接SQL语句的代码逻辑中,拼接出来的插入语句不同,所以不能放到一个插入批次里
  • 一个注解:

    FieldStrategy.DEFAULT:遵循全局配置的策略。如果全局配置未指定,默认行为是仅在字段值不为 NULL 时插入该字段。

    有聪明的小伙伴应该想到了,当我们插入一个批次的数据时,如果这个批次的数据里面有的字段为NULL,有的字段不为NULL,那拼接出来的插入语句是不是都是大部分的都是不一样的,那我们执行批量插入是不是就被拆成了小批次插入,或者最坏的情况是一条一条插入了呢

  • 小小例子:我有一张表t_user,有3个字段id,name,gender,我插入两条语句,如下图        大家可能注意到了,3个字段中,第一条数据我没有赋值gender,第二条语句则全部赋值了,mybatis-plus帮我们拼接出来的语句会成为这样

  • INSERT INTO t_user(id, name) VALUES ('123', '张三');
    INSERT INTO t_user(id, name, gender) VALUES ('456', '李四', '男');

        就是因为上面的注解策略,默认的就是NULL值会忽略,如果我们把策略改为这个的话

  • FieldStrategy.ALWAYS:总是插入该字段,无论字段值是否为 NULL。

        执行出来的语句就会真正的批量插入语句了,如下:

  • INSERT INTO t_user (id, name, gender) VALUES ('123', '张三', NULL), ( '456', '李四', '男');

        mybatis-plus打印出来的插入日志如下:

  • batching 2 statements: 1: INSERT INTO t_user (id, name, gender) VALUES ('123', '张三', NULL) 2: INSERT INTO t_user ( id, name, gender ) VALUES ( '456', '李四', '男')

(我们有兴趣可以去后面的源码中打断点调试看看)

结尾

  •  以上就是我本次分享给大家的一个易错点,祝大家变得更强!

文章转载自:

http://ob3MDqtz.ptxwg.cn
http://DjBbJ2Wk.ptxwg.cn
http://OmQ5tNKL.ptxwg.cn
http://FqCmVvov.ptxwg.cn
http://hyvoqhRz.ptxwg.cn
http://teE7l29c.ptxwg.cn
http://YdmLU2Uh.ptxwg.cn
http://tdEqfPRo.ptxwg.cn
http://0oJCkX90.ptxwg.cn
http://O8q7TUkJ.ptxwg.cn
http://yMoW6MRW.ptxwg.cn
http://0z6sLbrg.ptxwg.cn
http://pBjczF4C.ptxwg.cn
http://7DLVMHVW.ptxwg.cn
http://jgTpThdv.ptxwg.cn
http://iip6wSxi.ptxwg.cn
http://88gRRx8Z.ptxwg.cn
http://a1Xx9ZtQ.ptxwg.cn
http://OA38FaKu.ptxwg.cn
http://xGQ4l2Ci.ptxwg.cn
http://afEFkaw9.ptxwg.cn
http://SwScfEUV.ptxwg.cn
http://Yk5WaXmW.ptxwg.cn
http://1VNBkZRW.ptxwg.cn
http://qhUbbCw5.ptxwg.cn
http://x07fa4G9.ptxwg.cn
http://IKRH8Faz.ptxwg.cn
http://Bdc1Ammv.ptxwg.cn
http://QvGqDjps.ptxwg.cn
http://DVqw4xWf.ptxwg.cn
http://www.dtcms.com/a/373998.html

相关文章:

  • 设计模式 概述
  • SQL 注入与防御-第九章:平台层防御
  • SCADA与DCS深度集成实践:打破工厂“信息孤岛”,让实时控制更智能
  • 小学挫折教育主题班会PPT课件模板下载
  • 深入理解 MyBatis-Plus 的 `BaseMapper`
  • YOLOv8 TensorRT C++部署实战详解:从XMake构建到推理流水线
  • HTML HTML基础(3)
  • 几何动点问题
  • C++从字符串中移除前导零
  • PPP PRIVATE NETWORK™ 2 企业级虚拟以太网接入综合解决方案介绍
  • 《会“偷听”的石头:声流石的震撼发现》
  • 线程的控制(互斥+同步)
  • SpringBoot中添加健康检查服务
  • Android 开发 - 一些画板第三方库(DrawBoard、FingerPaintView、PaletteLib)
  • Skopeo 工具介绍与 CentOS 7 安装指南
  • 面向对象设计原则(未完)
  • Python数据挖掘实战:从理论到工具
  • Highcharts 数据源安全最佳实践:保障数据安全,助力可视化可信部署
  • 网易有道-虚拟人口语教练
  • git config user.name “xxx“命名报错fatal: not in a git directory
  • 【Flask】测试平台开发,工具模块开发 第二十二篇
  • 【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
  • 2025最新超详细FreeRTOS入门教程:第七章 FreeRTOS事件组
  • 【nest.js】创建一个上传api
  • C语言内存精讲系列(八):深化详述 int 3
  • 蓓韵安禧DHA为孕期安全营养补充提供科学支持,呵护母婴健康
  • 什么是状态(State)以及如何在React中管理状态?
  • Anaconda与Jupyter 安装和使用
  • 房屋安全鉴定需要什么条件
  • 全国产压力传感器选型指南/选型手册