源码揭秘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();
相关文章
- MyBatis学习总结
- Spring+SpringMVC+Mybatis 利用AOP自定义注解实现可配置日志快照记录
- MyBatis——mybatis基本搭建
- 【Log日志】打印mybatis中sql日志并存放到指定文件中
- 详细整合教程(Spring+SpringMVC+MyBatis)
- Mybatis-Plus3.3.0 MetaObjectHandler 在springMVC中公共字段全局填充
- 《深入理解mybatis原理》 Mybatis数据源与连接池
- 《深入理解mybatis原理》 MyBatis的架构设计以及实例分析
- mybatis使用记录:#{}与${}区别、缓存机制、传递数组参数和List参数时if-test判空和判断长度的写法、Mybatis查询数据返回基本类型数组
- 浅析mybatis懒加载导致无法序列化的问题、Json序列化对象时错误Could not write JSON: No serializer found for class
- 【转】Mybatis学习---MyBatis知识、原始Dao开发和mapper代理开发
- 基于eclipse的mybatis映射代码自动生成的插件
- Mybatis加入日志
- MyBatis传入参数为集合 list 数组 map写法
- mybatis返回自增主键踩坑记
- 曹工杂谈--使用mybatis的同学,进来看看怎么在日志打印完整sql吧,在数据库可执行那种
- 面试题:应用中很多jar包,比如spring、mybatis、redis等等,各自用的日志系统各异,怎么用slf4j统一输出?(上)
- Java idea 创建User.xml,需要新增一个mybatis-mapper.xml模板
- spring,配置文件applictionContext.xml,Mybatis mybatis.xml,springMVC spring整合springMVC mybatis
- Mybatis 动态insert动态插入的坑