亲宝软件园·资讯

展开

MyBatis 源码分析-项目总览

liuzhiyong0718 人气:0
# MyBatis 源码分析-项目总览 ## 1.概述 本文主要大致介绍一下MyBatis的项目结构。**引用参考资料《MyBatis技术内幕》** 此外,https://mybatis.org/mybatis-3/zh/index.html MyBatis官方也提供了很不错的中文文档。对于使用中有碰到一些问题,可以参考一下。 ## 2.模块划分 MyBatis在项目模块划分还是很清晰的。各个模块层次以及具体作用,如下: | 模块 | 层次 | 定义 | | ----------- | ---------- | ------------------------------------------------------------ | | session | 接口层 | 提供给外部使用的接口API | | scripting | 核心处理层 | 解析映射文件中的动态SQL节点。并形成数据库可执行的SQL语句。 | | mapping | 核心处理层 | 映射 | | builder | 核心处理层 | 配置解析 | | executor | 核心处理层 | 执行器模块,串联整个执行流程。 | | plugin | 核心处理层 | 插件模块:提供插件接口,通过自定义插件方式对MyBatis进行拓展 | | cursor | 核心处理层 | 游标模块 | | reflection | 基础支持层 | 反射模块:mybatis专门对反射模块进行封装。提供更加简单易用的API | | type | 基础支持层 | 类型转换模块:Mybatis为简化配置提供了别名机制。提供java类型与JDBC类型转换 | | logging | 基础支持层 | 日志模块:主要是集成第三方日志 | | io | 基础支持层 | 资源加载模块:对类加载器进行了封装。确定类加载器顺序,并提供加载文件,以及其他资源的功能 | | datasource | 基础支持层 | 数据源模块:mybatis自身提供响应的数据源实现,也提供与第三方数据集成的接口。 | | transaction | 基础支持层 | 事务管理模块:Mybatis 对数据库的事务进行了抽象 | | parsing | 基础支持层 | 解析器模块:提供两个功能:1. 对XPath进行封装 2为处理动态sql语句中的占位符提供支持 | | cache | 基础支持层 | 缓存模块:提供一级缓存、二级缓存。优化查询 | | binding | 基础支持层 | Binding模块:将自定义的接口与映射配置文件关联起来。通过调用mapper接口完成数据库执行。 | | exceptions | 基础支持层 | 异常处理 | | annotations | 基础支持层 | 注解模块 | | jdbc | 其他 | JDBC模块 | | lang | 其他 | Lang模块 | ## 整体结构 整体分为三层: - 接口层:定义了MyBatis暴露给应用程序调用的API。 - 核心处理层:实现了MyBatis的核心处理流程,包括MyBatis初始化以及完成一次数据库操作的涉及的全部流程。 - 基础支持层:为核心处理层提供了良好的基础支撑。例如:反射、类型转换、日志、缓存、事务等模块。 ![](http://qiniu-cdn.janker.top/oneblog/20200104113538368.jpg) ### 3.1 基础支持层 #### 3.1.1 反射模块 对应```reflection```包 ``` Java中的反射虽然功能强大,但对大多数开发人员来说,写出高质量的反射代码还是有一定难度的。MyBatis 中专门提供了 反射模块,该模块对Java原生的反射进行了良好的封装,提供了更加简洁易用的API, 方便上层使调用,并且对反射操作进行 了一系列优化,例如缓存了类的元数据,提高了反射操作的性能。 ``` #### 3.1.2 类型转换模块 对应```type```包 ``` 正如前面示例所示,MyBatis 为简化配置文件提供了别名机制,该机制是类型转换模块的主要功能之一。 类型转换模块的 另-一个功能是实现JDBC类型与Java类型之间的转换,该功能在为SQL语句绑定实参以及映射查询结果集时都会涉及。在为 SQL语句绑定实参时,会将数据由Java类型转换成JDBC类型;而在映射结果集时,会将数据由JDBC类型转换成Java类型。类 型转换模块的具体原理在第2章详述。 ``` #### 3.1.3 日志模块 对应```logging```包 ``` 无论在开发测试环境中,还是在线上生产环境中,日志在整个系统中的地位都是非常重要的。良好的日志功能可以帮助开发人 员和测试人员快速定位Bug代码,也可以帮助运维人员快速定位性能瓶颈等问题。目前的Java世界中存在很多优秀的日志框 架,例如Log4j、Log4j2、 slf4j 等。MyBatis 作为-一个设计优良的框架,除了提供详细的日志输出信息,还要能够集 成多种日志框架,其日志模块的一个主要功能就是集成第三方日志框架。 ``` #### 3.1.4 资源加载模块 对应```io```包 ```资源加载模块主要是对类加载器进行封装,确定类加载器的使用顺序,并提供了加载 资源加载模块主要是对类加载器进行封装,确定类加载器的使用顺序,并提供了加载类文件以及其他资源文件的功能。 ``` #### 3.1.5 解析器模块 对应```parsing```包 ``` 解析器模块的主要提供了两个功能:一个功能是对XPath进行封装,为MyBatis初始化时解析mybatis- config.xml配置文 件以及映射配置文件提供支持;另一个功能是为处理动态SQL语句中的占位符提供支持。 ``` #### 3.1.6 数据源模块 对应```datasource```包 ``` 数据源是实际开发中常用的组件之一。 现在开源的数据源都提供了比较丰富的功能,例如,连接池功能、检测连接状态等, 选择性能优秀的数据源组件对于提升ORM框架乃至整个应用的性能都是非常重要的。MyBatis 自身提供了相应的数据源实 现,当然MyBatis也提供了与第三方数据源集成的接口,这些功能都位于数据源模块之中。 ``` #### 3.1.7 事务管理 对应```transaction```包 ``` MyBatis对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现。在很多场景中,MyBatis 会与Spring 框架集成,并由Spring框架管理事务 ``` #### 3.1.8 缓存模块 对应```cache```包 ``` 在优化系统性能时,优化数据库性能是非常重要的一个环节,而添加缓存则是优化数据库时最有效的手段之一。正确、合理地 使用缓存可以将一部分数据库请求拦截在缓存这一层。MyBatis 中提供了一 级缓存和二级缓存,而这两级缓存都是依赖于基 础支持层中的缓存模块实现的。这里需要读者注意的是,MyBatis中自带的这两级缓存与MyBatis 以及整个应用是运行在同 一个JVM中的,共享同一块堆内存。如果这两级缓存中的数据量较大,则可能影响系统中其他功能的运行,所以当需要缓存大 量数据时,优先考虑使用Redis、Memcache 等缓存产品。 ``` #### 3.1.9 Binding模块 对应```binding```包 ``` 通过前面的示例我们知道,在调用SqlSession相应方法执行数据库操作时,需要指定映射文件中定义的SQL节点,如果出现 拼写错误,我们只能在运行时才能发现相应的异常。为了尽早发现这种错误,MyBatis 通过Binding模块将用户自定义的 Mapper接口与映射配置文件关联起来,系统可以通过调用自定义Mapper接口中的方法执行相应的SQL语句完成数据库操作, 从而避免上述问题。值得读者注意的是,开发人员无须编写自定义Mapper接口的实现,MyBatis 会自动为其创建动态代理对 象。在有些场景中,自定义Mapper接口可以完全代替映射配置文件,但有的映射规则和SQL语句的定义还是写在映射配置文件 中比较方便,例如动态SQL语句的定义。 ``` #### 3.1.10 注解模块 对应```annotation```包 随着 Java 注解的慢慢流行,MyBatis 提供了**注解**的方式,使得我们方便的在 Mapper 接口上编写简单的数据库 SQL 操作代码,而无需像之前一样,必须编写 SQL 在 XML 格式的 Mapper 文件中。虽然说,实际场景下,大家还是喜欢在 XML 格式的 Mapper 文件中编写响应的 SQL 操作。 #### 3.1.11 异常模块 对应 `exceptions` 包 定义了 MyBatis 专有的 PersistenceException 和 TooManyResultsException 异常,此外还包ExceptionFactory异常工厂。 ### 3.2 核心处理层 #### 3.2.1 配置解析 对应```executor```包 ``` 在MyBatis初始化过程中,会加载mybatis config.xml配置文件、映射配置文件以及Mapper接口中的注解信息,解析后 的配置信息会形成相应的对象并保存到Configuration对象中。例如,示例中定义的

加载全部内容

相关教程
猜你喜欢
用户评论