当我在 log4j.properties
中设置以下属性时,
log4j.logger.package.mapper=DEBUG
MyBatis 会将作业委托(delegate)给 log4j
,而 log4j
将在日志中打印整个 SQL
语句。
有没有办法只记录 SQL
语句的名称(XML 中的 id
,如果使用注释完成,它与 JAVA
中的映射器函数名称相匹配)?
例如。如果通过 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
关于java - MyBatis log4j 配置仅记录映射器 XML 中的 SQL 名称,而不记录 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59077138/