[英]How to get values of bind parameters from Oracle JDBC PreparedStatement object
我想在使用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 ,它是您的數據庫驅動程序的代理,允許監視和記錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.