MyBatis 批量插入数据的 3 种方法!

批量插入功能是我们日常工作中比较常见的业务功能之一,今天咱们来一个 MyBatis 批量插入的汇总篇,同时对 3 种实现方法做一个性能测试,以及相应的原理分析 。
先来简单说一下 3 种批量插入功能分别是:

  1. 循环单次插入;
  2. MP 批量插入功能;
  3. 原生批量插入功能 。
准备工作开始之前我们先来创建数据库和测试数据,执行的 SQL 脚本如下:
-- ------------------------------ 创建数据库-- ----------------------------SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;DROP DATABASE IF EXISTS `testdb`;CREATE DATABASE `testdb`;USE `testdb`;-- ------------------------------ 创建 user 表-- ----------------------------DROP TABLE IF EXISTS `user`;CREATE TABLE `user`(`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,`createtime` datetime NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;-- ------------------------------ 添加测试数据-- ----------------------------INSERT INTO `user` VALUES (1, '赵云', '123456', '2021-09-10 18:11:16');INSERT INTO `user` VALUES (2, '张飞', '123456', '2021-09-10 18:11:28');INSERT INTO `user` VALUES (3, '关羽', '123456', '2021-09-10 18:11:34');INSERT INTO `user` VALUES (4, '刘备', '123456', '2021-09-10 18:11:41');INSERT INTO `user` VALUES (5, '曹操', '123456', '2021-09-10 18:12:02');SET FOREIGN_KEY_CHECKS = 1;数据库的最终效果如下:
MyBatis 批量插入数据的 3 种方法!

文章插图
 
1.循环单次插入接下来我们将使用 Spring Boot 项目,批量插入 10W 条数据来分别测试各个方法的执行时间 。
循环单次插入的(测试)核心代码如下:
import com.example.demo.model.User;import com.example.demo.service.impl.UserServiceImpl;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;@SpringBootTestclass UserControllerTest {// 最大循环次数private static final int MAXCOUNT = 100000;@Autowiredprivate UserServiceImpl userService;/*** 循环单次插入*/@Testvoid save() {long stime = System.currentTimeMillis(); // 统计开始时间for (int i = 0; i < MAXCOUNT; i++) {User user = new User();user.setName("test:" + i);user.setPassword("123456");userService.save(user);}long etime = System.currentTimeMillis(); // 统计结束时间System.out.println("执行时间:" + (etime - stime));}}运行以上程序,花费了 88574 毫秒,如下图所示:
MyBatis 批量插入数据的 3 种方法!

文章插图
 
2.MP 批量插入MP 批量插入功能核心实现类有三个:UserController(控制器)、UserServiceImpl(业务逻辑实现类)、UserMApper(数据库映射类),它们的调用流程如下:
MyBatis 批量插入数据的 3 种方法!

文章插图
 
注意此方法实现需要先添加 MP 框架,打开 pom.xml 文件添加如下内容:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>mybatis-plus-latest-version</version></dependency>
注意:mybatis-plus-latest-version 表示 MP 框架的最新版本号,可访问 https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter 查询最新版本号,但在使用的时候记得一定要将上面的 “mybatis-plus-latest-version”替换成换成具体的版本号,如 3.4.3 才能正常的引入框架 。
更多 MP 框架的介绍请移步它的官网:https://baomidou.com/guide/
① 控制器实现import com.example.demo.model.User;import com.example.demo.service.impl.UserServiceImpl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import JAVA.util.ArrayList;import java.util.List;@RestController@RequestMapping("/u")public class UserController {@Autowiredprivate UserServiceImpl userService;/*** 批量插入(自定义)*/@RequestMapping("/mysavebatch")public boolean mySaveBatch(){List<User> list = new ArrayList<>();// 待添加(用户)数据for (int i = 0; i < 1000; i++) {User user = new User();user.setName("test:"+i);user.setPassword("123456");list.add(user);}return userService.saveBatchCustom(list);}}


推荐阅读