MyBatis整体架构分为三层:基础支持层、核心处理层、接口层。
基础支持层:
- 反射模块:
- 类型转换模块:MyBatis为简化配置文件提供了别名机制;
为SQL语句绑定实参以及映射查询结果集(实现JDBC类型与java类型之间的转换)都是类型转换模块的功能。
在为SQL绑定实参时将java类型转换成JDBC类型,在映射结果集时,会将数据由JDBC类型转换为java类型。 - 日志模块:
- 资源加载模块:对类加载器进行封装,确定类加载器的使用顺序,并提供了加载类文件及其他资源文件的功能。
- 解析器模块:1:对XPath进行封装,为MyBatis初始化时解析mybatisConfig.xml配置文件以及映射配置文件提供支持;
2:为处理动态SQL语句中的占位符提供支持。
{ xml解析常见的方式有三种:DOM(Document Object Model)、SAX(Simple API for XML)、StAX(Streaming API for XML);
MyBatis在初始化过程中处理mybatisConfig.xml配置文件及映射配置文件时,使用的是DOM解析方式,并结合使用XPath解析XML配置文件。
DOM是基于树形结构的XML解析方式,它会将整个XML文档读入内存并构建一个DOM树,基于这棵树形结构对各个节点(Node)进行操作。}
- 数据源模块:
- 事务模块:
- 缓存模块:
- Binding模块:将用户自定义的Mapper接口与映射配置文件关联起来,系统可以通过调用自定义Mapper接口中的方法执行相应的SQL语句完成数据库操作。
开发人员无需编写自定义Mapper接口的实现,MyBatis会自动为创建动态代理对象。
核心处理层:
- 配置解析:在MyBatis初始化过程中,会加载mybatisConfig.xml配置文件、映射配置文件以及Mapper接口中的注解信息,解析后的配置信息会形成相应的对象并保存到Configuration对象中。
- SQL解析和scripting模块:MyBatis实现动态SQL语句功能,提供了多种动态SQL对应的节点,例如节点,节点,节点等。通过这些节点的组合使用,开发员可以写出满足各种需求的动态SQL语句。
MyBatis的scripting模块会根据用户传入的实参,解析映射文件中定义的动态SQL节点,并形成数据库可执行的SQL语句。
之后处理占位符,绑定用户传入的实参。 - SQL执行:执行SQL比较重要的几个组件:Executor、StatementHandler、ParameterHandler、ResultSetHandler。
Executor主要负责维护一级缓存和二级缓存,并提供事务管理的相关操作,它会将数据库相关操作托付给StatementHandler完成;
StatementHandler首先通过ParameterHandler完成SQL语句的实参绑定,然后通过java.sql.Statement对象执行SQL语句,并得到结果集;
最后通过ResultSetHandler完成结果集的映射,得到结果对象并返回。
插件:MyBatis提供了插件接口,可以通过添加用户自定义插件进行MyBatis的扩展。
mybatis整体架构图