🎉🎉《Spring Boot实战案例合集》目前已更新179个案例,我们将持续不断的更新。文末有电子书目录。
💪💪永久更新承诺
我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务。
💌💌如何获取
订阅我们的合集《点我订阅》,并通过私信联系我们,我们将第一时间将电子书发送给您。
环境:SpringBoot3.4.2
1. 简介
批量操作是提升数据处理效率的关键手段。传统的逐条插入(如循环执行 INSERT)存在大量网络往返和事务开销,性能极低。为优化数据导入与写入性能,需采用批量插入技术,通过减少 SQL 解析、降低事务提交频率、充分利用数据库批处理机制等方式显著提升吞吐量。常见场景包括日志入库、数据迁移和批量导入等。
你写的代码看似批量插入,但若未正确配置 JDBC 参数等相关配置,那么SQL 语句仍会被逐条发送执行。看似“批量”,实则“单条循环”,实际没有任何的性能提升。
本文将基于 MySQL,探讨多种批量插入的优化策略,涵盖JPA、JDBC 批处理、多值 INSERT、LOAD DATA INFILE 等核心方法,并结合实际性能对比,帮助开发者选择最优方案,实现高效稳定的数据写入。如下图,最终性能对比:
准备环境
引入JPA依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency>
配置文件
spring:datasource:driverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/dddusername: rootpassword: xxxoootype: com.zaxxer.hikari.HikariDataSource---spring:jpa:properties:hibernate:'[format_sql]': false
以上述内容作为初始环境,后续我们都将基于此配置来演示并调优每一种批量insert操作。
为了查看真实SQL执行情况,我们还需要确保MySQL开启了如下配置:
开启通过日志功能,这样任何DDL/DML/DCL等语句都会记录在该日志文件中。
准备操作类
(name = "t_person")public class Person {private Long id ;private String name ;private Integer age ;private String email ;}public interface PersonRepository extends JpaRepository<Person, Long> {}// serviceprivate final PersonRepository personRepository ;public void batchSave(List<Person> list) {// 具体实现方案}
准备单元测试类
public class PersonServiceTest {private PersonService ps;private List<Person> datas = new ArrayList<>();// 执行单元测试前执行数据生成,20w数据。public void init() {for (long i = 1; i <= 200_000; i++) {datas.add(new Person(i, "姓名 - " + i, new Random().nextInt(100), i + "@qq.com"));}}public void testBatchSave() {long start = System.currentTimeMillis();this.ps.batchSave(datas);System.err.println("耗时:" + (System.currentTimeMillis() - start));}}
接下来,我们将基于此环境进行5种方式的批量操作测试。


