MyBatis log4j 配置仅记录来自映射器 XML 的 SQL 名称而不是 SQLs

MyBatis log4j configuration to log only SQL names from mapper XMLs and not SQLs

当我在log4j.properties中设置如下属性时,

log4j.logger.package.mapper=DEBUG

MyBatis 会将工作委托给 log4j 并且 log4j 将在日志中打印整个 SQL 语句。 有没有办法只记录 SQL 语句的名称(XML 中的 id 如果使用注释完成,它与 JAVA 中的映射器函数名称匹配)?

例如。我在映射器中的 select 查询是这样的,如果通过 XML:

<select id="selectPerson" parameterType="int" ....

那么我只想记录 selectPerson。目前它正在被记录,但它还包括具有所有参数值的 SQL 状态。我只想从日志中隐藏实际的 SQL 查询。

MyBatis 的日志实现没有隐藏选项 SQL,但是,可以使用自定义 interceptor.
假设您使用的是最新版本的 MyBatis,这里是一个示例实现。

package pkg;

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.apache.log4j.Logger;

@Intercepts({
  @Signature(
      type = Executor.class, 
      method = "update", 
      args = { MappedStatement.class, Object.class }),
  @Signature(
      type = Executor.class, 
      method = "query", 
      args = { MappedStatement.class, Object.class,
        RowBounds.class, ResultHandler.class })
})
public class LogStatementIdInterceptor implements Interceptor {
  private static final Logger logger = Logger.getLogger(LogStatementInterceptor.class);
  @Override
  public Object intercept(Invocation invocation) throws Throwable {
    MappedStatement ms = (MappedStatement) invocation.getArgs()[0];
    logger.debug(ms.getId());
    return invocation.proceed();
  }
}

要注册拦截器,请将以下条目添加到 XML 配置文件。

<plugins>
  <plugin interceptor="pkg.LogStatementIdInterceptor" />
</plugins>

使用 Java 配置,将拦截器实例传递给 org.apache.ibatis.session.Configuration#addInterceptor()

并且在 log4j.properties ...

log4j.logger.pkg.LogStatementIdInterceptor=DEBUG