题目
MyBatis 工作原理
答案
@[toc]
---

## 步骤 1:MyBatis 配置文件解析
**读取 MyBatis 配置文件**:`MyBatis-config.xml` 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。在解析过程中,MyBatis 使用 `XMLConfigBuilder` 类来读取配置文件,并构建一个 `Configuration` 对象,该对象包含了 MyBatis 的核心配置信息,如数据库连接池、事务管理器、映射关系等。

其中这个 `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 语句的所有方法,其接口定义如下:

**SQLSession 接口的底层其实是基于 Executor 执行的**,可以打开 SQLSession 接口实现类 DefaultSQLSession 的随便一个方法看一下:

## 步骤 5:`Executor` 执行器
**`Executor` 执行器**:MyBatis 底层定义了一个 `Executor` 接口来操作数据库,它将根据 SQLSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。
其实是对 JDBC API 的封装,直接操作数据库的还是 JDBC

## 步骤 6:`MappedStatement` 对象
**`MappedStatement` 对象**:在 Executor 接口的执行方法中有一个 `MappedStatement` 类型的参数,该参数是对映射信息(输入参数 or 输出结果)的封装,用于存储要映射的 SQL 语句的 id、参数等信息。映射信息类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。

