小编典典

如何获取PreparedStatement的SQL?

sql

我有一个带有以下方法签名的常规Java方法:

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

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

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

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


阅读 662

收藏
2021-05-05

共1个答案

小编典典

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

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

但是,无论是在Java方面还是在数据库方面,都没有重建实际的实际SQL查询的方法。

因此,由于没有这种SQL,因此无法获取准备好的语句的SQL。

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

  • 输出语句代码,占位符和数据列表
  • 或“手动”“构建”一些SQL查询。
2021-05-05