gpt4 book ai didi

java - 多行插入与重复调用 PreparedStatement.executeUpdate()

转载 作者:行者123 更新时间:2023-11-30 09:19:25 28 4
gpt4 key购买 nike

如果我有一个使用以下架构创建的表:

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 - 多行插入与重复调用 PreparedStatement.executeUpdate(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17985124/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com