3. MyBatis 核心源码分析——整体架构

本文深入探讨了MyBatis的日志模块,包括如何通过适配器模式统一不同日志库的日志级别,如何动态加载第三方日志实现,以及如何使用代理模式将日志优雅地融入JDBC执行流程。同时,文章还分析了数据源模块,讲解了如何通过工厂模式创建数据库连接以及池化技术的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 整体架构

123

2. 日志模块

日志模块需要解决 3 个问题:

  1. MyBatis 没有自己的日志实现,使用的是第三方日志组件。第三方日志组件日记级别各不相同,MyBatis 统一提供了 trace、debug、warn、error 4 个日志级别,这是如何做到的?
  2. MyBatis 是如何自动发现第三方日志实现的?
  3. MyBatis 是如何把日志优雅的嵌入到 JDBC 主体流程中?

2.1 统一日志级别

也就是解决第一个问题。
使用了适配器模式。
在这里插入图片描述
在这里插入图片描述
Log 统一日志级别:
在这里插入图片描述
在这里插入图片描述
以 Log4jImpl 为例,自己封装 Log4J 的实现,使用了 Log4J 的日志级别。

2.2 加载第三方日志实现

按照 Slf4J、CommonsLog、Log4J、Log4J、JdkLog、noLog 的顺序发现,并且是在调用 LogFactory.getLog 时发现的。
以加载 Slf4J 为例。
在这里插入图片描述
在这里插入图片描述

2.3 日志嵌入 JDBC 主体流程

使用了代理模式,具体使用的是动态代理,3 个动态代理类:ConnectionLogger、PreparedStatementLogger、ResultSetLogger。
在这里插入图片描述

在 JDBC 主体流程中,MyBatis 在下面 3 个地方嵌入了日志:

  1. SQL 语句
  2. SQL 语句中 ? 代表的参数
  3. SQL 执行结果
    在这里插入图片描述

在 org.apache.ibatis.executor.SimpleExecutor.prepareStatement(StatementHandler, Log) 中:

  1. 创建 Connection,并使用 ConnectionLogger 进行了增强。
    在这里插入图片描述
    在这里插入图片描述
  2. 在 ConnectionLogger 的增强逻辑中打印 SQL 语句,创建 PreparedStatement,并使用 PreparedStatementLogger 对 PreparedStatement 进行了增强。
    在这里插入图片描述
  3. 在 PreparedStatementLogger 中打印参数,执行 SQL,创建 ResultSet,并使用 ResultSetLogger 对 ResultSet 进行了增强。
    在这里插入图片描述
  4. 在 ResultSetLogger 的增强中打印结果日志。
    在这里插入图片描述

3. 数据源模块

需要解决 2 个问题:

  1. 如何创建一个连接
  2. 池化技术如何实现
    在这里插入图片描述

3.1 创建一个数据库连接

在这里插入图片描述
使用工厂模式创建数据库连接。

  1. UnpooledDataSourceFactory、UnpooledDataSource
    在这里插入图片描述
    在这里插入图片描述
  2. PooledDataSourceFactory、PooledDataSource
    在这里插入图片描述
    在这里插入图片描述

3.2 池化技术实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值