前言

写这篇文章主要是替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', '李四', '男')

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

结尾

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

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐