MyBatis源码分析(二):项目结构

目录

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项目后,发现拆分的包好多啊。是不是感到了莫名的恐惧?

dd5d7c78c48147fa86c684ee8b7c0960.jpeg

不要怕哦,阅读源码肯定是一件不太容易的事情,但是你要是想成为一名优秀的程序猿,就要坚持读下去。

5c37195e3c3944b596d88774ed49d32a.png

2、代码统计

阅读一个项目源码的时候,首先要知道这个项目是干啥的,同时我们也非常有必要的了解一下该项目的代码量,做到心中有数。

统计代码量的方式有很多,我比较喜欢使用IDE Statistic 插件

安装 Statistic
1、打开IDEA的设置
2、选择插件[plugin]
3、选择[browse repositories)
4、搜索 Statistic
5、安装
18851240acda446082be0de44f229394.png

使用 Statistic

1、打开IDEA 菜单 View
2、选择 Tool window
3、点击 Statistic
4、可以看到不同类型文件的统计
5、refresh 重新统计
6、上面的tab 切换可以查看不同类型文件的统计

2c699ff2376e4d10bbc3aa00fe7c570f.png

使用 Statistic我们可以看到

5385cf5a42864bd898e3b676b10729ae.png

代码大概在63406.好大啊。不过这是包含了一些单元测试的代码。不管了,继续看。

81ab4a6bbc0e4332ab1678f5594eb799.jpeg

3、整体架构

MyBatis 的整体架构分为三层:

  1. 基础支持层:负责MyBatis与数据库连接方式管理、管理方式、缓存管理、配置文件加载
  2. 核心处理层:负责参数解析与参数绑定、sql解析、结果映射的解析以及处理
  3. 接口层:核心是 SqlSession 接口,该接口中定义了 MyBatis 暴露给应用程序调用的 API

0eb07c71533c42e0afbbb0e757788a2e.webp

3.1、基础支持层

3.1.1、反射模块

该模块对 Java 原生的反射进行了良好的封装,提供了更加简洁易用的 API,方便上层使调用,并且对反射操作进行了一系列优化

包路径:org/apache/ibatis/reflection

0bc683fa104b45fba47beb62f8f254aa.png

3.1.2、类型模块

类型模型提供了别名机制,这也是该模块的主要功能

类型模块时间了JDBC类型与JAVA类型的转换:  

  • 在为 SQL 语句绑定实参时,会将数据由 Java 类型转换成 JDBC 类型。
  • 而在映射结果集时,会将数据由 JDBC 类型转换成 Java 类型。

包路径:org/apache/ibatis/type

 

5e231dded91849c6b5838006b996a47a.png

3.1.3、日志模块

Mybatis可以详细的输入日志信息,同时还可以集成多种日志框架,例如 Log4j、Slf4j 等

包路径:org/apache/ibatis/type

41e50026612c431daad97cf7174acfd1.png

3.1.4、IO模块

主要是对类加载器进行封装,确定类加载器的使用顺序,加载类文件以及其他资源文件

包路径:org/apache/ibatis/io

56499bd2799040a8bebe84fd44b4b21f.png

3.1.5、解析器模块

  • 该模块对XPATH进行分装,解析mybatis-config.xml 配置文件以及映射配置文件
  • 支持处理动态 SQL 语句中的占位符

包路径:org/apache/ibatis/parsing

a2239d7b42274accbf6a15cbd12d3f4f.png

3.1.6、数据源模块

MyBatis 对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现

包路径:org/apache/ibatis/datasource

8f6a225dfad449ce97fe46b8505bdcd9.png

3.1.7、缓存模块

MyBatis 中提供了一级缓存和二级缓存,而这两级缓存都是依赖于基础支持层中的缓 存模块实现的

包路径:org/apache/ibatis/cache

8f0e0de17b4b40d796248e0e8dbce4e8.png

3.1.8、Binding 模块

MyBatis 通过 Binding 模块,将用户自定义的 Mapper 接口与映射配置文件关联起来,系统可以通过调用自定义 Mapper 接口中的方法执行相应的 SQL 语句完成数据库操作

包路径:org/apache/ibatis/binding

04b0bcdc78d64476ba54b67fc7bbc69a.png

3.1.9、注解模块

MyBatis 提供了注解的方式,在Mapper接口直接写SQL代码

包路径:org/apache/ibatis/annotations

c6f1af70d3d24258b7ef6878b0f200d1.png

3.1.10、异常模块

定义了 MyBatis 专有的 PersistenceException 和 TooManyResultsException 异常。

包路径:org/apache/ibatis/exceptions

3747cca5f0094b6dafd7757d358642ca.png

3.2、核心处理层

3.2.1、配置解析模块

对应 builder 和 mapping 模块。前者为配置解析过程,后者主要为 SQL 操作解析后的映射

在 MyBatis 初始化过程中,会加载 mybatis-config.xml 配置文件、映射配置文件以及 Mapper 接口中的注解信息,解析后的配置信息会形成相应的对象并保存到 Configuration 对象中

之后,利用该 Configuration 对象创建 SqlSessionFactory对象。待 MyBatis 初始化之后,开发人员可以通过初始化得到 SqlSessionFactory 创建 SqlSession 对象并完成数据库操作

包路径:org/apache/ibatis/builder 

f9bfcfd866de47a5bf5331e1991a56af.png

包路径:org/apache/ibatis/mapping

4d869877ba58486686c877d3609d14fd.png

3.2.2、SQL解析模块

scripting 模块,会根据用户传入的实参,解析映射文件中定义的动态 SQL 节点,并形成数据库可执行的 SQL 语句

包路径:org/apache/ibatis/scripting

395c10b1a894425d93174274ef88e977.png

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

29b6a8c1d1d145f594914a086a7254f5.png

包路径:org/apache/ibatis/cursor

ea111fcbb1d442b78f5659f956df0d5a.png

3.2.3、插件模块

MyBatis 提供了插件接口,我们可以通过添加用户自定义插件的方式对 MyBatis 进行扩展。用户自定义插件也可以改变 Mybatis 的默认行为,例如,我们可以拦截 SQL 语句并对其进行重写。

包路径:org/apache/ibatis/plugin

ee0e8e7f0c4d42388bd292836afcf5a3.png

3.3、接口层

3.3.1、session 模块

其核心是 SqlSession 接口。接口层在接收到调用请求时,会调用核心处理层的相应模块来完成具体的数据库操作

包路径:org/apache/ibatis/session

54791813b3404b519b04eec9f3f853b1.png

3.4、其他

3.4.1、JDBC 模块

JDBC 单元测试工具类

包路径:org/apache/ibatis/jdbc

8fed3dec5f804ed99bda2a39d4ed09ad.png

3.4.2、Lang 模块

里面只包含两个注解,用途不详

包路径:org/apache/ibatis/lang

d32373eb85b7487eb324d70faec95be1.png

4、总结

Mybatis的代码还是比较简单易懂的。http://www.mybatis.org 也提供了中文文档,有兴趣的小伙伴可以翻阅查看哦。后续的文章,将会逐步讲解各个模块,敬请期待!

Mybatis源码解析传送门

MyBatis源码分析(一):搭建调试环境

MyBatis源码分析(三):解析器模块

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小徐很努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值