Java实现JDBC向数据库批量插入
作者:境里婆娑
使用Java数据库连接(JDBC)实现批量插入可以提高数据库操作的效率,特别是在需要一次性插入多条数据时。
一、JDBC实现批量插入几种方式
使用PreparedStatement的批处理: 这是最常见的批量插入方式之一,适用于大多数数据库。你可以使用
addBatch
方法将多个插入语句添加到PreparedStatement对象中,然后使用executeBatch
执行批处理操作。这个方式在上一个回答中已经进行了详细说明。使用批处理语句: 一些数据库支持批处理语句,例如MySQL的
INSERT INTO ... VALUES (?, ?), (?, ?), ...
语法。你可以构建这样的SQL语句,一次性插入多个数据行。
String sql = "INSERT INTO your_table (column1, column2) VALUES (?, ?), (?, ?), (?, ?)"; PreparedStatement preparedStatement = connection.prepareStatement(sql); // 设置占位符的值 preparedStatement.setString(1, value1); preparedStatement.setString(2, value2); preparedStatement.setString(3, value3); preparedStatement.setString(4, value4); preparedStatement.setString(5, value5); preparedStatement.setString(6, value6); // 执行批处理 int[] batchResults = preparedStatement.executeBatch();
- 使用JDBC批处理API: JDBC 2.0引入了
java.sql.Statement
接口的批处理方法。你可以使用addBatch
方法将多个SQL语句添加到Statement
对象中,然后使用executeBatch
方法执行批处理操作。
Statement statement = connection.createStatement(); statement.addBatch("INSERT INTO your_table (column1, column2) VALUES ('value1', 'value2')"); statement.addBatch("INSERT INTO your_table (column1, column2) VALUES ('value3', 'value4')"); statement.addBatch("INSERT INTO your_table (column1, column2) VALUES ('value5', 'value6')"); int[] batchResults = statement.executeBatch();
二、PreparedStatement addBatch方法使用
PreparedStatement
的addBatch
方法用于将多个SQL语句添加到批处理中,以便一次性执行多个SQL操作。这可以显著提高数据库操作的性能,尤其是在需要插入、更新或删除多个数据行时。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class BatchInsertExample { public static void main(String[] args) { String jdbcUrl = "jdbc:mysql://localhost:3306/tbl"; String username = "root"; String password = "root"; Connection connection = null; PreparedStatement preparedStatement = null; try { // 建立数据库连接 connection = DriverManager.getConnection(jdbcUrl, username, password); // SQL插入语句,使用占位符来防止SQL注入 String sql = "INSERT INTO goods(name, price) VALUES (?, ?)"; // 创建PreparedStatement对象,并设置为批处理模式 preparedStatement = connection.prepareStatement(sql); connection.setAutoCommit(false); // 设置为手动提交 // 循环添加多个批处理操作 for (int i = 0; i < 10; i++) { // 设置占位符的值 preparedStatement.setString(1, "value" + i); preparedStatement.setString(2, "value" + (i * 2)); // 添加到批处理中 preparedStatement.addBatch(); } // 执行批处理 int[] batchResults = preparedStatement.executeBatch(); // 手动提交事务 connection.commit(); // 检查批处理执行结果 for (int result : batchResults) { if (result == PreparedStatement.SUCCESS_NO_INFO || result == PreparedStatement.EXECUTE_FAILED) { // 处理失败的情况 } } } catch (SQLException e) { e.printStackTrace(); try { // 发生异常时回滚事务 if (connection != null) { connection.rollback(); } } catch (SQLException ex) { ex.printStackTrace(); } } finally { try { // 关闭PreparedStatement和Connection if (preparedStatement != null) { preparedStatement.close(); } if (connection != null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } } }
在上述示例中,我们创建了一个PreparedStatement
对象,将多个插入操作添加到批处理中,并最后执行批处理。注意以下几点:
- 使用
setString
等方法设置占位符的值,然后使用addBatch
方法将每个操作添加到批处理中。 - 执行批处理操作后,
executeBatch
返回一个整数数组,其中包含每个批处理操作的执行结果。你可以根据需要处理失败的情况。 - 为了保持数据的一致性,我们使用
connection.setAutoCommit(false)
关闭了自动提交模式,手动提交事务,以便在所有操作成功后一起提交。 - 在异常情况下,我们使用
connection.rollback()
回滚事务,以避免数据不一致。
connection.setAutoCommit
是用于设置JDBC连接的自动提交模式的方法。在JDBC中,自动提交是指每个SQL操作是否都立即提交到数据库,或者是否需要手动调用commit
方法来提交事务。
默认情况下,JDBC连接的自动提交模式是打开的(true
)。这意味着每个SQL操作都会立即提交到数据库,形成一个独立的事务。这对于简单的操作非常方便,但在某些情况下,你可能希望将多个SQL操作组合成一个事务以确保数据的一致性。
你可以使用connection.setAutoCommit(false)
来关闭自动提交模式,这样就可以手动管理事务。一旦关闭了自动提交,你可以通过调用connection.commit()
来提交事务,将之前的SQL操作组合成一个事务。
三、Statement 和PreparedStatement 区别
Statement
和PreparedStatement
是Java JDBC(Java数据库连接)中两种执行SQL语句的方式,它们在使用和性能上有一些重要的区别。
Statement:
静态SQL语句:
Statement
用于执行静态SQL语句,这意味着SQL查询在编写代码时已经被定义好,不能包含动态参数。不安全: 由于
Statement
不支持参数化查询,因此它容易受到SQL注入攻击。如果直接将用户提供的数据拼接到SQL语句中,可能会导致安全问题。性能问题: 在需要多次执行相同的SQL语句时,
Statement
的性能通常较差。每次执行时,数据库都需要解析和编译SQL语句。代码可读性: 由于SQL语句直接嵌入在Java代码中,
Statement
的代码通常比较难读懂,维护困难。
PreparedStatement:
动态SQL语句:
PreparedStatement
用于执行动态SQL语句,它支持参数化查询。你可以使用占位符来表示参数,然后在执行之前设置这些参数的值。这使得你可以轻松地构建动态查询,根据不同的输入执行不同的查询。安全性: 由于参数化查询,
PreparedStatement
可以防止SQL注入攻击,因为参数值不会直接嵌入到SQL语句中,而是通过参数传递。性能优化:
PreparedStatement
通常比Statement
更高效,因为数据库可以缓存已编译的SQL语句,而且每次只需传递参数值,而不是重新解析和编译SQL语句。代码可读性: 使用
PreparedStatement
可以使代码更清晰和易于维护,因为SQL语句与参数值分离,降低了代码的复杂性。
综上所述,如果你需要执行动态SQL查询、提高安全性和性能,通常建议使用PreparedStatement
。Statement
适用于那些不需要参数化查询,只需要执行静态SQL语句的情况。
到此这篇关于Java实现JDBC向数据库批量插入的文章就介绍到这了,更多相关Java JDBC批量插入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!