从 java.sql.PreparedStatement 获取查询

新手上路,请多包涵

在我的代码中,我使用 java.sql.PreparedStatement

然后我执行 setString() 方法来填充准备好的语句的通配符。

在调用 executeQuery() 方法并执行查询之前,有没有办法让我检索(并打印出)最终查询?我只是想要这个用于调试目的。

原文由 llm 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 886
2 个回答

这在 JDBC API 契约中没有任何定义,但如果 幸运 的话,有问题的 JDBC 驱动程序可能会通过调用 PreparedStatement#toString() 返回完整的 SQL。 IE

 System.out.println(preparedStatement);

根据我的经验,目前这样做的至少是 PostgreSQL 8.x 和 MySQL 5.x JDBC 驱动程序。

如果您的 JDBC 驱动程序不支持它,您最好的选择是使用一个语句包装器,它记录对 setXxx() 方法的所有调用,并最终在 toString() 上填充一个 SQL 字符串基于记录的信息。执行此操作的现有库是 P6Spy 。同时,向您的 JDBC 驱动程序的开发团队发布增强请求,并希望他们也能实现所需的 toString() 行为。

原文由 BalusC 发布,翻译遵循 CC BY-SA 4.0 许可协议

设置绑定值后,您可以尝试在准备好的语句上调用 toString()

 PreparedStatement statement = connection.prepareStatement(aSQLStatement);
System.out.println("Before : " + statement.toString());
query.setString(1, "Hello");
query.setString(2, "World");
System.out.println("After : " + statement.toString());

这在您使用 JDBC MySQL 驱动程序时有效,但我不确定在其他情况下是否有效。您可能必须跟踪您所做的所有绑定,然后将它们打印出来。

以上代码的示例输出。

 Before : com.mysql.jdbc.JDBC4PreparedStatement@fa9cf: SELECT * FROM test WHERE blah1=** NOT SPECIFIED ** and blah2=** NOT SPECIFIED **
After : com.mysql.jdbc.JDBC4PreparedStatement@fa9cf: SELECT * FROM test WHERE blah1='Hello' and blah2='World'

原文由 Rich Adams 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题