SpringBoot开发——Spring Boot 3.3 高效批量插入万级数据的多种方案
文章目录
- 一、项目依赖配置(pom.xml)
- 二、配置文件(application.yml)
- 三、数据库表结构(user 表的DDL)
- 四、后端实现
-
- 1、使用JDBC批处理
- 2、使用自定义SQL批处理
- 3、单条插入(for循环)
- 4、拼接SQL语句插入
- 5、MyBatis-Plus的saveBatch方法
- 6、循环插入 + 开启批处理模式
- 五、完整项目实现:
-
- MyBatis-Plus 实体类
- MyBatis-Plus Mapper 接口
- Service 接口
- ServiceImpl 实现类
- InsertController 类
- 六、前端实现
- 七、启动项目并测试
- 总结
在大数据处理场景下,如何高效地将大量数据插入数据库是一个重要课题。本文基于
SpringBoot 3.3
及
MyBatis-Plus
,介绍几种高效的批量插入数据的方法,包括:
- 使用
JDBC批处理
- 使用
自定义SQL
批处理 - 单条插入(
for循环
) - 拼接
SQL语句
插入 MyBatis-Plus
的saveBatch方法
- 循环插入 + 开启批处理模式
每种方式都会结合代码示例进行深入讲解,前端将展示每种插入方式的执行时间,帮助你直观了解每种方法的性能表现。
运行效果:
一、项目依赖配置(pom.xml)
首先,在项目的pom.xml
中添加必要的依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.icoderoad</groupId>
<artifactId>batch-insert</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>batch-insert</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
<mybatis-plus-boot-starter.version>3.5.7</mybatis-plus-boot-starter.version>
<mybatis-spring.version>3.0.3</mybatis-spring.version>
</properties>
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus-boot-starter.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<!-- 数据库驱动依赖 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Thymeleaf for template rendering -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- Other dependencies -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
二、配置文件(application.yml)
在application.yml
中,配置数据库连接信息:
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
username: root
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
thymeleaf:
cache: false
三、数据库表结构(user 表的DDL)
在开始实现之前,我们需要创建一个用户表user
。下面是其DDL语句
:
CREATE TABLE user (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT NOT NULL
);
四、后端实现
1、使用JDBC批处理
原理
JDBC批处理
通过PreparedStatement
的addBatch和executeBatch
方法一次性提交多条SQL
插入操作。这种方法直接利用JDBC
的批处理机制,可以显著提高插入效率。
优点
- 高性能:
JDBC
的批处理机制可以提高性能,减少数据库交互的次数。 - 标准化:使用标准的
JDBC API
,不依赖于特定的ORM框架
。
缺点
- 需要手动管理:需要手动管理批处理的大小、事务等,代码复杂度较高。
- 资源管理:需要确保
JDBC连接
和PreparedStatement
的正确关闭,避免资源泄漏。
适用场景
适用于需要高性能插入操作的场景,特别是当需要直接控制数据库交互的细节时。
@Service
public class UserService {
@Autowired
private DataSource dataSource;
public void insertUsersWithJdbcBatch(List<User> users) {
String sql = "INSERT INTO user (name, age) VALUES (?, ?)";
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)