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', '李四', '男')
(我们有兴趣可以去后面的源码中打断点调试看看)
结尾
- 以上就是我本次分享给大家的一个易错点,祝大家变得更强!