MyBatis Plus 批量数据插入功能,yyds!

网友投稿 830 2023-06-04

MyBatis Plus 批量数据插入功能,yyds!

MyBatis Plus 批量数据插入功能,yyds!

作者 | 王磊

来源 | Java中文社群(ID:javacn666)

最近 Review 小伙伴代码的时候,发现了一个小小的问题,小伙伴竟然在 for 循环中进行了 insert (插入)数据库的操作,这就会导致每次循环时都会进行连接、插入、断开连接的操作,从而导致一定的性能问题,简化后代码如下:

/**  * 插入操作  */ @RequestMapping("/save") public Object save() {     boolean flag = false; // 返回结果     // 待添加(用户)数据     for (int i = 0; i < 1000; i++) {         User user = new User();         user.setName("test:"+i);         user.setPassword("123456");         // 插入数据         flag = userService.save(user);         if(!flag) break;     }     return flag; }

这样做并不会改变程序最终的执行结果,但会对程序的执行效率带来很大的影响,就好比你现在要从 A 地点送 10 件货到 B 地点,你可以选择 1 次送 1 件,送 10 次的方案;也可以选择 1 次送 10 件,送 1 次的方案,请问你会选择哪种?这就是多次循环插入和批量一次插入的问题。

PS:要插入的数据量越大,批量插入的时间(相比于循环多次插入来说)也越短、其优势也越大。

批量插入实现方案

1.引入 MP 框架

首先,打开您的 pom.xml 文件,在文件中添加以下内容:

2.创建数据库和表

此步骤可省略,主要用于本文功能的实现,创建数据库和数据表的脚本如下:

-- ---------------------------- -- 创建数据库 -- ---------------------------- SETNAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; DROPDATABASEIFEXISTS`testdb`; CREATEDATABASE`testdb`; USE`testdb`;  -- ---------------------------- -- 创建 user 表 -- ---------------------------- DROPTABLEIFEXISTS`user`; CREATETABLE`user`  (   `id`int(11) NOTNULL AUTO_INCREMENT,   `name`varchar(255) CHARACTERSET utf8mb4 COLLATE utf8mb4_bin NULLDEFAULTNULL,   `password`varchar(255) CHARACTERSET utf8mb4 COLLATE utf8mb4_bin NULLDEFAULTNULL,   `createtime` datetime NULLDEFAULTCURRENT_TIMESTAMP,   PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 6CHARACTERSET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;  -- ---------------------------- -- 添加测试数据 -- ---------------------------- INSERTINTO`user`VALUES (1, '赵云', '123456', '2021-09-10 18:11:16'); INSERTINTO`user`VALUES (2, '张飞', '123456', '2021-09-10 18:11:28'); INSERTINTO`user`VALUES (3, '关羽', '123456', '2021-09-10 18:11:34'); INSERTINTO`user`VALUES (4, '刘备', '123456', '2021-09-10 18:11:41'); INSERTINTO`user`VALUES (5, '曹操', '123456', '2021-09-10 18:12:02');  SET FOREIGN_KEY_CHECKS = 1;

3.具体代码实现(重点)

① 实体类

先来创建数据库所对应的 User 实体类:

import lombok.Getter; import lombok.Setter;  import java.util.Date;  @Getter @Setter publicclass User {     privateint id;     private String name;     private String password;     private Date createtime; }

② Controller 层代码

本文的核心是使用 MP 框架中,IService 类提供的 saveBatch 方法,来实现批量数据的插入功能,对应在 Controller 中的实现代码如下:

③ Service 层代码(重点)

接下来,我们要创建一个 UserService 接口,继承 MP 框架中的 IService 接口,实现代码如下:

然后再创建一个 UserService 的实现类:

PS:注意 UserServiceImpl 必须要继承 MP 框架中的 ServiceImpl,不然要重写很多方法。

④ Mapper 层代码

Mapper 层的实现相对来说就比较简单了,只需要创建一个 Mapper 类继承 MP 框架中的 BaseMapper 类即可,实现代码如下:

PS:BaseMapper 提供了对某个对象(类)最基础的 CRUD 操作。

总结

本文我们介绍了 MP(MyBatis Plus)中实现批量插入的具体实现步骤,它的核心是通过调用 MP 中 IService 提供的 saveBatch 方法来完成的,但如果项目中没有引入 MP 框架该如何处理?是不是使用了 MP 就可以躺平了呢?

不着急,下篇我们再聊批量插入的另一种方式(原生批量插入的实现方式),以及二者之间的优缺点分析。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:阿里面试官:MySQL是如何实现ACID的?
下一篇:盘点MySQL数据库的数据类型、库和表常见操作、索引、视图、函数等知识点
相关文章