【问题标题】:printa a preparedStatement of an SQL query before execute [duplicate]在执行之前打印 SQL 查询的preparedStatement [重复]
【发布时间】:2020-12-28 19:29:56
【问题描述】:

我正在使用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

不知道怎么回事

【问题讨论】:

  • 使用.asSql()
  • 顺便说一句:你不能有一个?对于表名:stackoverflow.com/questions/11312155/… - 在创建准备好的语句之前必须确定表名。
  • 通常数据库允许在某种程度上记录所有查询。 ParameterMetaData meta = stmt.getParameterMetaData(); 也可能有用。
  • 您是否尝试通过普通 jdbc 执行此操作并且您需要记录此语句,或者您正在使用任何框架,如 spring jpa/hibernate。根据框架的使用情况,您可以为 sql 启用跟踪日志。
  • Oracle 与 mysql.jdbc?老实说,我不知道我在用别人的电脑

标签: java mysql jdbc prepared-statement


【解决方案1】:

...输出应该是这样的...

这就是你想要的输出。不幸的是(对你来说)toString() 方法不是由PreparedStatement 接口(@98​​7654321@)声明的。所以你似乎得到的是从Object 继承的toString() 实现的输出。

有没有办法得到扩展的SQL?

没有办法做到便携。标准的 JDBC API 不支持这个。

但是,如果您将 PreparedStatement 实例转换为:

  • com.mysql.jdbc.PreparedStatement(连接器/J 5.x),或
  • com.mysql.cj.jdbc.ClientPreparedStatement(连接器/J 8.x)

然后您可以在准备好的语句上调用asSql() 以获取扩展的 SQL。

(请注意,对于某些版本的 Connector/J 5.x,asSql() 方法被声明为 protected,因此您不能从应用程序代码中调用它。这显然已在 5.1.26 中修复。)

另外,根据我对代码的粗略阅读,看起来调用 toString() 应该可以使用 Connector/J 8.x 和 5.1.26 或更高版本。

当然,所有这些都使您的代码依赖于您正在使用的 JDBC 驱动程序。

另一种选择是在数据库服务器端记录 SQL。

【讨论】:

  • asSql() 方法不可用,显然我的问题是 jdbc 版本或类似的东西
  • 您是否先将准备好的语句转换为com.mysql.jdbc.PreparedStatement?仔细记下包名!!
  • 但是是的,可能是驱动程序版本的东西;查看我关于 5.1.26 的更新...
猜你喜欢
  • 1970-01-01
  • 2013-09-28
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
相关资源
最近更新 更多