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

MyBatis源码分析(二):项目结构_第1张图片

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

MyBatis源码分析(二):项目结构_第2张图片

2、代码统计

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

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

安装 Statistic
1、打开IDEA的设置
2、选择插件[plugin]
3、选择[browse repositories)
4、搜索 Statistic
5、安装
MyBatis源码分析(二):项目结构_第3张图片

使用 Statistic

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

MyBatis源码分析(二):项目结构_第4张图片

使用 Statistic我们可以看到

MyBatis源码分析(二):项目结构_第5张图片

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

MyBatis源码分析(二):项目结构_第6张图片

3、整体架构

MyBatis 的整体架构分为三层:

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

MyBatis源码分析(二):项目结构_第7张图片

3.1、基础支持层

3.1.1、反射模块

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

包路径:org/apache/ibatis/reflection

MyBatis源码分析(二):项目结构_第8张图片

3.1.2、类型模块

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

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

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

包路径:org/apache/ibatis/type

 

MyBatis源码分析(二):项目结构_第9张图片

3.1.3、日志模块

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

包路径:org/apache/ibatis/type

MyBatis源码分析(二):项目结构_第10张图片

3.1.4、IO模块

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

包路径:org/apache/ibatis/io

MyBatis源码分析(二):项目结构_第11张图片

3.1.5、解析器模块

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

包路径:org/apache/ibatis/parsing

MyBatis源码分析(二):项目结构_第12张图片

3.1.6、数据源模块

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

包路径:org/apache/ibatis/datasource

MyBatis源码分析(二):项目结构_第13张图片

3.1.7、缓存模块

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

包路径:org/apache/ibatis/cache

MyBatis源码分析(二):项目结构_第14张图片

3.1.8、Binding 模块

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

包路径:org/apache/ibatis/binding

MyBatis源码分析(二):项目结构_第15张图片

3.1.9、注解模块

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

包路径:org/apache/ibatis/annotations

MyBatis源码分析(二):项目结构_第16张图片

3.1.10、异常模块

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

包路径:org/apache/ibatis/exceptions

MyBatis源码分析(二):项目结构_第17张图片

3.2、核心处理层

3.2.1、配置解析模块

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

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

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

包路径:org/apache/ibatis/builder 

MyBatis源码分析(二):项目结构_第18张图片

包路径:org/apache/ibatis/mapping

MyBatis源码分析(二):项目结构_第19张图片

3.2.2、SQL解析模块

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

包路径:org/apache/ibatis/scripting

MyBatis源码分析(二):项目结构_第20张图片

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

MyBatis源码分析(二):项目结构_第21张图片

包路径:org/apache/ibatis/cursor

MyBatis源码分析(二):项目结构_第22张图片

3.2.3、插件模块

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

包路径:org/apache/ibatis/plugin

MyBatis源码分析(二):项目结构_第23张图片

3.3、接口层

3.3.1、session 模块

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

包路径:org/apache/ibatis/session

MyBatis源码分析(二):项目结构_第24张图片

3.4、其他

3.4.1、JDBC 模块

JDBC 单元测试工具类

包路径:org/apache/ibatis/jdbc

MyBatis源码分析(二):项目结构_第25张图片

3.4.2、Lang 模块

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

包路径:org/apache/ibatis/lang

MyBatis源码分析(二):项目结构_第26张图片

4、总结

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

Mybatis源码解析传送门

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

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

 

 

 

 

你可能感兴趣的:(源码解读,mybatis,java,开发语言)