MySQL JDBC PreparedStatement Batch 继续插入错误数据
在本文中,我们将介绍如何在使用MySQL JDBC PreparedStatement batch插入多行数据时,遇到错误数据时怎样继续插入剩余的正确数据。
阅读更多:MySQL 教程
PreparedStatement batch 插入多行数据
PreparedStatement 是 JDBC 中的核心接口之一,用于预编译 SQL 语句并保存到数据库服务器上执行。PreparedStatement 可以减少编译和执行 SQL 语句的时间,提高了数据库执行大量重复 SQL 语句的效率。而 batch 就是批量的意思,在 PreparedStatement 中可以使用 addBatch() 和 executeBatch() 方法实现批量插入多行数据。
示例代码如下:
String insertSql = "INSERT INTO student(name, age, gender) VALUES (?, ?, ?)";
try (Connection conn = DriverManager.getConnection(url, username, password)) {
conn.setAutoCommit(false);
PreparedStatement pstmt = conn.prepareStatement(insertSql);
for (int i = 1; i <= 1000; i++) {
pstmt.setString(1, "student" + i);
pstmt.setInt(2, 18);
pstmt.setString(3, "male");
pstmt.addBatch();
if (i % 100 == 0) {
int[] results = pstmt.executeBatch();
conn.commit();
}
}
int[] results = pstmt.executeBatch();
conn.commit();
}
上面的示例代码中,我们使用PreparedStatement实现了批量插入1000条学生记录,每100条记录就向数据库提交一次事务。这样可以提高插入数据的效率,减轻数据库服务器的压力。
PreparedStatement batch 继续插入错误数据
但是,当我们插入的数据中存在错误数据时,就会抛出 SQLException 异常,导致整个批量插入操作失败。而这时,如果我们希望能够跳过错误数据,继续插入正确的数据,该怎么办呢?
答案是使用 PreparedStatement batch 的另一个重载方法:executeBatch(int[] updateCounts)。它的作用是执行批量 SQL 语句,其中 updateCounts 数组包含每条 SQL 语句执行的结果,包括更新记录的数量和错误码等信息。如果 SQL 语句执行成功,那么该语句对应的 updateCounts 值为非负数;如果执行失败,那么该语句对应的 updateCounts 值为负数,其绝对值为错误码。
示例代码如下:
String insertSql = "INSERT INTO student(name, age, gender) VALUES (?, ?, ?)";
try (Connection conn = DriverManager.getConnection(url, username, password)) {
conn.setAutoCommit(false);
PreparedStatement pstmt = conn.prepareStatement(insertSql);
for (int i = 1; i <= 1000; i++) {
pstmt.setString(1, "student" + i);
pstmt.setInt(2, 18);
pstmt.setString(3, "male");
pstmt.addBatch();
if (i % 100 == 0) {
int[] results = pstmt.executeBatch();
processBatchResult(results, conn);
}
}
int[] results = pstmt.executeBatch();
processBatchResult(results, conn);
}
private static void processBatchResult(int[] results, Connection conn) throws SQLException {
int successCount = 0;
int failureCount = 0;
for (int i = 0; i < results.length; i++) {
if (results[i] >= 0) {
successCount++;
} else {
failureCount++;
System.err.println("插入数据失败,错误码:" + results[i]);
}
}
System.out.println("本次批量插入数据成功:" + successCount + " 条,失败:" + failureCount + " 条");
conn.commit();
}
上面的示例代码中,我们在插入每100条学生记录后,执行一次 PreparedStatement 批量插入。在 processBatchResult() 方法中,我们遍历了结果数组,将插入成功的记录数与失败的记录数分别计数,并输出了插入失败的错误码。我们还手动提交事务,保证插入成功的数据被持久化到数据库中。
通过这种方式,即使出现错误数据,我们也可以继续插入剩余的正确数据,提高了数据的插入效率和可靠性。
总结
本文介绍了如何在MySQL JDBC PreparedStatement batch插入多行数据时,遇到错误数据时怎样继续插入剩余的正确数据。通过使用 PreparedStatement 的 executeBatch(int[] updateCounts) 方法,我们可以通过 updateCounts 数组获取每行记录的插入情况,从而跳过错误数据,继续插入正确数据。这种技巧可以提高数据库的操作效率和可靠性,减轻数据库服务器的压力,使得数据插入更加稳定和可靠。