在我的代码中,我使用 java.sql.PreparedStatement
。
然后我执行 setString()
方法来填充准备好的语句的通配符。
在调用 executeQuery()
方法并执行查询之前,有没有办法让我检索(并打印出)最终查询?我只是想要这个用于调试目的。
原文由 llm 发布,翻译遵循 CC BY-SA 4.0 许可协议
在我的代码中,我使用 java.sql.PreparedStatement
。
然后我执行 setString()
方法来填充准备好的语句的通配符。
在调用 executeQuery()
方法并执行查询之前,有没有办法让我检索(并打印出)最终查询?我只是想要这个用于调试目的。
原文由 llm 发布,翻译遵循 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 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
这在 JDBC API 契约中没有任何定义,但如果 幸运 的话,有问题的 JDBC 驱动程序可能会通过调用
PreparedStatement#toString()
返回完整的 SQL。 IE根据我的经验,目前这样做的至少是 PostgreSQL 8.x 和 MySQL 5.x JDBC 驱动程序。
如果您的 JDBC 驱动程序不支持它,您最好的选择是使用一个语句包装器,它记录对
setXxx()
方法的所有调用,并最终在toString()
上填充一个 SQL 字符串基于记录的信息。执行此操作的现有库是 P6Spy 。同时,向您的 JDBC 驱动程序的开发团队发布增强请求,并希望他们也能实现所需的toString()
行为。