My Batis 的 整体架构分为三层 , 分别 是基础支持层 、核心处理层和 接口层。
image.png
基础支持层
反射模块
MyBatis 中专门提供了反射模块,该模块对 Java 原生的反射进行了良好的封装,提供了更加简洁易用的 API ,方便上层使调用,并且对反射操作进行了 一系列优化,例如缓存了类的元数据,提高了反射操作的性能 。
类型转换模块
MyBatis 为简化配置文件提供了别名机制 , 该机制是类型转换模块的主要功能之一 。 类型转换模块的另一个功能是实现 JDBC 类型与 Java 类型之间的转换,该功能在为 SQL 语句绑定实参以及 映射查询结果集 时都会涉及。在为 SQL 语句绑定实参时, 会将数据由 Java 类型转换成 JDBC 类型;而在映射结果集时,会将数据由 JDBC 类型转换成 Java 类型。
日志模块
MyBatis 作为 个设计优良的框架,除了提供详细的日志输出信息,还要能够集成多种日志框架,其日志模块的 个主要功能就是集成第方日志框架。
资源加载模块
资源加载模块主要是对类加载器进行封装,确定类加载器的使用顺序,并提供了加载类文件以及其他资源文件的功能 。
解析器模块
解析器模块的主要提供了两个功能 : 一个功能是对 XPath 进行封装,为 MyBatis 初始化时解析 mybatis-config.xml 配置文件以及映射配置文件提供支持;另一个功能是为处理动态 SQL 语句中的占位符提供支持。
数据源模块
MyBatis 自身提供了相应的数据源实现,当然 MyBatis 也提供了与第三方数据源集成的接口,这些功能都位于数据源模块之中 。
事务管理
My Batis 对数据库中的事务进行了抽象,其自身提供了相 应的事务接口和简单实现。在很多场景中, MyBatis 会与 Spring 框架集成,并由 Spring 框架管理事务。
缓存模块
在优化系统性能时 ,优化数据库性能是非常重要的 一个环节,而添加缓存则是优化数据库时最有效的手段之一 。
image.png
My Batis 中 提供了 一级缓存和 二级缓存,而这两级缓存都是依赖于基础支持层中的缓存模块实现的。这里需要读者注意的是, MyBatis 中自带的这两级缓存与 MyBatis 以及整个应用是运行在同一个 川币4 中的,共享同 一块堆内存。如果这两级缓存中的数据量较大, 则可能影响系统中其他功能的运行,所以 当需要缓存大量数据时 ,优先考虑使用 Redis 、 Memcache 等缓存产品。
Binding 模块
MyBatis 通过 Binding 模块将用户自定义的 Mapper 接口与映射配置文件关联起来,系统可以通过调用自定义 Mapper 接口中的方法执行相应的 SQL 语句完成数据库操作。
核心处理层
在核心处理层中实现了 MyBatis 的核心处理流程,其中包括 MyBatis 的初始化以及完成一次数据库操作的涉及的全部流程 。
配置解析
在 MyBatis 初始化过程中,会加载 mybatis-config.xml 配置文件、映射配置文件以及Mapper 接口中的注解信息,解析后的配置信息会形成相应的对象并保存到Configuration 对象中 。
SQL 解析与 Scripting 模块
MyBatis 实现动态 SQL 语句的功能,提供了多种动态 SQL 语句对应的节点,例如 <where>节点、<if>节点、<foreach>节点等 。My Batis 中的 Scripting 模块会根据用户传入的实参,解析映射文件中定义的动态 SQL节点,并形成数据库可执行的 SQL 语句 。之后会处理 SQL 语句中的占位符,绑定用户传入的实参。
SQL 执行
SQL 语句的执行涉及多个组件 ,其中比 较重要的是 Executor 、 StatementHandler 、ParameterHandler 和 RsultSetHandler 。 Executor 主要负责维护一级级缓存和二级缓存,并提供事务管理的相关操作 ,它会将数据库相关操作委托给 StatementHandler 完成。StatementHandler 首先通过 ParameterHandler 完成 SQL 语句的实参绑定,然后通过java.sql.Statement 对 象执行 SQL 语句并得到 结果集,最后通过 ResultSetHandler 完成结果集的映射 ,得到结果对象并返回 。图 1-5 展示了 MyBatis 执行一条 SQL 语句的大致过程。
image.png
@ 插件
用户自定义插件也可以改变 Mybatis 的默认行为 ,例如,我们可以拦截 SQL 语句并对其进行重写。
主要类
mybatis-component.png主要类的调用关系
mybaits-component-use.png源码仓库
本项目克隆了 mybatis 源码,并对类进行了详细注解。
网友评论