如何从Oracle JDBC PreparedStatement对象获取绑定参数的值

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

例如,我创建了PreparedStatement并绑定了一个参数

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

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

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

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

要得到

 SELECT * FROM employees WHERE employe_id = ? 

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

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

有什么建议在哪找?

大多数日志记录框架都具有嵌套诊断上下文的概念。 填写准备好的语句时,可以将查询及其参数保存在那里。

或者,或许,一步到位:

 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; } 

您可以查看p6spy ,它是您的数据库驱动程序的代理,允许监视和记录。