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!
评论




