簡體   English   中英

如何從Oracle JDBC PreparedStatement對象獲取綁定參數的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM