当前位置: 首页 > article >正文

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.3MyBatis-Plus,介绍几种高效的批量插入数据的方法,包括:

  • 使用JDBC批处理
  • 使用自定义SQL批处理
  • 单条插入(for循环
  • 拼接SQL语句插入
  • MyBatis-PlussaveBatch方法
  • 循环插入 + 开启批处理模式

每种方式都会结合代码示例进行深入讲解,前端将展示每种插入方式的执行时间,帮助你直观了解每种方法的性能表现。

运行效果:
在这里插入图片描述

一、项目依赖配置(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批处理通过PreparedStatementaddBatch和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)

http://www.kler.cn/a/418364.html

相关文章:

  • [Linux] 进程间通信——匿名管道命名管道
  • Linux---对时/定时服务
  • ZYNQ详解
  • Android习题第7章广播
  • [AI] 知之AI推出3D智能宠物:助力语言学习与口语提升的新选择
  • Google Cloud Dataproc 计算 EOD 余额
  • 等保三级安全架构设计方案
  • Cent0S7 安装Redis
  • mybatis.mapper-locations=classpath:mapper/*.xml
  • 【Linux】Linux2.6内核进程调度队列与调度原理
  • 基于Java Springboot 家政服务管理系统
  • 【UE5 C++】判断两点连线是否穿过球体
  • Observability:如何在 Kubernetes pod 中轻松添加应用程序监控
  • k8s 架构详解
  • 虚拟列表遇上瀑布流布局
  • 基于Springboot开发的云野旅游平台
  • 机器学习与深度学习-2-Softmax回归从零开始实现
  • 模型 布鲁姆法则
  • 如何用一块香橙派Zero3打造你的HomeAssistant智能家居中心并实现远程管理
  • 华为机试HJ77 火车进站
  • 【docker】多阶段构建与基础构建,及企业案例展示
  • Vue 3 中实现页面特定功能控制
  • Ubuntu双系统20.04平稳升级至22.04
  • 代数拓扑学
  • 【热门主题】000073 探索云原生后端:开启高效应用开发新时代
  • 系统架构:MVVM