【问题标题】:Java JDBC executeBatchJava JDBC 执行批处理
【发布时间】:2018-06-06 17:25:00
【问题描述】:

我正在尝试在我的数据库中执行大量 INSERT 命令。

try{
    int Records[];
    Statement title = write.getConnection().createStatement();
    Title titleFilter = application.Title.getTitle();
    ResultSet rs = titleFilter.getTitleData();

    while(rs.next()){;
        String add = ("INSERT INTO title VALUES ("
                + "'" + rs.getInt(1) + "'"+","
                + "'" +rs.getString(2)+ "'" +","
                + "'" +rs.getString(3) + "'"+","
                + "'" +rs.getInt(4)+ "'" +","
                + "'" +rs.getInt(5)+ "'" +","
                + "'" +rs.getInt(6) + "'"+","
                + "'" +rs.getString(7)+ "'" +","
                + "'" +rs.getInt(8) + "'"+","
                +"'" + rs.getInt(9)+ "'" +","
                + "'" +rs.getInt(10)+ "'" +","
                + "'" +rs.getString(11)+ "'" +","
                +"'" + rs.getString(12) + "'"+")"
        );
        title.addBatch(add);
        System.out.println(add);
        title.executeBatch();
    }

我知道在添加表达式后立即执行批处理有点愚蠢。我改变它以发现我的错误。

每次我尝试运行程序时,此代码部分只插入六个表达式。我改变了很多东西来找到我的错误,但我想我永远找不到。此外,我得到了这个异常

org.postgresql.util.PSQLException: ERROR: syntax error at or near ")"
  Position: 48
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2310)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2023)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:217)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:421)
    at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:318)....

【问题讨论】:

  • 哦,谢谢。。这里也是从 IDE 复制过来的,我的代码里没有
  • 你应该在这里使用PreparedStatement
  • 使用准备好的语句,只需在while循环中设置参数。
  • 为什么你的整数值用引号括起来? "'" + rs.getInt(#) + "'"
  • 在循环中使用addBatch + executeBatch 有什么意义?您不妨致电executeUpdate。如果要进行批处理,请将 executeBatch 移到循环之外。 --- 看在上帝的份上,使用PreparedStatement 和参数标记,以防止SQL Injection 攻击和失败的SQL 语句。

标签: java database jdbc


【解决方案1】:

首先,您应该使用PreparedStatement;这将帮助您避免语法错误(在连接 Java Strings 时很难看到)等等。其次,您在每个循环都执行批处理,这违背了使用批处理的目的。

这是一个使用 PreparedStatement 的示例:

String sql = "INSERT INTO title VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
try (PreparedStatement title = write.getConnection().prepareStatement(sql);
     ResultSet rs = titleFilter.getTitleData()) {

    while (rs.next()) {
        title.setInt(1, rs.getInt(1));
        title.setString(2, rs.getString(2));
        // ... do this for all the parameters ...

        title.addBatch(); // add to batch and move to next loop (if rs.next() returns true)
    }

    title.executeBatch(); // executed after loop

} catch (SQLException ex) {
    ex.printStackTrace(); // or do what you need to when an error occurs
}

这个例子也使用了try-with-resources

编辑:

正如 Ivan 在 cmets 中提到的,最好在每 X 条记录之后执行批处理。我将把代码留作“读者练习”。

【讨论】:

  • 根据ResultSet返回的记录数,最好在每X条记录后执行批处理。
  • 我想我用这种方式解决了这个问题...出现了另一个问题,但我想我可以自己解决它。谢谢大家:)
猜你喜欢
  • 1970-01-01
  • 2015-06-03
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多