myBatis 3.2.7 如何打印 sql log

该文中使用的log框架为logbackjava

myBatis3.0.6左右的版本时sql

打印sql的时候只须要配置以下属性:mybatis

<logger name="java.sql.Connection" level="DEBUG" />
<logger name="java.sql.Statement" level="DEBUG" />
<logger name="java.sql.PreparedStatement" level="DEBUG" />

源码解析:app

PreparedStatementLogger里面看这个log.isDebugEnabled()框架

public Object invoke(Object proxy, Method method, Object[] params) throws Throwable { try { if (EXECUTE_METHODS.contains(method.getName())) { if (log.isDebugEnabled()) { log.debug("==> Executing: " + removeBreakingWhitespace(sql)); log.debug("==> Parameters: " + getParameterValueString()); } clearColumnInfo(); if ("executeQuery".equals(method.getName())) { ResultSet rs = (ResultSet) method.invoke(statement, params); if (rs != null) { return ResultSetLogger.newInstance(rs); } else { return null; } } else { return method.invoke(statement, params); } }this

这个log定义的是PreparedStatementspa

private static final Log log = LogFactory.getLog(PreparedStatement.class);

在myBatis3.2.7左右版本debug

更改了打印Sql的模式,它将sql打印细化到了每个mapperStatement的每个方法上。code

若是你打算有一个全局配置打印全部的sql,则须要以下配置rem

在mybatis的configuration中增长setting配置

<settings>
        <setting name="logPrefix" value="dao."/>
</settings>

而后增长配置

<logger name="dao" level="DEBUG"/>

源码解析:

ConnectionLogger

public Object invoke(Object proxy, Method method, Object[] params)
      throws Throwable {
    try {
      if (Object.class.equals(method.getDeclaringClass())) {
        return method.invoke(this, params);
      }    
      if ("prepareStatement".equals(method.getName())) {
        if (isDebugEnabled()) {
          debug(" Preparing: " + removeBreakingWhitespace((String) params[0]), true);
        }        
        PreparedStatement stmt = (PreparedStatement) method.invoke(connection, params);
        stmt = PreparedStatementLogger.newInstance(stmt, statementLog, queryStack);
        return stmt;
      }

其中的isDebugEnabled()指的是

protected boolean isDebugEnabled() {
    return statementLog.isDebugEnabled();
}

注意这里的statementLog,看SimpleExecutor的prepareStatement(handler, ms.getStatementLog());

public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
    Statement stmt = null;
    try {
      Configuration configuration = ms.getConfiguration();
      StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);
      stmt = prepareStatement(handler, ms.getStatementLog());
      return handler.<E>query(stmt, resultHandler);
    } finally {
      closeStatement(stmt);
    }
  }

这个statementLog是ms.getStatementLog()而来的。而MappedStatement的StatementLog

String logId = id;
 if (configuration.getLogPrefix() != null) logId = configuration.getLogPrefix() + id;
 mappedStatement.statementLog = LogFactory.getLog(logId);

这里能够看到,logPrefix决定了全部log前缀,因此只须要配置logPrefix就好了

相关文章
相关标签/搜索