[Java 面试突击训练] MyBatis 架构分析

MyBatis 整体架构

[Java 面试突击训练] MyBatis 架构分析_第1张图片

基础支持层
类型 描述
反射模块 对Java原生的反射进行了良好的封装,提供了更加简洁易用的 API,方便上层调用,并且对反射操作进行了一系列优化,例如缓存了类的元数据,提高了反射操作的性能。
类型转换模块 Mybatis 为简化配置文件提供了别名机制,是类型转换模块的主要功能之一。另一个功能是实现 JDBC 类型与 Java 类型之间的转换,该功能在为 SQL 语句绑定实参以及映射查询结果集时都会涉及。
日志模块 提供详细的日志输出信息,适配第三方日志框架。主要使用:适配器模式、代理模式
资源加载模块 对类加载器进行封装,确定类加载器的使用顺序,提供了加载类文件以及其他资源文件的功能。
解析器模块 一个功能是对 XPath 进行封装,为 Mybatis 初始化时解析 mybatis-config.xml 配置文件以及映射配置文件提供支持。另一个功能是为处理动态 SQL 语句中的占位符提供支持
数据源模块 提供了相应的数据源实现,也提供了与第三方数据源集成的接口。主要使用:工厂模式
事务管理 对数据库的事务进行了抽象,自身提供了相应的事务接口和简单实现。
缓存模块 提供了一级缓存和二级缓存,需要注意的是 Mybatis 自带的缓存与应用程序在同一个 JVM 中,共享同一块堆内存。因此缓存较大时可能影响系统性能。主要使用:装饰器模式
Binding模块 将用户自定义的 Mapper 接口与映射配置文件关联起来,系统可以通过调用自定义 Mapper 接口中的方法执行相应的 SQL 语句完成数据库操作。
数据源模块

常见的数据源组件都实现了 DataSource 接口,Mybatis 自身实现的数据源也不例外。此外,还提供了两个实现,分别是 PooledDataSource 和 UnpooledDataSource。Mybatis 使用 DataSourceFactory 接口实现创建不同类型的 DataSource。

PooledDataSource
  • PooledDataSource.popConnection()
    [Java 面试突击训练] MyBatis 架构分析_第2张图片
  • PooledDataSource.pushConnection()
    [Java 面试突击训练] MyBatis 架构分析_第3张图片
缓存模块

Cache 接口是缓存模块中最核心的接口。Mybatis 因为涉及动态 SQL 等因素,其缓存的 key 不能仅仅通过一个 String 表示,所以提供了 CacheKey 类来表示缓存项的 key。

核心处理层
类型 描述
配置解析 在 Mybatis 初始化过程中,会加载 mybatis-config.xml 配置文件、映射配置文件以及 Mapper 接口中的注解信息,解析后的配置信息会形成相应的对象并保存到 Configuration 对象中。之后,利用该 Configuration 对象创建 SqlSessionFactory 对象。待 Mybatis 初始化之后,开发人员可以通过初始化得到 SqlSessionFactory 并创建 SqlSession 对象,完成数据库操作。
SQL 解析 实现动态 SQL 语句的功能,提供了多种动态 SQL 语句对应的节点(where, if, foreach 等)。
SQL执行 涉及多个组件,比较重要的有 Executor, StatementHandler, ParameterHandler 和 ResultSetHandler。Executor 主要负责维护一级缓存和二级缓存,并提供事务管理的相关操作,它会将数据库相关操作委托给 StatementHandler 完成。StatementHandler 首先通过 ParameterHandler 完成 SQL 语句的实参绑定,然后通过 Statement 对象执行 SQL 语句并得到结果集,最后通过 ResultSetHandler 完成结果集的映射,得到结果对象并返回。

Mybatis 执行一条 SQL 语句的大致流程
[Java 面试突击训练] MyBatis 架构分析_第4张图片

接口层

接口层相对简单,其核心是 SqlSession 接口,该接口定义了 Mybatis 暴露给应用程序调用的 API,也就是与上层应用交互的桥梁。接口层在接收到调用请求时,会调用核心处理层的相应模块完成具体的操作。主要使用:策略模式

你可能感兴趣的:(Java,面试)