如何解决在执行之前打印一个SQL查询的prepareStatement
我正在使用PreparedStatement
来构建查询,但是我想在执行完所有变量(替换'?')之后打印最终语句,显然我需要的方法是PreparedStatement#toString()
例如这样
PreparedStatement query = connection.prepareStatement(select ? from ?);
System.out.println("Before : " + query.toString());
query.setString(1,column);
query.setString(2,table);
System.out.println("After : " + query.toString());
,输出应该是这样的:
Before : com.MysqL.jdbc.JDBC4PreparedStatement@fa9cf: SELECT ** NOT SPECIFIED ** FROM ** NOT SPECIFIED **
After : com.MysqL.jdbc.JDBC4PreparedStatement@fa9cf: SELECT column FROM table
但是我得到的是
Before : com.MysqL.jdbc.JDBC4PreparedStatement@fa9cf
After : com.MysqL.jdbc.JDBC4PreparedStatement@fa9cf
我不知道怎么了
解决方法
...并且输出应该是这样的...
这就是您想要输出的内容。不幸的是(对您而言)toString()
接口(javadoc)没有声明PreparedStatement
方法。因此,您似乎得到的是从toString()
继承的Object
实现的输出。
是否可以获取扩展的SQL?
没有一种可移植的方法。标准的JDBC API不支持此功能。
但是,如果将PreparedStatement
实例强制转换为:
-
com.mysql.jdbc.PreparedStatement
(Connector / J 5.x),或 -
com.mysql.cj.jdbc.ClientPreparedStatement
(Connector / J 8.x)
然后您可以在准备好的语句上调用asSql()
以获取扩展的SQL。
(请注意,对于某些版本的Connector / J 5.x,asSql()
方法被声明为protected
,因此您不能从应用程序代码中调用它。这显然在5.1中已得到解决。 26。)
或者,从我对代码的粗读中,看来toString()
应该可以在Connector / J 8.x和5.1.26或更高版本上正常工作。
当然,所有这些使您的代码依赖于所使用的JDBC驱动程序。
另一种选择是将SQL记录在数据库服务器端。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。