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
当我在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