java - 如何从 Oracle JDBC PreparedStatement 对象获取绑定(bind)参数的值

标签 java oracle jdbc

我想在使用 Oracle JDBC 时使用实际绑定(bind)参数实现所有已执行语句的日志记录。而且我更希望我可以创建这样的日志记录方法,只将 PreparedStatement 对象作为参数传递。

例如我创建了 PreparedStatement 并绑定(bind)了一个参数

PreparedStatement ps = conn.prepareStatement(
    "SELECT * FROM employees WHERE employee_id = ?");
ps.setInt(1,1);

现在我希望能够从 ps 中获取我可以放入日志文件中的实际 SQL 语句“SELECT * FROM employees WHERE employee_id = 1”。

到目前为止我发现我可以使用

((oracle.jdbc.driver.OracleStatement) ps).getOriginalSql()

得到

SELECT * FROM employees WHERE employe_id = ?

现在我需要一些方法从 ps 获取当前绑定(bind)变量的列表,以便我可以替换 ?具有绑定(bind)参数值。

我试图查看 ps.getClass().getDeclaredFields() 和 ps.getClass().getSuperclass().getDeclaredFields() 但到目前为止找不到存储绑定(bind)参数值及其类型的位置。

对在哪里寻找它们有什么建议吗?

最佳答案

大多数日志框架都有 Nested Diagnostic Context 的概念.填写准备好的语句时,您可以将查询及其参数保存在那里。

或者,也许,一步完成:

PreparedStatement fillAndLog(Connection conn, String query, Object... args) {
    int i = 0;
    PreparedStatement pstmt = conn.prepareStatement(query);
    for (Object o : args) {
       if (o instanceof String) {
           pstmt.setString(i, (String)o);
       } // else...
       i++;
    }
    log.debug(String.format(query.replaceAll("\\?", "%s"), args));
    return pstmt;
}

关于java - 如何从 Oracle JDBC PreparedStatement 对象获取绑定(bind)参数的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1130886/

相关文章:

java - intellij scala java.lang.classnotfoundException oracle.jdbc.driver.oracledriver

java - 逐行读取文本文件的最佳方法,获取每一行并将其放入代码中

java - 在常量池 : 19 中获取无效的字节标记

sql - 我应该添加主键列作为 Oracle RDBMS 中索引的最后一列吗?

oracle - 我未使用的 LOB 字段上的 ora 22992

oracle - 解决ORA-4031 “unable to allocate x bytes of shared memory”

java - 如何在没有powermock的情况下模拟静态方法

java - 我应该使用 Exception 来模拟 java 中的 goto 语句吗?

java - Java 8 中删除了 JDBC-ODBC 桥,最好的替代方案是什么?

java - 用户 'root' @'localhost' 的访问被拒绝(使用密码 : YES )