如果我使用以下架构创建了一个表:
CREATE TABLE names (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR);
还有一个List<String> names
对于我想要添加到表中的名称,我看到有两种方法可以实现此目的。
简单、强力的解决方案是手动构建 SQL,如下所示:
String sql = "INSERT INTO names (name) VALUES ("+
Joiner.on("), (").join(names)+
");";
conn.createStatement().execute(sql);
这恰好击中数据库一次,并且看起来直观且直接。我知道存在 SQL 注入(inject)问题,但为了解决这个问题,我们假设这些问题已经得到解决。
另一种方法是使用准备好的语句,并且 JDBC docs suggest重复执行该语句,如下所示:
con.setAutoCommit(false);
PreparedStatement addNames = con.prepareStatement(
"INSERT INTO names (name) VALUES (?);");
for (String name : names) {
addNames.setString(1, name);
addNames.executeUpdate();
con.commit();
}
con.setAutoCommit(true);
执行 PreparedStatement
真的是这样吗?这样重复地比简单地构造查询字符串并直接执行更可取吗?
最佳答案
还有两个选项:
使用
PreparedStatement.addBatch()
。对于许多数据库来说,这将减少服务器往返次数。但并不适用于所有数据库(例如,不适用于 H2 数据库)。使用
PreparedStatement
,但批量处理多行:INSERT INTO names (name) VALUES (?), (?), (?), (?), (?), (?), (?), (?);
第二个应该减少所有数据库的服务器往返次数,但它有点复杂。
关于java - 多行INSERT与重复调用PreparedStatement.executeUpdate(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17985124/