MyBatis log4j 配置仅记录映射器 XML 中的 SQL 名称,而不记录 SQL



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

log4j.logger.package.mapper=DEBUG

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

例如,我在映射器中的选择查询是这样的,如果通过XML完成:

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

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

MyBatis 的日志记录实现没有隐藏 SQL 的选项,但是,可以使用自定义拦截器来实现它。
假设您使用的是最新版本的 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

最新更新