MySQL JDBC PreparedStatement批量插入:在出错时继续插入数据
在本文中,我们将介绍如何使用MySQL JDBC PreparedStatement批量插入数据,并在出错时继续插入剩余数据。
阅读更多:MySQL 教程
PreparedStatement批量插入数据
通常,我们使用JDBC向MySQL数据库中插入数据时,每插入一条数据都需要向数据库发起一次数据请求。这样会导致在插入大量数据时,性能较差。因此,我们可以使用PreparedStatement批量插入数据。
示例代码:
String SQL_INSERT = "INSERT INTO test_table (name, age) VALUES (?, ?)";
try (PreparedStatement ps = conn.prepareStatement(SQL_INSERT)) {
ps.setString(1, "张三");
ps.setInt(2, 25);
ps.addBatch();
ps.setString(1, "李四");
ps.setInt(2, 26);
ps.addBatch();
ps.executeBatch();
}
在上述示例代码中,我们先创建一个预编译的SQL语句,并用占位符?表示待插入的数据。然后,我们通过setXXX()方法来设置占位符的实际值,并将插入操作添加到批量操作列表中。
最后,通过executeBatch()方法执行批量操作。
继续插入数据
在使用PreparedStatement批量插入数据时,如果出现错误,程序会抛出BatchUpdateException异常,并终止批量插入操作。但是,在实际应用中,我们有时需要在出错时继续插入剩余数据。
示例代码:
String SQL_INSERT = "INSERT INTO test_table (name, age) VALUES (?, ?)";
try (PreparedStatement ps = conn.prepareStatement(SQL_INSERT)) {
ps.setString(1, "张三");
ps.setInt(2, 25);
ps.addBatch();
ps.setString(1, "李四");
ps.setInt(2, 26);
ps.addBatch();
ps.setString(1, "王五");
ps.setInt(2, 27);
ps.addBatch();
int[] result = ps.executeBatch();
int successCount = 0;
for (int i = 0; i < result.length; i++) {
if (result[i] >= 0) {
successCount++;
} else {
System.err.println("第" + (i+1) + "条数据插入失败:" + result[i]);
}
}
if (successCount < result.length) {
System.err.println("有" + (result.length - successCount) + "条数据插入失败");
}
}
在上述示例代码中,我们首先插入了3条数据,其中第3条数据会导致插入失败。然后,我们通过executeBatch()方法执行批量操作,并将每条操作的结果存储在数组result中。
接着,我们遍历数组result,对插入成功的操作计数,对插入失败的操作输出错误信息。最后,我们通过比较插入成功的操作计数和操作总数,判断是否有插入操作失败。
总结
在使用PreparedStatement批量插入数据时,我们可以通过executeBatch()方法执行批量操作,并通过BatchUpdateException异常处理插入错误。如果需要在错误时继续插入剩余数据,我们可以记录每条操作的结果,遍历结果数组并统计成功操作数。
极客教程