2012-04-04 87 views
0

我使用log4j進行日誌記錄。 我可以通過Log4j看到下面的SQL。PreparedStatement Logging

這裏是我的java源代碼,它使用jdbcTemplate訪問數據庫。

public QnaDTO selectBoard(int articleID) { 
     String SQL = 
      "SELECT " + 
      " QA.ARTICLE_ID, " + 
      " QA.EMAIL, " + 
      " QA.TEL, " + 
      " QA.CATEGORY_ID, " + 
      " CG.CATEGORY_NAME, " + 
      " QA.SUBJECT, " + 
      " QA.CONTESTS, " + 
      " QA.WRITER_NAME, " + 
      " QA.WRITER_ID, " + 
      " QA.READCOUNT, " + 
      " QA.ANSWER, " + 
      " QA.FILE_NAME, " + 
      " QA.OPEN_FLG, " + 
      " QA.KTOPEN_FLG, " + 
      " TO_CHAR(QA.WRITE_DAY, 'YYYY.MM.DD') WRITE_DAY, " + 
      " QA.DISPOSAL_FLG " + 
      "FROM QNA QA JOIN QNA_CATEGORY_GROUP CG " + 
      "ON QA.CATEGORY_ID = CG.CATEGORY_ID " + 
      "WHERE QA.ARTICLE_ID = ? "; 

     QnaDTO qnaDTO = (QnaDTO) jdbcTemplate.queryForObject(
       SQL, 
       new Object[]{articleID}, 
       new RowMapper() { 
        public Object mapRow(ResultSet rs, int rowNum) throws SQLException { 
         QnaDTO qnaDTO = new QnaDTO(); 
         qnaDTO.setArticleID(rs.getInt("ARTICLE_ID")); 
         qnaDTO.setCategoryID(rs.getInt("CATEGORY_ID")); 
         qnaDTO.setCategoryName(rs.getString("CATEGORY_NAME")); 
         qnaDTO.setEmail1(rs.getString("EMAIL")); 
         qnaDTO.setTel1(rs.getString("TEL")); 
         qnaDTO.setSubject(rs.getString("SUBJECT")); 
         qnaDTO.setContests(rs.getString("CONTESTS")); 
         qnaDTO.setName(rs.getString("WRITER_NAME")); 
         qnaDTO.setUserID(rs.getString("WRITER_ID")); 
         // 
         qnaDTO.setReadcount(rs.getString("READCOUNT")); 
         qnaDTO.setAnswer(rs.getString("ANSWER")); 
         qnaDTO.setFileName(rs.getString("FILE_NAME")); 
         qnaDTO.setOpenFlg(rs.getString("OPEN_FLG")); 
         qnaDTO.setKtOpenFlg(rs.getString("KTOPEN_FLG")); 
         // 
         qnaDTO.setWriteDay(rs.getString("WRITE_DAY")); 
         qnaDTO.setDisposalFlg(rs.getString("DISPOSAL_FLG")); 
         return qnaDTO; 
        } 
       } 
      ); 
      return qnaDTO; 
    } 

正如你在上面看到的。 jdbcTemplate.queryForObject(...)是真正發送查詢並獲得一些結果的方法。

內jdbcTemplate.queryForObject,最後記錄使用

public Object query(final String sql, final ResultSetExtractor rse) 
    throws DataAccessException 
{ 
    Assert.notNull(sql, "SQL must not be null"); 
    Assert.notNull(rse, "ResultSetExtractor must not be null"); 
    if(logger.isDebugEnabled()) 
     logger.debug("Executing SQL query [" + sql + "]"); 
    class _cls1QueryStatementCallback 
     implements StatementCallback, SqlProvider 
    { 

     public Object doInStatement(Statement stmt) 
      throws SQLException 
     { 
      ResultSet rs = null; 
      Object obj; 
      try 
      { 
       rs = stmt.executeQuery(sql); 
       ResultSet rsToUse = rs; 
       if(nativeJdbcExtractor != null) 
        rsToUse = nativeJdbcExtractor.getNativeResultSet(rs); 
       obj = rse.extractData(rsToUse); 
      } 
      finally 
      { 
       JdbcUtils.closeResultSet(rs); 
      } 
      return obj; 
     } 

     public String getSql() 
     { 
      return sql; 
     } 

     _cls1QueryStatementCallback() 
     { 
      super(); 
     } 
    } 

    return execute(new _cls1QueryStatementCallback()); 
} 

但隨着上述人士透露,我只能得到SQL用? 我想要的是我的結果沒有問號 這意味着填充?與真實的數據。

有沒有辦法做到這一點? 謝謝

+0

,那麼你應該登錄,使用的toString()或其他等效方法。 – Jasonw 2012-04-04 02:10:24

+0

是的,我認爲是這樣。困難的語言 – jeon 2012-04-04 02:19:52

+0

應該不是那麼困難,用你的選擇查詢之間的幾行java代碼更新這個問題,然後我會看看。 – Jasonw 2012-04-04 02:23:29

回答

1

全對不起,忙於工作。 :-)無論如何,我已經查看了你的代碼並使用spring 2.5在這裏複製。我也谷歌,我想你想讀thisthis進一步瞭解。

從官方documentation

最後,全部由本級執行的SQL被記錄在「調試」對應的模板實例的完全限定類 名稱類別下 水平(通常是JdbcTemplate,但如果JdbcTemplate類的自定義子類使用 ,則它可能與 不同)。

因此,您需要弄清楚如何使用調試級別啓用日誌記錄。

不確定你究竟如何追蹤,但是隨着我的追蹤,我最終落在下面。所以如果你啓用了調試級別,你應該能夠看到輸出,也許不是就像QA.ARTICLE_ID = 123;,但你應該可以得到在下一行打印的值,就像那個example。無論如何,我沒有像你的環境中的確切設置,但我認爲你應該給出一個線索。

public Object execute(PreparedStatementCreator psc, PreparedStatementCallback action) 
     throws DataAccessException { 

    Assert.notNull(psc, "PreparedStatementCreator must not be null"); 
    Assert.notNull(action, "Callback object must not be null"); 
    if (logger.isDebugEnabled()) { 
     String sql = getSql(psc); 
     logger.debug("Executing prepared SQL statement" + (sql != null ? " [" + sql + "]" : "")); 
    } 
當代碼有一些填充真實數據
+0

是的,我知道如何設置DEBUG MODE。 – jeon 2012-04-05 00:18:54

+0

根據我昨天的研究,我無法從PreparedStatement實例中提取SQL。無論如何,我現在看到了填充SQL的價值。我可以這樣做,因爲我們在將它們發送到* execute *方法或類似的方法之前將它們打印出來,這要歸功於你。我感謝您的幫助!!來自韓國。 – jeon 2012-04-05 00:25:27

+0

這只是來源只看日誌。 – jeon 2012-04-05 00:37:38