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

发布时间:2024年01月07日

目录

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源码分析(三):解析器模块

?

?

?

?

文章来源:https://blog.csdn.net/weixin_44543482/article/details/135327066
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。