PreparedStatement日志记录

时间:2012-04-04 02:07:49

标签: log4j

我使用log4j进行日志记录。 我可以通过Log4j看到SQL,如下所示。

这是我的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(...)是真正发送Query并获取一些结果的方法。

在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获取SQL。 我想要的是我的结果没有问号 这意味着填充?有真实数据。

有没有办法做到这一点? 感谢

1 个答案:

答案 0 :(得分:1)

对不起,Jeon忙于工作。 :-)无论如何,我已经查看了你的代码,并使用spring 2.5复制到这里。我也谷歌,我想你想进一步阅读thisthis

来自官方documentation

  

最后,此类发出的所有SQL都记录在'DEBUG'中   与完全限定类对应的类别下的级别   模板实例的名称(通常是JdbcTemplate,但它可能是   如果正在使用JdbcTemplate类的自定义子类,则会有所不同   使用)。

因此,您需要弄清楚如何使用调试级别启用日志记录。

不确定你究竟是如何追踪的,但是我的追踪,我最终到了下面。因此,如果您启用调试级别,您应该能够看到输出,可能不像QA.ARTICLE_ID = 123;那样完全,但您可能应该在下一行中打印出类似于{{{ 3}}。无论如何,我没有像你的环境那样的确切设置,但我想你应该给出一个线索。

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 + "]" : ""));
    }