我想在使用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()但到目前为止找不到存储绑定参数值及其类型的位置。
有什么建议在哪找?
答案 0 :(得分:2)
大多数日志记录框架都有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;
}
答案 1 :(得分:1)
您可以查看p6spy,它是您的数据库驱动程序的代理,允许监控和记录。