目录
1、前言
2、代码统计
3、整体架构
3.1、基础支持层
3.1.1、反射模块
3.1.2、类型模块
3.1.3、日志模块
3.1.4、IO模块
3.1.5、解析器模块
3.1.6、数据源模块
3.1.7、缓存模块
3.1.8、Binding 模块
3.1.9、注解模块
3.1.10、异常模块
3.2、核心处理层
3.2.1、配置解析模块
3.2.2、SQL解析模块
3.2.3、插件模块
3.3、接口层
3.3.1、session 模块
3.4、其他
3.4.1、JDBC 模块
3.4.2、Lang 模块
4、总结
1、前言
上一篇我们搭建了MyBatis的测试环境MyBatis源码分析(一):搭建调试环境
为了让大家对MyBatis的整体结构有一定的了解,本文主要分享一下关于Mybatis的项目结构。
拉取了MyBatis项目后,发现拆分的包好多啊。是不是感到了莫名的恐惧?
不要怕哦,阅读源码肯定是一件不太容易的事情,但是你要是想成为一名优秀的程序猿,就要坚持读下去。
2、代码统计
阅读一个项目源码的时候,首先要知道这个项目是干啥的,同时我们也非常有必要的了解一下该项目的代码量,做到心中有数。
统计代码量的方式有很多,我比较喜欢使用IDE Statistic 插件
安装 Statistic
1、打开IDEA的设置
2、选择插件[plugin]
3、选择[browse repositories)
4、搜索 Statistic
5、安装
使用 Statistic
1、打开IDEA 菜单 View
2、选择 Tool window
3、点击 Statistic
4、可以看到不同类型文件的统计
5、refresh 重新统计
6、上面的tab 切换可以查看不同类型文件的统计
使用 Statistic我们可以看到
代码大概在63406.好大啊。不过这是包含了一些单元测试的代码。不管了,继续看。
3、整体架构
MyBatis 的整体架构分为三层:
- 基础支持层:负责MyBatis与数据库连接方式管理、管理方式、缓存管理、配置文件加载
- 核心处理层:负责参数解析与参数绑定、sql解析、结果映射的解析以及处理
- 接口层:核心是 SqlSession 接口,该接口中定义了 MyBatis 暴露给应用程序调用的 API
3.1、基础支持层
3.1.1、反射模块
该模块对 Java 原生的反射进行了良好的封装,提供了更加简洁易用的 API,方便上层使调用,并且对反射操作进行了一系列优化
包路径:org/apache/ibatis/reflection
3.1.2、类型模块
类型模型提供了别名机制,这也是该模块的主要功能
类型模块时间了JDBC类型与JAVA类型的转换:
- 在为 SQL 语句绑定实参时,会将数据由 Java 类型转换成 JDBC 类型。
- 而在映射结果集时,会将数据由 JDBC 类型转换成 Java 类型。
包路径:org/apache/ibatis/type
3.1.3、日志模块
Mybatis可以详细的输入日志信息,同时还可以集成多种日志框架,例如 Log4j、Slf4j 等
包路径:org/apache/ibatis/type
3.1.4、IO模块
主要是对类加载器进行封装,确定类加载器的使用顺序,加载类文件以及其他资源文件
包路径:org/apache/ibatis/io
3.1.5、解析器模块
- 该模块对XPATH进行分装,解析
mybatis-config.xml
配置文件以及映射配置文件- 支持处理动态 SQL 语句中的占位符
包路径:org/apache/ibatis/parsing
3.1.6、数据源模块
MyBatis 对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现
包路径:org/apache/ibatis/datasource
3.1.7、缓存模块
MyBatis 中提供了一级缓存和二级缓存,而这两级缓存都是依赖于基础支持层中的缓 存模块实现的
包路径:org/apache/ibatis/cache
3.1.8、Binding 模块
MyBatis 通过 Binding 模块,将用户自定义的 Mapper 接口与映射配置文件关联起来,系统可以通过调用自定义 Mapper 接口中的方法执行相应的 SQL 语句完成数据库操作
包路径:org/apache/ibatis/binding
3.1.9、注解模块
MyBatis 提供了注解的方式,在Mapper接口直接写SQL代码
包路径:org/apache/ibatis/annotations
3.1.10、异常模块
定义了 MyBatis 专有的 PersistenceException 和 TooManyResultsException 异常。
包路径:org/apache/ibatis/exceptions
3.2、核心处理层
3.2.1、配置解析模块
对应
builder
和mapping
模块。前者为配置解析过程,后者主要为 SQL 操作解析后的映射在 MyBatis 初始化过程中,会加载
mybatis-config.xml
配置文件、映射配置文件以及 Mapper 接口中的注解信息,解析后的配置信息会形成相应的对象并保存到 Configuration 对象中之后,利用该 Configuration 对象创建 SqlSessionFactory对象。待 MyBatis 初始化之后,开发人员可以通过初始化得到 SqlSessionFactory 创建 SqlSession 对象并完成数据库操作
包路径:org/apache/ibatis/builder
包路径:org/apache/ibatis/mapping
3.2.2、SQL解析模块
scripting
模块,会根据用户传入的实参,解析映射文件中定义的动态 SQL 节点,并形成数据库可执行的 SQL 语句
包路径:org/apache/ibatis/scripting
3.2.3、SQL执行模块
对应
executor
和cursor
模块。前者对应执行器,后者对应执行结果的游标。SQL 语句的执行涉及多个组件 ,其中比较重要的是 Executor、StatementHandler、ParameterHandler 和 ResultSetHandler 。
- Executor 主要负责维护一级缓存和二级缓存,并提供事务管理的相关操作,它会将数据库相关操作委托给 StatementHandler完成。
- StatementHandler 首先通过 ParameterHandler 完成 SQL 语句的实参绑定,然后通过
java.sql.Statement
对象执行 SQL 语句并得到结果集,最后通过 ResultSetHandler 完成结果集的映射,得到结果对象并返回。
包路径:org/apache/ibatis/executor
包路径:org/apache/ibatis/cursor
3.2.3、插件模块
MyBatis 提供了插件接口,我们可以通过添加用户自定义插件的方式对 MyBatis 进行扩展。用户自定义插件也可以改变 Mybatis 的默认行为,例如,我们可以拦截 SQL 语句并对其进行重写。
包路径:org/apache/ibatis/plugin
3.3、接口层
3.3.1、session
模块
其核心是 SqlSession 接口。接口层在接收到调用请求时,会调用核心处理层的相应模块来完成具体的数据库操作
包路径:org/apache/ibatis/session
3.4、其他
3.4.1、JDBC 模块
JDBC 单元测试工具类
包路径:org/apache/ibatis/jdbc
3.4.2、Lang 模块
里面只包含两个注解,用途不详
包路径:org/apache/ibatis/lang
4、总结
Mybatis的代码还是比较简单易懂的。http://www.mybatis.org 也提供了中文文档,有兴趣的小伙伴可以翻阅查看哦。后续的文章,将会逐步讲解各个模块,敬请期待!
Mybatis源码解析传送门
MyBatis源码分析(一):搭建调试环境
MyBatis源码分析(三):解析器模块