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

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

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

我在记录错误的方法中有异常处理.我将sql语句记录为日志(log)的一部分,因为它对调试非常有帮助.我的问题是,记录字符串变量sql会记录模板语句,其中包含?'s而不是实际值.我想记录已执行(或试图执行)的actual语句.

所以有没有什么方法可以得到一个PreparedStatement位用户将运行的实际SQL语句?(Without自己构建.如果我找不到访问PreparedStatement's SQL的方法,我可能最终会在catchE中自己构建它.)

推荐答案

使用预准备语句,不存在"SQL查询":

  • 您有一条语句,其中包含占位符
    • 发送到DB服务器
    • 并在那里准备
    • 这意味着对SQL语句进行"分析"、解析,并在内存中准备一些表示它的数据 struct
  • 然后,你就有了绑定变量
    • 发送到服务器的
    • 并执行准备好的语句--处理这些数据

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

因此,无法获取预准备语句的SQL--因为没有这样的SQL.


  • 输出语句的代码、占位符和数据列表
  • 或者"手工"创建一些SQL查询.

Java相关问答推荐

如何在多个设备上同时运行Android Studio的项目?

如何使用Spring Data从MongoDB文档中包含的数组中 Select 单个元素?

JLS中形式参数列表后面的任何括号对用于确定方法结果中的精确数组类型的具体含义是什么?

当切换javaFX场景时,stage的大小正在Minimize

H2弹簧靴试验跌落台

Intellij显示项目语言级别最高为12,尽管有java版本17 SDK

使用意向过滤器从另一个应用程序启动服务

DTO到实体,反之亦然,控制器和服务之间的哪一层应该处理转换?

暂停计时器

使用Spring和ActiveMQ的侦听器方法引发属性名称不能重复为空警告

如何从JNI方法正确调用NSOpenPanel以在正确的线程上运行?

对于亚洲/香港,使用ResolverStyle.STRICT的LocalDate.parse返回意外结果

try 从REST API返回对象列表时出错

Java泛型类方法的静态返回类型是否被类型擦除?

Domino中不同的java.Protocol.handler.pkgs设置在XPages Java中导致错误

如何在Maven Central上部署?

按长度排序字符串数组

如果c不为null,Arrays.sort(T[]a,Comparator<;?super T>;c)是否会引发ClassCastException?

设置背景时缺少Android编辑文本下划线

Spring Boot Security-每个端点都被403禁止,Spring记录一个BasicErrorController#错误(HttpServlet请求)