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查询数量:

相关推荐
要开心吖ZSH11 分钟前
一文搞懂:JDK 21 虚拟线程 vs N种异步方案,到底该怎么选?
java·数据库·jdk·虚拟线程
-银雾鸢尾-3 小时前
C#中的拓展方法
开发语言·c#
guodingdingh5 小时前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯7 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
GuWenyue7 小时前
Cursor黑盒拆解!1套LangChain.js手写Mini编程Agent,自动生成React项目,效率提升60%
前端·数据库·人工智能
优橙教育7 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵7 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔8 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
Miao121319 小时前
某海外住宿平台如何在大规模场景下实现指标一致性:Minerva 指标平台实践
大数据·数据库·人工智能
SeaTunnel9 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel