MyBatis整体架构分为三层:基础支持层、核心处理层、接口层。
1、基础支持层
基础支持层包含MyBatis整个基础模块,其为核心处理层提供了良好的支持。
- 反射模块
对Java原生反射进行了良好的封装,提供了更加简洁的API供上层使用。并对缓存进行了一系列的优化。例如缓存了类的元数据,提高了反射操作的性能。
- 类型转换模块
为简化配置文件,提供了别名机制。该机制是其主要功能之一。另一个功能是实现JDBC类型与Java类型之间的转换,该功能在为SQL绑定实参以及映射查询结果集时都将涉及。在为SQL绑定实参时,会将Java类型转换为JDBC类型。而在映射结果集时,会将JDBC类型转换为Java类型。
- 日志模块
MyBatis作为一个设计优良的框架,处理提供详细的日志输出信息,还要能够集成多种日志框架。其日志模块的一个主要功能就是集成第三方日志框架。
- 资源加载模块
主要对类加载器进行封装,确定类加载器的使用顺序,并提供了加载类文件及其他资源文件的功能。
- 解析器模块
主要提供了两个功能:一个是对XPath进行封装,为MyBatis初始化解析 mybatis-config.xml 配置文件以及其他映射配置文件提供支持。另一个功能是为处理动态SQL的占位符提供支持。
- 数据源模块
现在开源数据源都提供了非常丰富的功能。例如连接池、检测连接状态等。MyBatis提供了自身的数据源实现。当然也提供了集成第三方数据源的接口。
- 事务管理模块
MyBatis对数据库的事务进行了抽象,其自身提供了相应的事务接口和简单实现。在很多场景中,MyBatis会与Spring进行集成,并有Spring进行事务的管理。
- 缓存模块
MyBatis中提供了一级缓存和二级缓存。需要注意的是,其提供的缓存与整个应用是运行在同一个JVM中的,共享一块堆内存,当缓存的数据量较大时,可能影响系统其他功能的使用,所以当要缓存的数据比较大时,应优先考虑使用Redis、Memcache等缓存中间价。
- Binding模块
在通过 sqlSession 相应方法执行数据库操作时,需要指定映射文件中的SQL节点,若出行拼写错误时,只能在运行时才能发现,为尽早发现该种错误,通过该模块将用户自定义的Mapper接口与映射配置文件进行关联。系统可以通过调用Mapper中的方法执行相应的SQL完成数据库操作,从而避免上述操作。
开发人员无需对自定义Mapper接口进行实现,MyBatis会自动为其创建代理对象,在某些场景中,自定义Mapper接口完全可以替代映射配置文件,但有些映射规则及SQL语句的定义还是卸载映射配置文件中更好,例如动态SQL语句。
2、核心处理层
核心处理层实现了MyBatis的核心处理流程,包括MyBatis的初始化以及完成一次数据库操作设计的全部流程
- 配置解析
MyBatis初始化过程中,会将 mybatis-config.xml、映射配置文件以及Mapper接口中的注解信息进行解析加载,解析后的信息会形成相应的对象并保存到 Configuration 对象中。之后利用 Configuration 对象创建SqlSessionFactory 对象。初始化完成之后,可以通过 SqlSessionFactory 创建 SqlSession 对象并完成数据库的操作。
- SQL解析与scripting模块
拼接SQL语句,提供实现动态SQL语句的功能,提供了许多节点。如 、、等。
scripting模块会根据用户传入的实参,解析映射文件中定义的动态SQL节点,生成数据库可执行的SQL语句。之后会处理语句中的占位符,绑定传入的实参。
- SQL执行
SQL的执行设计到多个组件,比较重要的包含 Executor、StatementHandler、ParameterHandler、ResultSetHandler。Executor 主要负责维护一级缓存、二级缓存,并提供事务管理相关的操作,它会将数据库相关操作委托给 StatementHandler 完成。StatementHandler 首先通过 ParameterHandler 完成实参的绑定,然后通过 java.sql.Statement 对象执行SQL语句得到数据结果集,最后通过 ResultSetHandler 完成结果集的映射,得到结果并返回。
- 插件
Mybatis并不能完美契合所有场景,因此提供了插件接口。使用者可以通过添加自定义的插件来对MyBatis的功能进行扩展。自定义插件也可以改变MyBatis的默认行为。例如可以拦截SQL语句并对其进行重写。
3、接口层
相对简单,其核心为 SqlSession 接口,该接口中定义了MyBatis暴露给应用程序调用的API。是上层应用与MyBatis交互的桥梁。接口层在收到调用请求时,会调用核心处理层的相应模块来完成具体的数据库操作。