文档章节

Mybatis不同版本sql日志打印

Small-Liu
 Small-Liu
发布于 2016/02/26 16:35
字数 532
阅读 87
收藏 0

工作中经常希望打印mybatis执行sql的debug日志,上网找到的各种配置都不生效,这是因为mybatis版本不同日志打印方法也不同,下面谈谈开启日志的经验。

第一种方法,是把所有的日志都放开, 然后从中选取自己需要的部分;

第二种方法,从原理层解决是看mybatis源代码,找到打日志的代码,这里选取两个版本观看:

  1. 3.0.1版,

public class PreparedStatementLogger extends BaseJdbcLogger implements InvocationHandler {

    private static final Log log = LogFactory.getLog(PreparedStatement.class);

    public Object invoke(Object proxy, Method method, Object[] params) throws Throwable {
        try {
            if (EXECUTE_METHODS.contains(method.getName())) {
                if (log.isDebugEnabled()) {
                    log.debug("==>  Executing: " + removeBreakingWhitespace(sql));
                    log.debug("==> Parameters: " + getParameterValueString());
                }
               ......//省略
            } 
        } catch (Throwable t) {
            throw ExceptionUtil.unwrapThrowable(t);
        }
    }
}

看PreparedStatementLogger的invoke方法,log是通过java.sql.PreparedStatement初始化的日志,所以log4j配置方式为:log4j.logger.java.sql.PreparedStatement=DEBUG

 2. 3.2.8版,

ConnectionLogger和PreparedStatementLogger均继承至BaseJdbcLogger,看BaseJdbcLogger的debug方法知道其log是构造方法传过来的

public abstract class BaseJdbcLogger {
    protected Log statementLog;
    public BaseJdbcLogger(Log log, int queryStack) {
        this.statementLog = log;
        if (queryStack == 0)
            queryStack = 1;
        this.queryStack = queryStack;
    }
    protected void debug(String text, boolean input) {
        if (statementLog.isDebugEnabled()) {
            statementLog.debug(prefix(input) + text);
        }
    }
}

跟踪调用栈找到该log实例是MappedStatement里面传过来的,看MappedStatement构造:

public final class MappedStatement {
    private MappedStatement() {
        // constructor disabled
    }
    public static class Builder {
        private MappedStatement mappedStatement = new MappedStatement();

        public Builder(Configuration configuration, String id, SqlSource sqlSource, SqlCommandType sqlCommandType) {
            mappedStatement.configuration = configuration;
            mappedStatement.id = id;//mappedStatement的唯一标识,namespace+id
            mappedStatement.sqlSource = sqlSource;
            mappedStatement.statementType = StatementType.PREPARED;
            mappedStatement.parameterMap = new ParameterMap.Builder(configuration, "defaultParameterMap", null,
                    new ArrayList<ParameterMapping>()).build();
            mappedStatement.resultMaps = new ArrayList<ResultMap>();
            mappedStatement.timeout = configuration.getDefaultStatementTimeout();
            mappedStatement.sqlCommandType = sqlCommandType;
            mappedStatement.keyGenerator = configuration.isUseGeneratedKeys()
                    && SqlCommandType.INSERT.equals(sqlCommandType) ? new Jdbc3KeyGenerator() : new NoKeyGenerator();
            String logId = id;
            if (configuration.getLogPrefix() != null)//可以加前缀
                logId = configuration.getLogPrefix() + id;
            //这边是构造log的地方
            mappedStatement.statementLog = LogFactory.getLog(logId);
            mappedStatement.lang = configuration.getDefaultScriptingLanuageInstance();
        }
    }
}

看log是根据MappedStatement的id创建的,这里的id是namespace+id,所以log4j的写法应该是:

log4j.logger.com.xxx.mapper=DEBUG

com.xxx.mapper是每个业务的包名,如果业务很多,就每个需要打印日志的包路径都写一遍,麻烦!看到上面代码还有一个关键元素configuration.getLogPrefix(),这个前缀是在解析配置的时候获取的,配置这个前缀就可以所以log用一个logger配置。如下:

<settings>
    <setting name="logPrefix" value="abcdefg" />
</settings>

log4j.logger.abcdefg=DEBUG

 

 

© 著作权归作者所有

共有 人打赏支持
Small-Liu
粉丝 16
博文 56
码字总数 49976
作品 0
南京
程序员
加载中

评论(1)

i
itxx2016
推荐国内最流行的iBatis、MyBatis代码生成网站: fwjava.com
在线生成,操作极其简单,生成的代码十分规范好用,经历过实战的代码.
现在,大多数知名的互联网公司都在用它.
禁止 MyBatis 打印 SQL 的功能

背景 昨天在整理日志的时候,打算将每次执行的 SQL 打印出来(开发环境),便于快速定位问题。 在已知的两种打印方式中,MyBatis 会将预处理 SQL、参数、返回结果分别打印,而 Druid 可以更细...

闷不骚写代码
02/26
0
0
MyBatis和Hibernate相比,优势在哪里?

1、开发对比开发速度 hibernate的真正掌握要比Mybatis来得难些。Mybatis框架相对简单很容易上手,但也相对简陋些。个人觉得要用好Mybatis还是首先要先理解好Hibernate。 开发社区 Hibernate ...

park
2017/11/28
0
0
MyBatis和Hibernate优劣势对比

1、开发对比 开发速度 Hibernate的真正掌握要比Mybatis来得难些。Mybatis框架相对简单很容易上手,但也相对简陋些。个人觉得要用好Mybatis还是首先要先理解好Hibernate。 开发社区 Hibernat...

黎嘉诚
2016/08/05
88
0
MyBatis和Hibernate相比,优势在哪里?

1、开发对比开发速度 Hibernate的真正掌握要比Mybatis来得难些。Mybatis框架相对简单很容易上手,但也相对简陋些。个人觉得要用好Mybatis还是首先要先理解好Hibernate。 开发社区 Hibernate ...

vshcxl
2016/03/28
41
0
MyBatis和Hibernate相比,优势在哪里?

1、开发对比开发速度 hibernate的真正掌握要比Mybatis来得难些。Mybatis框架相对简单很容易上手,但也相对简陋些。个人觉得要用好Mybatis还是首先要先理解好Hibernate。 开发社区 Hibernate ...

qq5923dd411b8fa
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java工程师用spring boot和web3j构建以太坊区块链应用

区块链最近IT世界的流行语之一。这项有关数字加密货币的技术,并与比特币一起构成了这个热门的流行趋势。它是去中心化的,不可变的分块数据结构,这是可以安全连接和使用的密码算法。在这种结...

笔阁
刚刚
0
0
聊聊sentinel的SentinelWebAutoConfiguration

序 本文主要研究一下sentinel的SentinelWebAutoConfiguration SentinelWebAutoConfiguration spring-cloud-alibaba-sentinel-autoconfigure-0.2.0.BUILD-SNAPSHOT-sources.jar!/org/springf......

go4it
2分钟前
0
0
java ArrayList 根据对象内的属性排序

//根据修改时间排序Comparator com = new Comparator<ReleaseInfo>() {public int compare(ReleaseInfo reInfo1, ReleaseInfo reInfo2) { //return reInfo2.getModifyTime().c......

成长中的小白
3分钟前
0
0
PowerDesigner p f m

(非原创) P:PirmaryKey 主键 F:ForeignKey 外键 M:Mandatory 强制要求(不能为空) 主键: 主键是数据表的唯一索引,比如学生表里有学号和姓名,姓名可能有重名的,但学号确是唯一的,你要从...

森火
3分钟前
0
0
Nexus Repository Manager 搭建私有docker仓库

Nexus Repository Manager 搭建私有docker仓库 2018年05月08日 14:44:23 阅读数:115 1.下载nexus3的镜像: docker pull sonatype/nexus3 2.使用镜像启动一个容器: docker run -d --name n...

linjin200
4分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部