一尘不染

Java 如何获取PreparedStatement的SQL?

java

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

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

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

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

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


阅读 1275

收藏
2020-03-07

共1个答案

一尘不染

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

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

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

因此,没有办法获取准备好的语句的SQL,因为没有这样的SQL。

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

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