批量插入功能是我们日常工作中比较常见的业务功能之一,今天咱们来一个 MyBatis 批量插入的汇总篇,同时对 3 种实现方法做一个性能测试,以及相应的原理分析 。
先来简单说一下 3 种批量插入功能分别是:
- 循环单次插入;
- MP 批量插入功能;
- 原生批量插入功能 。
-- ------------------------------ 创建数据库-- ----------------------------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;
数据库的最终效果如下:文章插图
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 毫秒,如下图所示:文章插图
2.MP 批量插入MP 批量插入功能核心实现类有三个:UserController(控制器)、UserServiceImpl(业务逻辑实现类)、UserMApper(数据库映射类),它们的调用流程如下:
文章插图
注意此方法实现需要先添加 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);}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Office|3千块的正版Office U盘“从天而降” N多老外贪便宜:插入电脑后中毒
- 腾讯|马化腾喊话收紧开支!腾讯:我们要加大插入广告力度了
- 自动驾驶|历史性一步!中国首批前装量产自动驾驶重卡批量交付
- 一键批量把联系人号码添加导入WhatsApp通讯录
- Python五行代码实现一键批量抠图
- 聊聊Mybatis的binding模块
- 安卓|iPhone 14尝鲜!苹果对iOS 16等系统/软件调整 欲大量插入广告
- 豚鼠|总有女生自称是“豚鼠”,将仙女管插入食道,为何会让人上瘾?
- 挑战书不用买,掌握新方法,轻松获取深渊邀请函 DNF挑战书如何批量换邀请函
- 100级挑战书活了?攻坚商店邀请函删除,拍卖行将大涨 DNF挑战书如何批量换邀请函