当前位置:首页 >百科 >MyBatis Plus 批量数据插入功能,yyds! 发现了一个小小的量数问题

MyBatis Plus 批量数据插入功能,yyds! 发现了一个小小的量数问题

2024-06-28 17:44:12 [百科] 来源:避面尹邢网

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

作者: 磊哥 数据库 其他数据库 本文我们使用 MyBatis-Plus(下文简称 MP)自带的入功 saveBatch 方法,来实现数据的量数批量插入功能,咱们本文重点介绍一下 MP 实现批量插入的据插具体步骤。

[[425955]]

作者 | 王磊

MyBatis Plus 批量数据插入功能,yyds! 发现了一个小小的量数问题

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

MyBatis Plus 批量数据插入功能,yyds! 发现了一个小小的量数问题

转载请联系授权(微信ID:GG_Stone

MyBatis Plus 批量数据插入功能,yyds! 发现了一个小小的量数问题

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

  1. /** 
  2.  * 插入操作 
  3.  */ 
  4. @RequestMapping("/save") 
  5. public Object save() {  
  6.     boolean flag = false; // 返回结果 
  7.     // 待添加(用户)数据 
  8.     for (int i = 0; i < 1000; i++) {  
  9.         User user = new User(); 
  10.         user.setName("test:"+i); 
  11.         user.setPassword("123456"); 
  12.         // 插入数据 
  13.         flag = userService.save(user); 
  14.         if(!flag) break; 
  15.     } 
  16.     return flag; 

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

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

批量插入实现方案

本文我们使用 MyBatis-Plus(下文简称 MP)自带的 saveBatch 方法,来实现数据的批量插入功能,因为 MP 不是本文讨论的重点,所以这里咱们就不介绍了,如果有不熟悉的朋友可以去他的官方自行恶补:https://baomidou.com/guide/,咱们本文重点介绍一下 MP 实现批量插入的具体步骤。

1.引入 MP 框架

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

  1. <dependency> 
  2.     <groupId>com.baomidou</groupId> 
  3.     <artifactId>mybatis-plus-boot-starter</artifactId> 
  4.     <version>mybatis-plus-latest-version</version> 
  5. </dependency> 

注意:mybatis-plus-latest-version 表示 MP 框架的最新版本号,可访问 https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter 查询最新版本号,但在使用的时候记得一定要将上面的 “mybatis-plus-latest-version”替换成换成具体的版本号,如 3.4.3 才能正常的引入框架。

2.创建数据库和表

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

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

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

① 实体类

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

  1. import lombok.Getter; 
  2. import lombok.Setter; 
  3.  
  4. import java.util.Date; 
  5.  
  6. @Getter 
  7. @Setter 
  8. publicclass User {  
  9.     privateint id; 
  10.     private String name; 
  11.     private String password; 
  12.     private Date createtime; 

② Controller 层代码

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

  1. import com.example.demo.model.User; 
  2. import com.example.demo.service.impl.UserServiceImpl; 
  3. import org.springframework.beans.factory.annotation.Autowired; 
  4. import org.springframework.web.bind.annotation.RequestMapping; 
  5. import org.springframework.web.bind.annotation.RestController; 
  6.  
  7. import java.util.ArrayList; 
  8. import java.util.List; 
  9.  
  10. @RestController 
  11. @RequestMapping("/u") 
  12. publicclass UserController {  
  13.  
  14.     @Autowired 
  15.     private UserServiceImpl userService; 
  16.  
  17.     /** 
  18.      * MP 批量插入 
  19.      */ 
  20.     @RequestMapping("/savebatch") 
  21.     public boolean saveBatch() {  
  22.         List<User> list = new ArrayList<>(); 
  23.         // 待添加(用户)数据 
  24.         for (int i = 0; i < 1000; i++) {  
  25.             User user = new User(); 
  26.             user.setName("test:"+i); 
  27.             user.setPassword("123456"); 
  28.             list.add(user); 
  29.         } 
  30.         // 批量插入 
  31.         return userService.saveBatch(list); 
  32.     } 

③ Service 层代码(重点)

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

  1. import com.baomidou.mybatisplus.extension.service.IService; 
  2. import com.example.demo.model.User; 
  3.  
  4. publicinterface UserService extends IService<User> {  
  5.  

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

  1. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 
  2. import com.example.demo.mapper.UserMapper; 
  3. import com.example.demo.model.User; 
  4. import com.example.demo.service.UserService; 
  5. import org.springframework.stereotype.Service; 
  6.  
  7. @Service 
  8. publicclass UserServiceImpl extends ServiceImpl<UserMapper,User> 
  9.         implements UserService {  
  10.  
  • PS:注意 UserServiceImpl 必须要继承 MP 框架中的 ServiceImpl,不然要重写很多方法。

④ Mapper 层代码

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

  1. import com.baomidou.mybatisplus.core.mapper.BaseMapper; 
  2. import com.example.demo.model.User; 
  3. import org.apache.ibatis.annotations.Mapper; 
  4.  
  5. @Mapper 
  6. publicinterface UserMapper extends BaseMapper<User>{  
  7.  
  • PS:BaseMapper 提供了对某个对象(类)最基础的 CRUD 操作。

总结

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

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

 

责任编辑:姜华 来源: Java中文社群 MyBatis Plus数据库批量插入

(责任编辑:热点)

    推荐文章
    热点阅读