【问题标题】:When does jdbc fill in the '?' of prepared statement written for executeBatch() [duplicate]jdbc什么时候填写'?为 executeBatch() 编写的准备好的语句 [重复]
【发布时间】:2015-12-06 11:56:24
【问题描述】:

我一直在尝试获取在 jdbc 中运行 executeBatch() 时正在执行的查询。使用executeQuery() 时,我可以使用originalSql 变量或sql(从Statement 接口实现)获得正确的查询,但是当我为executeBatch() 打印originalSql 变量时,它只打印原始 sql 作为名称本身,带有所有 ? 标记。

String insertTableSQL = "INSERT INTO Employees"
                + "(id, age, first, last) VALUES"
                + "(?,?,?,?)";
PreparedStatement preparedStatement = conn.prepareStatement(insertTableSQL);

        preparedStatement.setInt(1, 101);
        preparedStatement.setInt(2, 67);
        preparedStatement.setString(3, "niky");
        preparedStatement.setString(4, "baa");
        preparedStatement.addBatch();

        int[] rs2 = preparedStatement.executeBatch();

我也浏览了executeBatch() 的代码。但我仍然无法找到用输入值填充变量的确切位置。我被困在这几天了。

我们将不胜感激。 (如果有一些我被所有三种方法调用的方法,executeQueryexecuteBatchexecuteUpdate,它会让我的工作更轻松)

【问题讨论】:

  • 感谢您的链接,这确实解决了我正在寻找的内容。看起来我无法通过代码找到这样的方法......(我希望我之前遇到过那个线程......)

标签: java mysql jdbc


【解决方案1】:

从来没有。准备好的语句意味着首先将查询发送到数据库,没有任何参数值。然后单独发送参数。这样做是为了您可以发送许多类似的查询,而不会每次都在数据库中产生开销。

您可以在 wikipedia 上阅读有关准备好的语句的更多信息

【讨论】:

  • 谢谢,但是应该在某个地方填写这些参数值,以便运行查询并执行查询中所说的任何操作?因为对象 this 显示了整个查询,参数填充到正确的位置。我只想找到我这样做的位置?有没有办法找到那个方法?
  • @ransi 那个地方在服务器,在它收到语句和参数之后。
  • 虽然您的回答对于 JDBC 驱动程序通常是正确的,但 MySQL Connector/J 的默认设置是在执行时使用(转义的)参数值作为文字重写语句。您需要显式启用服务器端准备好的语句才能获得您描述的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多