温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java如何批量插入SQL

发布时间:2026-10-10 17:49:08 来源:亿速云 阅读:88 作者:小樊 栏目:编程语言

在 Java 中“批量插入 SQL”通常指 一次向数据库插入多条数据,而不是一条一条执行 INSERT,以提升性能。常见做法有以下几种:


一、使用 JDBC 的 addBatch() + executeBatch()(最基础、最通用)

示例代码

String sql = "INSERT INTO user(name, age) VALUES (?, ?)";

try (Connection conn = dataSource.getConnection();
     PreparedStatement ps = conn.prepareStatement(sql)) {

    conn.setAutoCommit(false); // 关闭自动提交

    for (User user : userList) {
        ps.setString(1, user.getName());
        ps.setInt(2, user.getAge());
        ps.addBatch(); // 添加到批处理
    }

    ps.executeBatch(); // 批量执行
    conn.commit();     // 提交事务
}

优点

  • 不依赖框架
  • 性能明显优于单条插入
  • 几乎所有数据库都支持

注意

  • rewriteBatchedStatements=true(MySQL 很重要)
jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true

二、MyBatis 批量插入

方式 1:foreach 拼接 SQL(简单,但 SQL 长度有限)

<insert id="batchInsert">
  INSERT INTO user(name, age) VALUES
  <foreach collection="list" item="u" separator=",">
    (#{u.name}, #{u.age})
  </foreach>
</insert>
mapper.batchInsert(userList);

⚠️ 数据量很大时可能超出 SQL 长度限制


方式 2:MyBatis + 手动批处理(推荐)

try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH, false)) {
    UserMapper mapper = session.getMapper(UserMapper.class);
    for (User u : userList) {
        mapper.insert(u);
    }
    session.commit();
}

三、Spring JdbcTemplate 批量插入

String sql = "INSERT INTO user(name, age) VALUES (?, ?)";

jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
    @Override
    public void setValues(PreparedStatement ps, int i) throws SQLException {
        ps.setString(1, userList.get(i).getName());
        ps.setInt(2, userList.get(i).getAge());
    }

    @Override
    public int getBatchSize() {
        return userList.size();
    }
});

四、JPA / Hibernate 批量插入

entityManager.unwrap(Session.class)
    .setJdbcBatchSize(50);

for (int i = 0; i < list.size(); i++) {
    entityManager.persist(list.get(i));
    if (i % 50 == 0) {
        entityManager.flush();
        entityManager.clear();
    }
}

五、性能建议(非常重要)

✅ 关闭自动提交
✅ 每批 500~1000 条
✅ MySQL 加 rewriteBatchedStatements=true
✅ 大批量用文件导入(LOAD DATA / COPY)更快


六、如果是“超大数据量”

  • MySQL:LOAD DATA INFILE
  • PostgreSQL:COPY
  • Oracle:SQL*Loader

如果你能告诉我:

  • 用的什么数据库(MySQL / Oracle / PG)
  • 是否使用框架(MyBatis / JPA / 原生 JDBC)
  • 数据量大概多少

我可以给你最合适的批量插入方案。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手