题目
MyBatis 工作原理
答案
@[toc] --- ![](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/5-1ZF4130T31N.png) ## 步骤 1:MyBatis 配置文件解析 **读取 MyBatis 配置文件**:`MyBatis-config.xml` 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。在解析过程中,MyBatis 使用 `XMLConfigBuilder` 类来读取配置文件,并构建一个 `Configuration` 对象,该对象包含了 MyBatis 的核心配置信息,如数据库连接池、事务管理器、映射关系等。 ![](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/image-20230624153029545.png) 其中这个 `Map<String, MappedStatement> mappedStatements` 非常关键,`mapper.xml` SQL映射文件中的 namespace + id 是这个 map 的 key,通**过这个 map 可以将 `mapper.xml` SQL映射文件和 Mapper 接口关联起来** ## 步骤 2:加载映射文件 **加载映射文件**。映射文件即 SQL 映射文件(`mapper.xml`),该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 MyBatis-config.xml 中加载。MyBatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。 ## 步骤 3:构造会话工厂 **构造会话工厂**:通过 MyBatis 的环境等配置信息构建会话工厂 `SQLSessionFactory`,这个工厂的目的就是创建 SQLSession 对象 ## 步骤 4:通过工厂创建会话对象 **通过工厂创建会话对象**:由会话工厂创建 `SQLSession` 接口对象,该接口中包含了执行 SQL 语句的所有方法,其接口定义如下: ![](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/image-20230624110720788.png) **SQLSession 接口的底层其实是基于 Executor 执行的**,可以打开 SQLSession 接口实现类 DefaultSQLSession 的随便一个方法看一下: ![](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/image-20230624110925996.png) ## 步骤 5:`Executor` 执行器 **`Executor` 执行器**:MyBatis 底层定义了一个 `Executor` 接口来操作数据库,它将根据 SQLSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。 其实是对 JDBC API 的封装,直接操作数据库的还是 JDBC ![](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/image-20230624111919396.png) ## 步骤 6:`MappedStatement` 对象 **`MappedStatement` 对象**:在 Executor 接口的执行方法中有一个 `MappedStatement` 类型的参数,该参数是对映射信息(输入参数 or 输出结果)的封装,用于存储要映射的 SQL 语句的 id、参数等信息。映射信息类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。 ![](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/image-20230624105141145.png)