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

标签 java sql jdbc prepared-statement

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

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/

相关文章:

mysql - 当搜索需要更具体时,如何在 MySQL 中使用 like 函数或在 mysql 中运行 LIKE 命令

javascript - 将SQL数据导入JS数组

java - 如何在ubuntu中连接mysql和eclipseoxy

java - 如何使用@GetMapping按id加载数据

Java ResultSet 除了 sql 之外什么也没有得到 mysql 中的结果

SQL Server : export query as a . txt 文件

java - 使用 AND 或 OR 条件手动构建 SQL 查询时出现 MySql 语法错误异常

java.sql.SQLException : No suitable driver found for jdbc:mysql://localhost/WORLD

java - 无法在初始化程序中引用静态枚举字段 Cbev2Key.log

java - "Local transaction already has 1 non-XA Resource: cannot add more resources"错误