Mybatis整体架构
- 基础支持层:
- 反射模块:对 Java 原生的反射进行了封装,且对反射操作进行了优化,缓存了类的元数据,提高了反射操作的性能。
- 类型转换模块:提供别名机制和JDBC类型与Java类型转换。
- 日志模块:主要集成第三方日志框架。
- 资源加载模块:对类加载器进行封装,确定类加载器的使用顺序,并提供了加载类文件以及其他资源文件的功能。
- 解析器模块:一是提供对XPath的封装以解析初始化配置文件和映射配置文件;二是处理动态SQL中的占位符。
- 数据源模块:基础功能组件,包括连接池功能、连接状态检测等。
- 事务管理模块:对数据库中的事务进行了抽象,其提供了相应的事务接口和简单实现。
- 缓存模块:提供了缓存以减少数据库压力,依赖JVM内存提供缓存功能。
- Binding模块:通过 Binding 模块将用户自定义的Mapper接口与映射配置文件关联,系统通过调用自定义Mapper接口中的方法执行相应SQL语句。
- 核心处理层:
- 配置解析:加载mybatis配置文件、映射配置文件以及Mapper接口中的注解信息,解析后的配置信息会形成相应的对象并保存到Configuration 对象中。
- <resultMap>节点(即 ResultSet 的映射规则)会被解析成 ResultMap;示例中定义的<result> 节点(即属性映射)会被解析成ResultMapping等。
- SQL 解析与 scripting 模块:解析并处理文件中的动态SQL,替换如<where>等生成MySQL可解析的SQL,再通过scripting模块用传入参数替换占位符。
- SQL 执行:语句的执行涉及包括在Executor、StatementHandler、ParameterHandler和ResultSetHandler。
- Executor:负责维护一级缓存和二级缓存,并提供事务管理的相关操作,数据库相关操作委托给 StatementHandler 完成,再通过 ParameterHandler 完成SQL语句的实参绑定,通过 Statement 对象执行SQL语句并得到结果集,最后通过 ResultSetHandler 完成结果集的映射,得到结果对象并返回 。
- 插件:通过自定义插件对Mybatis功能进行拓展。
- 配置解析:加载mybatis配置文件、映射配置文件以及Mapper接口中的注解信息,解析后的配置信息会形成相应的对象并保存到Configuration 对象中。
- 接口层:
- SqlSession接口:MyBatis 暴露给应用程序调用的 API ,也就是上层应用与MyBatis 交互的桥梁。