jdbc批量插入数据到MySQL

批量插入数据是指一次性插入多条记录到数据库中,这可以提高数据插入的效率。

前提条件

  1. 已经安装了MySQL数据库。
  2. 已经创建了数据库和表。
  3. 已经添加了MySQL JDBC驱动到项目的路径中。

如果没有添加jdbc可以参考:jdbc连接mysql(5种方式,循序渐进!!!)-CSDN博客

示例数据库和表

假设我们有一个名为t1的数据库,其中有一个名为users的表,结构如下:

sql 复制代码
CREATE TABLE t1 (
    id INT ,
    name VARCHAR(50)
);

Java代码示例

以下是一个Java程序,展示如何使用JDBC批量插入数据到t1表:

**注意:**一定要配置配置rewriteBatchedStatements参数

mysql.properties文件内容:

java 复制代码
user=root
password=root
url=jdbc:mysql://localhost:3306/mydb?rewriteBatchedStatements=true
driver=com.mysql.cj.jdbc.Driver

优化点

  • 使用addBatch()缓存SQL,executeBatch()批量提交。
  • 分批次处理(如每500条提交一次)。
java 复制代码
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;
public class TestMysql {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;

        try {
            // 1. 加载配置文件
            Properties properties = new Properties();
            properties.load(new FileInputStream("src/mysql.properties"));
            String url = properties.getProperty("url");
            String user = properties.getProperty("user");  // 修正参数名更规范
            String password = properties.getProperty("password");
            String driver = properties.getProperty("driver");

            // 2. 注册驱动并获取连接
            Class.forName(driver);
            connection = DriverManager.getConnection(url, user, password);

            // 3. 关闭自动提交,开启事务
            connection.setAutoCommit(false);

            // 4. 准备SQL语句(建议常量用大写)
            String sql = "INSERT INTO t1 (id, name) VALUES (?, ?)";  // 明确字段名
            preparedStatement = connection.prepareStatement(sql);

            // 5. 批量插入50万条数据
            int batchSize = 500;
            long start = System.currentTimeMillis();
            for (int i = 0; i < 500000; i++) {
                preparedStatement.setInt(1, i + 1);  // 参数索引从1开始
                preparedStatement.setString(2, "张三");
                preparedStatement.addBatch();

                // 每500条提交一次(注意i从0开始,需+1判断)
                if ((i + 1) % batchSize == 0) {  // 修正条件判断
                    preparedStatement.executeBatch();
                    preparedStatement.clearBatch();
                }
            }

            // 6. 提交剩余未满batchSize的数据
            preparedStatement.executeBatch();

            // 7. 手动提交事务
            connection.commit();
            long end = System.currentTimeMillis();
            System.out.println("插入50万数据花费时间:"+(end-start));

        } catch (ClassNotFoundException | IOException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            // 8. 异常回滚事务
            try {
                if (connection != null) {
                    connection.rollback();
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            try {
                if (preparedStatement != null) {
                    preparedStatement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

结果如下:(用了4秒左右)

在navicat查询数量:

相关推荐
偶尔贪玩的骑士18 分钟前
Kioptrix Level 1渗透测试
linux·开发语言·网络安全·php
小咕聊编程24 分钟前
【含文档+PPT+源码】基于spring boot的固定资产管理系统
java·spring boot·后端
roykingw25 分钟前
【终极面试集锦】如何设计微服务熔断体系?
java·微服务·面试
我命由我1234526 分钟前
Spring Cloud - Spring Cloud 微服务概述 (微服务的产生与特点、微服务的优缺点、微服务设计原则、微服务架构的核心组件)
java·运维·spring·spring cloud·微服务·架构·java-ee
胖头鱼的鱼缸(尹海文)28 分钟前
数据库管理-第376期 Oracle AI DB 23.26新特性一览(20251016)
数据库·人工智能·oracle
それども29 分钟前
忽略Lombok构建警告
java·开发语言·jvm
麦聪聊数据29 分钟前
浅谈SQL审核(一):SQL审核实现方式与常见工具的选择
数据库·sql
用户685453759776936 分钟前
🎮 Java设计模式:从青铜到王者的代码修炼手册
java·后端
ajassi200036 分钟前
开源 Linux 服务器与中间件(七)数据库--MySQL
linux·服务器·数据库·ubuntu·开源
马尚道1 小时前
Java高手速成--吃透源码+手写组件+定制开发教程
java