Log4j 预处理语句日志记录

Log4j 预处理语句日志记录,log4j,Log4j,我使用log4j进行日志记录。 我可以通过Log4j看到SQLs,如下所示 这是我的java源代码,它使用jdbcTemplate访问数据库 public QnaDTO selectBoard(int articleID) { String SQL = "SELECT " + " QA.ARTICLE_ID, " + " QA.EMAIL, " + " QA.TEL, "

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

这是我的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;
    }
正如你在上面看到的。 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?。 我想要的是我的结果没有问号 这意味着填充?用真实的数据

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

Jeon,对不起,我正忙着工作。:-)无论如何,我已经研究了您的代码,并在这里使用Spring2.5进行了复制。我也用谷歌搜索过,我想你想阅读并进一步理解

从官方

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

因此,您需要了解如何启用调试级别的日志记录

我不知道你到底是怎么追踪的,但有了我的追踪,我就到了下面。因此,如果启用调试级别,您应该能够看到输出,可能不是像
QA.ARTICLE\u ID=123那样的确切地但您可能会在下一行中打印类似的值。无论如何,我没有像你的环境那样的精确设置,但我认为你应该给出一个线索

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

当代码填充了一些真实数据时,您应该使用toString()或任何等效方法记录这些数据。是的,我认为是这样。难语言应该不会那么难,在您选择的查询之间用几行java代码更新这个问题,然后我会看一看。谢谢Jasonw!我为您的参考编辑了任何问题。是的,我知道如何设置调试模式。根据我昨天的研究,无法从PreparedStatement实例提取SQL。无论如何,我现在看到的是充满值的SQL。我之所以可以这样做,是因为我在它们被发送到execute方法或类似的方法之前打印它们,多亏了您。我感谢你的帮助!!来自Korea.this仅仅是查看log.public对象查询(String sql,Object[]args,ResultsTextRactor rse)抛出DataAccessException{printFormattedSql(sql,args);返回查询(sql,new ArgPreparedStatementSetter(args),rse);}public void printFormattedSql(String sql,Object[]args){for(int i=0;i