10w条数据仅需2秒,浅谈MyBatis批量插入方法

您所在的位置:网站首页 foreach批量添加 10w条数据仅需2秒,浅谈MyBatis批量插入方法

10w条数据仅需2秒,浅谈MyBatis批量插入方法

2023-12-08 14:12| 来源: 网络整理| 查看: 265

“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第一篇文章,点击查看活动详情” ​

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

**再次渡入繁世,人潮汹涌,眼里茫然,信仰永恒,皆为华夏 **

目录

准备工作

1.循环单次插入

2.MP 批量插入

① 控制器实现

② 业务逻辑层实现

③ 数据持久层实现

MP 性能测试

MP 源码分析

3.原生批量插入

① 业务逻辑层扩展

② 数据持久层扩展

③ 添加 UserMapper.xml

原生批量插入性能测试

缺点分析

总结

先来简单说一下 3 种批量插入功能分别是:

循环单次插入; MP 批量插入功能; 原生批量插入功能。 准备工作

开始之前我们先来创建数据库和测试数据,执行的 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;

数据库的最终效果如下:

编辑

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; @SpringBootTest class UserControllerTest {     // 最大循环次数     private static final int MAXCOUNT = 100000;     @Autowired     private UserServiceImpl userService;     /**      * 循环单次插入      */     @Test     void save() {         long stime = System.currentTimeMillis(); // 统计开始时间         for (int i = 0; i 


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3