在 Java 中将 SQL 查询从 PreparedStatement 打印到控制台

Posted

技术标签:

【中文标题】在 Java 中将 SQL 查询从 PreparedStatement 打印到控制台【英文标题】:Print SQL query from PreparedStatement to console in Java 【发布时间】:2015-12-22 10:33:13 【问题描述】:

我正在使用PreparedStatements

当我尝试使用stmt.toString(); 打印查询时,它会在控制台打印以下内容,

com.zaxxer.hikari.proxy.PreparedStatementJavassistProxy

如何打印我的查询?

【问题讨论】:

检查这个:***.com/questions/34412289/… ***.com/questions/2683214/… 【参考方案1】:

我有一个类似但不相同的问题;我将在此处发布我的解决方案,以防对其他人有用:

当我做System.out.println(stmt.toString()); 时,我会得到:

“HikariProxyPreparedStatement@172796470 包装 com.mysql.jdbc.JDBC42PreparedStatement@268fac52: SELECT . . . (此处查询的其余部分)”

但经过一些实验后,我将其更改为

System.out.println(stmt.unwrap(com.mysql.jdbc.JDBC42PreparedStatement.class).asSql());

现在我得到了查询。 unwrap() 方法返回底层的 JDBC PreparedStatement。

【讨论】:

【参考方案2】:

一般来说,PreparedStatement 的 toString() 行为是特定于实现的:Get query from java.sql.PreparedStatement

看起来你所拥有的实际上是 HikariCP 的预准备语句缓存的一部分,它包装了 JDBC 驱动程序自己的 PreparedStatement。要从中取出字符串,您需要访问底层 PreparedStatement 并希望您使用的是支持此功能的驱动程序之一。 (我无法确定这是否可行,看起来 HikariCP 的这个区域已经被大幅重构:github)

【讨论】:

以上是关于在 Java 中将 SQL 查询从 PreparedStatement 打印到控制台的主要内容,如果未能解决你的问题,请参考以下文章

如何从用java编写的查询中将虚线字符串传递给oracle

无法在 Android 中将 java 字符串转换为 JSON 数组

mysql prepare疑问

Android Multimedia框架总结MediaPlayer中从Java层到C++层类关系及prepare及之后其他过程

如何从 SQL Server 2014 中的 Select 查询中将数据分配给用户定义的表类型

在 Android 中将 MySql 查询转换为 SQL Room 查询 - kotlin