如果我有一个使用以下架构创建的表:
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 注入问题,但为了这个问题,让我们假设这些问题已经得到解决。
另一种方法是使用准备好的语句,并且JDBC 文档建议重复执行该语句,如下所示:
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);
像这样重复执行 a 真的PreparedStatement
比简单地构造查询字符串并直接执行更可取吗?