微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在执行之前打印一个SQL查询的prepareStatement

如何解决在执行之前打印一个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 举报,一经查实,本站将立刻删除。