详解MySQL批量入库的几种方式
大家好,我们又见面了啊~本文《详解MySQL批量入库的几种方式》的内容中将会涉及到MySQL批量入库等等。如果你正在学习数据库相关知识,欢迎关注我,以后会给大家带来更多数据库相关文章,希望我们能一起进步!下面就开始本文的正式内容~
1. MySQL批量入库概述
最近压测一款mysql持久化工具,目前市面上mysql批量入库方式有很多,这里分别对常用的几种方式进行压测对比分析,比如列举了hutool工具封装的jdbc方式,jdbc直接执行与批量执行的方式,以及常用的mybatis方式。
2. Hutool封装jdbc方式
Hutool-db是一个在JDBC基础上封装的数据库操作工具类,通过包装,使用ActiveRecord思想操作数据库。在Hutool-db中,使用Entity(本质上是个Map)代替Bean来使数据库操作更加灵活,同时提供Bean和Entity的转换提供传统ORM的兼容支持。
数据库(Hutool-db):https://hutool.cn/docs/#/db/%E6%A6%82%E8%BF%B0
测试结论,hutool批量入库,数据量:10000,耗时:7.38秒,吞吐量:1357
测试环境准备
1.安装数据库,执行初始化脚本:batch-ddl.sql
-- ID、姓名、性别、年龄、Email、电话、住址。 DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID主键', `name` varchar(64) NOT NULL COMMENT '姓名', `sex` varchar(4) NOT NULL COMMENT '男,女', `age` int(3) NOT NULL COMMENT '年龄', `email` varchar(64) DEFAULT NULL COMMENT '邮箱', `phone` varchar(64) DEFAULT NULL COMMENT '电话', `address` varchar(64) DEFAULT NULL COMMENT '地址', `deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否删除 0 未删除 1 删除 默认是0', `create_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建人账号id', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '更新人账号id', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, KEY `idx_name_age` (`name`,`age`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='用户表'; select * from user; select count(*) from user;
2.创建maven项目,引入依赖:hutool-all,mysql-connector-java
cn.hutool hutool-all 5.8.10 mysql mysql-connector-java 5.1.49 org.mybatis mybatis 3.4.6
代码配置实现
1.创建配置:db.setting
## db.setting文件 url = jdbc:mysql://127.0.0.1:3306/user_db?characterEncoding=utf8 user = root pass = 123456 ## 可选配置 # 是否在日志中显示执行的SQL showSql = false # 是否格式化显示的SQL formatSql = false # 是否显示SQL参数 showParams = false # 打印SQL的日志等级,默认debug,可以是info、warn、error sqlLevel = error
2.代码实现
HutoolBatchSave
package com.zrj.maven.assembly.demo.dbutils;
import cn.hutool.core.util.IdUtil;
import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import java.sql.SQLException;
/**
* hutool批量入库
* 数据量:10000,耗时:7.38秒,吞吐量:1357
*
* @author zrj
* @since 2022/11/25
**/
public class HutoolBatchSave {
public static void main(String[] args) {
hutoolBatchSave();
}
/**
* hutool批量入库
* 1.安装数据库,执行初始化脚本:batch-ddl.sql
* 2.创建maven项目,引入依赖:hutool-all,mysql-connector-java
* 3.创建配置:db.setting
* 4.测试验证
*/
private static void hutoolBatchSave() {
int count = 10000;
Db db = Db.use();
long start = System.currentTimeMillis();
System.out.println("Hutool批量入库开始:" + start);
try {
for (int i = 0; i
3. Jdbc直接或批量执行方式
Jdbc提供两种方式,一种是直接执行,另一种是批量执行(每1000笔提交一次事务)。
Jdbc批量入库
采用JDBC直接处理,数据量:10000,耗时:7.38秒,吞吐量:1357
采用JDBC批处理,数据量:10000,耗时:7.38秒,吞吐量:1357
环境依赖参考上一策略。
JdbcBatchSave
package com.zrj.maven.assembly.demo.dbutils;
import cn.hutool.core.util.IdUtil;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* Jdbc批量入库
* 采用JDBC直接处理,数据量:10000,耗时:6.689秒,吞吐量:1494.9
* 采用JDBC批处理,数据量:10 0000,耗时:2.271秒,吞吐量:44,033
*
* @author zrj
* @since 2022/11/25
**/
public class JdbcBatchSave {
private static String url = "jdbc:mysql://localhost:3306/user_db?useServerPrepStmts=false&rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8";
private static String user = "root";
private static String password = "123456";
private static String drive = "com.mysql.jdbc.Driver";
/**
* Jdbc批量入库
* 1.安装数据库,执行初始化脚本:batch-ddl.sql
* 2.创建maven项目,引入依赖:hutool-all,mysql-connector-java
* 3.创建配置:db.setting
* 4.测试验证
*/
public static void main(String[] args) {
//jdbcBatchSaveNoExecuteBatch();
jdbcBatchSaveExecuteBatch();
}
/**
* 采用JDBC批处理(开启事务、无事务)
* 无批量提交,数据量:10 0000,耗时:2.271秒,吞吐量:44,033
*/
public static void jdbcBatchSaveExecuteBatch() {
System.out.println("采用JDBC批处理(开启事务、无事务)");
//定义连接、statement对象
Connection conn = null;
PreparedStatement pstmt = null;
try {
//1. 获取连接对象
//加载jdbc驱动
Class.forName(drive);
//连接mysql
conn = DriverManager.getConnection(url, user, password);
//将自动提交关闭
conn.setAutoCommit(true);
//2. 定义sql语句
//String sql = "insert into contract(`name`, `code`) values(?,?)";
String sql = "insert into `user_db`.`user`( `name`, `sex`, `age`, `email`, `phone`, `address`, `deleted`, `create_id`, `create_time`, `update_id`, `update_time`) " +
"VALUES (?, 'boy', 18, 'jerry@hello.com', '123456789', 'beijing', 0, 0, '2022-11-25 11:17:12', 0, '2022-11-25 11:17:12')";
//3. 为sql语句赋值
pstmt = conn.prepareStatement(sql);
long start = System.currentTimeMillis();
System.out.println("Jdbc批量入库开始:" + start);
//每次提交1000条,循环10次
int cycle = 10;//循环次数
int execute = 10000;//每次提交次数
long beginNumber = 0;//起始id
long endNumber = beginNumber + execute;//每次循环插入的数据量
for (int i = 0; i
4. MyBatis批量入库方式
MyBatis具有方便的扩展性,与业务代码解耦,动态sql等等高扩展特性,是目前使用非常广泛的orm插件,一般与spring集成,ssm项目,但是其性能缺有些场景下不如jdbc,验证参考。
MyBatis批量入库: 数据量:10000,耗时:23.951秒,吞吐量:417.5
环境依赖参考上一策略(batch-ddl.sql,引入依赖:hutool-all,mybatis,mysql-connector-java)。
创建配置:UserMapper,mybatis-config.xml,UserMapper.xml
UserMapper
package com.zrj.maven.assembly.demo.mapper;
import org.apache.ibatis.annotations.Param;
/**
* Descriptation
*
* @author zrj
* @since 2022/11/25
**/
public interface UserMapper {
void insertUser(@Param("name") String name);
}
mybatis-config.xml
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
UserMapper.xml
INSERT INTO `user_db`.`user`(`name`, `sex`, `age`, `email`, `phone`, `address`, `deleted`, `create_id`, `create_time`, `update_id`, `update_time`)
VALUES (#{name}, 'girl', 18, 'jerry@hello.com', '123456789', 'beijing', 0, 0, '2022-11-25 11:17:12', 0, '2022-11-25 11:17:12');
MyBatisBatchSave
package com.zrj.maven.assembly.demo.dbutils;
import cn.hutool.core.util.IdUtil;
import com.zrj.maven.assembly.demo.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
/**
* MyBatis批量入库
* 数据量:10000,耗时:23.951秒,吞吐量:417.5
*
* @author zrj
* @since 2022/11/25
**/
public class MyBatisBatchSave {
public static void main(String[] args) {
myBatisBatchSave();
}
/**
* MyBatis批量入库
* 1.安装数据库,执行初始化脚本:batch-ddl.sql
* 2.创建maven项目,引入依赖:hutool-all,mybatis,mysql-connector-java
* 3.创建配置:UserMapper,mybatis-config.xml,UserMapper.xml
* 4.测试验证
*/
private static void myBatisBatchSave() {
int count = 10000;
InputStream in = null;
SqlSession session = null;
try {
// 1.读取配置文件
in = Resources.getResourceAsStream("mybatis-config.xml");
// 2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
// 3.使用工厂生产SQLSession对象
session = factory.openSession(true);
// 4.使用SQLSession创建Dao接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
// 5.使用代理对象执行方法
long start = System.currentTimeMillis();
System.out.println("MyBatis批量入库开始:" + start);
for (int i = 0; i
5. MySQL批量入库总结
采用hutool批量入库, 数据量:10000, 耗时:7.38秒, 吞吐量:1357(次之)
采用JDBC直接处理, 数据量:10000, 耗时:6.689秒, 吞吐量:1494.9(其次)
采用JDBC批处理, 数据量:100000,耗时:2.271秒, 吞吐量:44033(最高)
采用MyBatis批量入库: 数据量:10000, 耗时:23.951秒, 吞吐量:417.5(最差)
理论要掌握,实操不能落!以上关于《详解MySQL批量入库的几种方式》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!
Go语言实现新春祝福二维码的生成
- 上一篇
- Go语言实现新春祝福二维码的生成
- 下一篇
- Go使用协程批量获取数据加快接口返回速度
-
- 数据库 · MySQL | 1星期前 | MySQL · 慢查询 · 索引优化 · COUNT查询 · 汇总表 · 联合索引 覆盖索引 汇总表 MySQL COUNT慢 COUNT(*)优化
- MySQL COUNT(*) 总数查询变慢怎么办:从扫描行数到汇总表的完整治理流程
- 329浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ljg-skills
- ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
- 1706次使用
-
- MELO音乐
- MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
- 1654次使用
-
- UniScribe
- UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
- 1582次使用
-
- 剧云
- 剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
- 1783次使用
-
- 万象有声
- 万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
- 1766次使用
-
- MySQL权限管理设置全攻略
- 2026-03-29 501浏览
-
- MySQL分片实现方法及常见方案解析
- 2025-06-24 501浏览
-
- MySQL表空间碎片怎么清理?超详细优化教程
- 2025-06-13 501浏览
-
- MySQL排序性能优化技巧及方法
- 2025-06-04 501浏览
-
- MySQL建库建表全流程详解
- 2025-05-24 501浏览

