当我在log4j.properties
中设置以下属性时,
log4j.logger.package.mapper=DEBUG
MyBatis 会将工作委托给log4j
,log4j
将在日志中打印整个SQL
语句。 有没有办法只记录SQL
语句的名称(id
XML中,如果使用注释,则与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