从 java 获取查询.sql.PreparedStatement

2022-08-31 06:39:48

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

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

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


答案 1

这在 JDBC API 协定中没有定义,但是如果幸运的话,有问题的 JDBC 驱动程序可能只需调用 即可返回完整的 SQL。即PreparedStatement#toString()

System.out.println(preparedStatement);

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

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


答案 2

您可以在设置绑定值后尝试调用预准备语句。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'

推荐