当前位置: 首页 > 面试题库 >

Java 如何获取PreparedStatement的SQL?

黄宏毅
2023-03-14
问题内容

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

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

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

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

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


问题答案:

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

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

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

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

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

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


 类似资料:
  • 问题内容: 我有一个带有以下方法签名的常规Java方法: 它打开一个连接,使用sql语句和可变长度数组中的参数构建一个,运行它,缓存(在中),关闭连接,然后返回缓存的结果集。 我在记录错误的方法中有异常处理。我将sql语句记录为日志的一部分,因为它对调试非常有帮助。我的问题是,记录String变量会记录带有?而不是实际值的模板语句。我想记录已执行(或尝试执行)的 实际 语句。 所以…有什么方法可以

  • 问题内容: 我正在为SQLException编写通用记录器,我想获取传递给PreparedStatement的参数,该怎么做?我能够得到他们的数量。 问题答案: 简短的回答:不能。 长答案:所有JDBC驱动程序都会将参数值保留在某个地方,但是没有标准的方法来获取它们。 如果要出于调试或类似目的而打印它们,则有几种选择: 创建一个传递JDBC驱动程序(使用p6spy或log4jdbc作为基础),该驱

  • 问题内容: 我正在尝试连接到数据库,运行查询并打印出查询。到目前为止,我已经完成了工作,但是我需要获取输出并将其中的特定部分分配给 我正在使用log4jdbc监视我的查询。 此刻,我得到如下记录的输出: 我想分配给。我该怎么做呢? 问题答案: 通常,a 将为您提供查询(包括绑定参数)。但这取决于的实际实现(例如,使用PostgreSQL隐式实现)。 您提到为您带来回报。我对 log4jdbc 并不

  • 本文向大家介绍Java如何获取Log4j,包括了Java如何获取Log4j的使用技巧和注意事项,需要的朋友参考一下 示例 当前版本(log4j2) 使用Maven: 将以下依赖项添加到POM.xml文件中: 使用常春藤: 使用Gradle: 获取log4j 1.x 注意: Log4j 1.x已达到寿命终止(EOL)(请参阅备注)。 使用Maven: 在POM.xml文件中声明此依赖项: 使用常春藤

  • 我使用的是Spring的(Spring版本4.1.4)。对于我的类“JdbcTemplate”实例,我正在将select查询作为一个准备好的语句。但是,我的查询意外地没有返回任何结果。因此,我确实需要调试我的查询,并确保查询是我期望的。 如何取回作为< code>JdbcTemplate的内部< code>PreparedStatement的一部分对数据库执行的实际SQL? 我熟悉使用预制语句的

  • 问题内容: 我在网上看到的解决方案很有意义;如果知道变量的类型,那么就知道其值的类型。Java就是这样。但是,如果我有这样的继承类系统… 并以这种方式创建对象… 有没有一种方法可以获取FirstPQ 的 类型 ,以便可以在强制转换中使用它,以便可以访问类的独占方法?也许与此类似? 问题答案: 您有几种选择。 您可以使用反射 你可以用 您可以使用访客模式 对于这些示例,我们将尝试查找此变量的类型: