• 源码揭秘mybatis日志实现的原理


     背景

           在程序开发过程中,为了调试方便、了解程序的运行过程,进行必要的日志输出总是免不了的。对于使用Mybatis而言,我们常见的需求是希望可以在日志中打印出Mybatis执行过程中进行数据库操作的SQL语句及其传递的参数。Mybatis的日志输出是统一管理的,它有自己的日志接口,然后在需要进行日志输出的时候使用统一的API进行日志输出。这个统一的接口是org.apache.ibatis.logging.Log。Mybatis分别基于常用的日志输出工具给出了对应的实现,比如LOG4J、SLF4J等。默认情况下Mybatis的org.apache.ibatis.logging.LogFactory会按照以下顺序依次判断当前程序下可以使用哪种日志实现,直到找到为止,如果一个实现都没有那就是最后的noLogging了,将采用NoLoggingImpl实现。

    Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具:

    • SLF4J
    • Apache Commons Logging
    • Log4j 2
    • Log4j
    • JDK logging
    • NoLogging

    日志简介

    mybatis日志定义了一个日志门面LogFactory,在需要使用时调用getLog方法:

    private static final Log log = LogFactory.getLog(xxxx.class);
          if (log.isDebugEnabled()) {
            log.debug("。。。。。。。。。。。。。");
          }

    从上面可以看到LogFactory决定了使用哪个日志体系

      static {
        tryImplementation(LogFactory::useSlf4jLogging);
        tryImplementation(LogFactory::useCommonsLogging);
        tryImplementation(LogFactory::useLog4J2Logging);
        tryImplementation(LogFactory::useLog4JLogging);
        tryImplementation(LogFactory::useJdkLogging);
        tryImplementation(LogFactory::useNoLogging);
      }

    具体使用哪个,可以在Settings中配置

    初始化日志实现

    深入源码

    废话不多,直接上流程图

    从流程图上看:

    1.构建SqlSessionFactory时,加载配置文件。

    2.调用XMLConfigBuilder的parse方法,解析配置文件

     3.加载实例,配置到Configuration类中

     4.调用LogFactory,并设置实例

     5.将实例赋值给Log

     总结

    除了上面提到的几个日志实现类,还有打印sql的日志。

    Mybatis的日志输出可以输出数据库连接的获取、释放信息;

    可以输出执行的SQL语句及其传递的预编译参数信息;

    可以输出查询结果集信息(需要是trace输出级别,其它的是DEBUG级别);

    Mybatis的日志输出实现是通过JDK的动态代理来实现的,针对Connection的日志输出提供了ConnectionLogger;

    针对Statement提供了StatementLogger;针对PreparedStatement提供了PreparedStatementLogger;

    针对ResultSet提供了ResultSetLogger,这些Logger类都是实现了JDK的InvocationHandler类的。

     注意:如果你的应用部署在一个包含Commons Logging的环境, 而你又想用其他的日志框架,你可以根据需要调用如下的某一方法:

    org.apache.ibatis.logging.LogFactory.useSlf4jLogging();
    org.apache.ibatis.logging.LogFactory.useLog4JLogging();
    org.apache.ibatis.logging.LogFactory.useJdkLogging();
    org.apache.ibatis.logging.LogFactory.useCommonsLogging();
    org.apache.ibatis.logging.LogFactory.useStdOutLogging();
  • 相关阅读:
    Django项目引入NPM和gulp管理前端资源
    Django实现统一包装接口返回值数据格式
    即学即会 Serverless | 如何解决 Serverless 应用开发部署的难题?
    足不出户,搞定交付——独家交付秘籍(第二回)
    如何使用阿里云容器服务保障容器的内存资源质量
    恭喜我的同事丁宇入选年度 IT 领军人物
    基于 KubeVela 的机器学习实践
    基于 KubeVela 的机器学习实践
    OpenKruise v1.1:功能增强与上游对齐,大规模场景性能优化
    云原生时代如何用 Prometheus 实现性能压测可观测Metrics 篇
  • 原文地址:https://www.cnblogs.com/davidwang456/p/12801110.html
Copyright © 2020-2023  润新知