源码揭秘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中配置

初始化日志实现

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

深入源码

废话不多,直接上流程图

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

从流程图上看:

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

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

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

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

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

4.调用LogFactory,并设置实例

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

5.将实例赋值给Log

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

总结

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

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

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();

Original: https://www.cnblogs.com/davidwang456/p/12801110.html
Author: 一天不进步,就是退步
Title: 源码揭秘mybatis日志实现的原理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/544287/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Spring Boot 2.7.0发布,2.5停止维护,节奏太快了吧

    这几天是Spring版本日,很多 Spring工件都发布了新版本, Spring Framework 6.0.0 发布了第 4 个里程碑版本,此版本包含所有针对 5.3.20 的修…

    Java 2023年5月30日
    088
  • .net 使用Docker开发

    .NET多年以前已经开始支持Docker,但由于国内.net现状,生产过程中几乎用不到docker支持,趁着有点时间捣鼓下~。 先期工作 1、首先安装 Docker Desktop…

    Java 2023年6月9日
    042
  • Spring(十二):使用JavaConfig实现配置

    上一篇文章我们学习了使用注解开发,但还没有完全脱离xml的配置,现在我们来学习JavaConfig配置来代替xml的配置,实现完全注解开发。 下面我们用一个简单的例子来进行学习。 …

    Java 2023年6月15日
    0103
  • 2022美团Java后端开发春招实习面经

    ​ 五层架构:应用层、运输层、网络层、数据链路层、物理层 ​ HTTP 是超⽂本传输协议,也就是HyperText Transfer Protocol ​ HTTP协议拆解为超文本…

    Java 2023年6月7日
    077
  • JavaWeb开发——软件国际化(动态元素国际化)

    软件国际化的第二个部分,就是动态元素国际化。 数值,货币,时间,日期等数据由于可能在程序运行时动态产生,所以无法像文字一样简单地将它们从应用程序中分离出来,而是需要特殊处理。Jav…

    Java 2023年5月29日
    077
  • CSharp: Command Pattern

    csharp;gutter:true; /// /// defines Command interface /// Command Patterns命令模式 /// 2022091…

    Java 2023年6月16日
    062
  • java生成机器码

    java根据系统参数生成每个计算机的唯一标识。 获取CPU序列号 /** * 获取CPU序列号 * @return * @throws IOException */ public …

    Java 2023年6月16日
    079
  • SpringBoot自定义环境变量——EnvironmentPostProcessor

    现有需求是将数据库配置文件中账号密码相关信息分离且加密,用到了SpringBoot中 EnvironmentPostProcessor接口。可以将外部配置文件读取注入系统中。 实现…

    Java 2023年6月9日
    083
  • 群晖安装wordpress 外网(域名访问)

    群晖安装wordpress 外网(域名访问) 1.群晖套件安装的不知道咋弄,外网无法访问 2.偷懒访式安装 2.1群晖套件安装wordpress,后删除wordpress,但是不删…

    Java 2023年6月6日
    099
  • SpringBoot三招组合拳,手把手教你打出优雅的后端接口

    前言 一个后端接口大致分为四个部分组成:接口地址(url)、接口请求方式(get、post等)、请求数据(request)、响应数据(response)。如何构建这几个部分每个公司…

    Java 2023年5月30日
    080
  • Bean 字段复制利器 MapStruct

    本文聊一个工具类,MapStruct ,它是一个在 dto,po(do/entity),vo 等这些 pojo 中转换字段的一个工具,在应用中经常有这样的转换,在 spring 和…

    Java 2023年6月5日
    0123
  • Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(下)-字段重命名&字段移除

    ​ 概述 服务编排是Fizz网关提供的一个强大的功能,能够基于现有的业务微服务通过在线配置的方式快速的生成一个聚合接口,减少中间层胶水代码以及降低编码投入。在服务编排中支持使用函数…

    Java 2023年6月9日
    086
  • @Inherited 原注解功能介绍

    @Inherited 底层 package java.lang.annotation; /** * Indicates that an annotation type is aut…

    Java 2023年6月5日
    0151
  • Windows常用命令手册

    cmd 命令手册 端口命令 查看端口占用详情 netstat -ano 查找过滤命令 findstr (相似Linux中grep) 例如需要查找8080端口占用详情:netstat…

    Java 2023年6月7日
    077
  • 66.落空

    dfsd posted @2022-09-28 08:39 随遇而安== 阅读(8 ) 评论() 编辑 Original: https://www.cnblogs.com/55zj…

    Java 2023年6月7日
    081
  • 研究一下JAVA robot类

    什么是机器人工具类 此工具类与qq机器人并 不相同,可以理解为 键盘与鼠标事件, 代替人对电脑执行操作 具体使用 /** * Constructs a Robot object i…

    Java 2023年6月7日
    082
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球