小编典典

如何获取 PreparedStatement 的 SQL?

all

我有一个具有以下方法签名的通用 Java 方法:

private static ResultSet runSQLResultSet(String sql, Object... queryParams)

它打开一个连接,PreparedStatement使用 sql
语句和queryParams可变长度数组中的参数构建一个连接,运行它,缓存ResultSet(in a
CachedRowSetImpl),关闭连接,并返回缓存的结果集。

我在记录错误的方法中有异常处理。我将 sql 语句记录为日志的一部分,因为它对调试非常有帮助。我的问题是记录 String
变量sql用?而不是实际值记录模板语句。我想记录已执行(或试图执行)的 实际语句。

所以…有没有办法获得将由 a 运行的实际 SQL 语句PreparedStatement?( 不用
自己构建。如果我找不到访问PreparedStatement'sSQL 的方法,我可能最终会在我的catches 中自己构建它。)


阅读 183

收藏
2022-07-31

共1个答案

小编典典

使用准备好的语句,没有“SQL 查询”:

  • 您有一个包含占位符的语句
    • 它被发送到数据库服务器
    • 并在那里准备
    • 这意味着 SQL 语句被“分析”、解析,一些表示它的数据结构在内存中准备好
  • 然后,你有绑定变量
    • 发送到服务器
    • 并执行准备好的语句——处理这些数据

但是没有重新构造实际的真实 SQL 查询——既不是在 Java 端,也不是在数据库端。

所以,没有办法得到准备好的语句的 SQL——因为没有这样的 SQL。

出于调试目的,解决方案是:

  • 输出语句代码、占位符和数据列表
  • 或者“手动”“构建”一些 SQL 查询。
2022-07-31