Mybatis-源码解析(二)
1. 前言
我们讲解的方式为由浅入深,一定要对框架有一个大概的认识才慢慢去了解其中的具体细节。
本章节讲解的内容主要分为如下四个板块:
Mybatis
架构解析Mybatis
生命周期Mybatis
源码分析Mybatis
设计模式
2. Mybatis
架构解析
我们一般把 Mybatis
的功能架构分为三层:
API
接口层:提供给外部使用的接口API
,开发人员通过这些本地API
来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。- 数据处理层:它主要的目的是根据调用的请求完成一次数据库操作,负责具体的
SQL
查找、SQL
解析、SQL
执行和执行结果映射处理等。 - 基础支撑层:为上层的数据处理层提供最基础的支撑,负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。
代码示例
- 从配置文件(通常是XML文件)得到
SessionFactory
; - 从
SessionFactory
得到SqlSession
; - 通过
SqlSession
进行CRUD
和事务的操作; - 执行完相关操作之后关闭
Session
。
1 |
|
3. Mybatis
生命周期
Mybatis
生命周期大概分为如下几步:
Configuration
实例化阶段- 当应用启动时,
MyBatis
会读取配置文件(如mybatis-config.xml
)并创建一个Configuration
对象。这个对象包含了MyBatis
的全局配置信息,包括数据库连接信息、对象映射配置、插件等。
- 当应用启动时,
SqlSessionFactory
的创建- 在
Configuration
对象被创建后,MyBatis
会基于配置信息构建一个SqlSessionFactory
对象。SqlSessionFactory
是一个线程安全的工厂类,用于创建SqlSession
实例。
- 在
SqlSession
的生命周期SqlSession
是MyBatis
中用于执行SQL
语句的核心对象。它的生命周期是短暂的,每次需要与数据库进行交互时,都会创建一个新的SqlSession
对象。在完成操作后,需要显式地关闭SqlSession
,释放相关资源。
Mapper 接口的代理对象
- 在
MyBatis
中,可以使用 Mapper 接口来定义SQL
映射操作。MyBatis
会为每个Mapper
接口创建一个代理对象,该代理对象通过SqlSession
来执行具体的SQL
操作。
- 在
执行
SQL
操作- 通过
SqlSession
或 Mapper 接口的代理对象,可以执行各种SQL
操作,包括查询、插入、更新、删除等。
- 通过
事务管理
- 在需要进行事务操作时,可以通过配置来启用
MyBatis
的事务管理。
- 在需要进行事务操作时,可以通过配置来启用
插件拦截器
MyBatis
允许通过插件来扩展其功能。插件可以拦截MyBatis
的核心组件,如Executor
、StatementHandler
、ParameterHandler
、ResultSetHandler
等,在其执行过程中添加自定义逻辑。
资源释放
- 在应用关闭时,需要显式地关闭
SqlSessionFactory
,释放相关的数据库连接和资源,以避免内存泄漏。
- 在应用关闭时,需要显式地关闭
4. Mybatis
源码分析
我们采用的
Mybatis 3.4.3
进行分析,这样我们就可以在源码的基础上添加注释信息。该部分的源码分析主要是围绕着全局配置文件进行的分析。参考博文:
4.1. 源码编译
如果需要编译源码需要下载两个部分的源码
- 将源码下载下来之后将【
mybatis-parent-31
】进行编译
1 | mvn clean install |
- 然后编译【
mybatis-3-mybatis-3.5.4
】
1 | mvn clean |
可能会遇到的问题
由于本人从
git
下载的zip
版本,编译的时候出现如下错误1
failure occured while calling class com.mycila.maven.plugin.license.git.CopyrightRangeProvider
- 解决方案
1
git init
然后出现如下错误
1
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-pdf-plugin:1.4:pdf (pdf) on project mybatis: Error during document generation: Error parsing D:\idea-project\mybatis-3.5.3\mybatis-3-mybatis-3.5.4\target\pdf\site.tmp\xdoc\getting-started.xml: Error parsing the model: only whitespace content allowed before start tag and not \ufeff (position: COMMENT seen ...rning permissions and\n limitations under the License.\n\n-->\n\ufeff... @18:2)
- 解决方案,将
mybatis-3-mybatis-3.5.4
中的pom.xml
如下注释
1
2
3
4<!-- <plugin>-->
<!-- <groupId>org.apache.maven.plugins</groupId>-->
<!-- <artifactId>maven-pdf-plugin</artifactId>-->
<!-- </plugin>-->- 解决方案,将
编译成功
4.2. 引入依赖
我们在《Mybatis-基础知识(一)》基础上进行开发,则需要重新引入本地编译好的
Mybatis 3.5.4
版本
- 修改
mybatis 3.5.4
的版本号
1 | <dependency> |
- 在需要引用的项目中添加引用
- 如果报错
java.lang.NoClassDefFoundError: ognl/PropertyAccessor
, 则添加如下依赖
1 | <dependency> |
4.3. 源码分析
4.3.1. Mybatis
启动流程
- 代码示例
1 | SqlSessionFactory sqlSessionFactory; |
UML
时序图
gif
源码追踪
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Wickson Blog!
评论