MyBatis 的底层设计主要围绕几个核心概念:SqlSession、SqlSessionFactory、Executor、StatementHandler、ParameterHandler、ResultSetHandler、MappedStatement 和 MyBatis 配置的解析。以下是这些组件的设计和作用:
1. **SqlSessionFactory**:
- 负责创建 SqlSession 实例。
- 通过 `SqlSessionFactoryBuilder` 构建,通常使用 XML 配置文件或注解来配置。
2. **SqlSession**:
- 是 MyBatis 工作的主要执行对象,提供了执行命令、获取映射器和管理事务的方法。
- 它不是线程安全的,每个线程都应该有自己的 SqlSession 实例。
3. **Executor**:
- 是 MyBatis 执行命令的核心,负责生成预处理语句、管理事务和获取结果集。
- 有三种类型:`SimpleExecutor`、`ReuseExecutor`、`BatchExecutor`,分别用于简单执行、执行结果复用和批量操作。
4. **StatementHandler**:
- 负责创建和管理 JDBC Statement 对象,设置 SQL 命令参数。
- 处理 JDBC 预编译语句的创建、参数绑定和结果集的映射。
5. **ParameterHandler**:
- 负责对用户传递的参数进行处理,将其转换成 JDBC 需要的参数形式。
6. **ResultSetHandler**:
- 负责从 JDBC 结果集中提取数据并转换为 Java 对象。
- 处理结果集的映射和对象的创建。
7. **MappedStatement**:
- 存储了 SQL 语句和结果映射信息。
- 每个映射的 SQL 语句在 MyBatis 配置中都有一个对应的 MappedStatement 对象。
8. **Configuration**:
- 存储了所有 MyBatis 的配置信息,包括映射器、类型别名、类型处理器等。
- 由 `XMLConfigBuilder` 解析 MyBatis 配置文件生成。
9. **TypeHandler** 和 **TypeAlias**:
- `TypeHandler` 负责 Java 类型和 JDBC 类型之间的转换。
- `TypeAlias` 用于定义类型别名,简化配置。
10. **Plugin**:
- 允许开发者自定义 MyBatis 插件,如分页插件、审计日志插件等。
11. **Transaction**:
- 管理事务的提交和回滚。
12. **Cache**:
- 提供了一级和二级缓存机制,用于提高查询性能。
MyBatis 的执行流程大致如下:
1. **初始化**:解析配置文件,创建 `SqlSessionFactory`。
2. **获取 SqlSession**:通过 `SqlSessionFactory` 获取 `SqlSession`。
3. **执行命令**:通过 `SqlSession` 执行映射的 SQL 命令。
4. **获取映射器**:通过 `SqlSession` 获取映射器接口的代理对象。
5. **执行 SQL**:映射器接口调用对应的方法,执行 SQL。
6. **处理结果**:`ResultSetHandler` 处理 JDBC 结果集,映射为 Java 对象。
MyBatis 的设计哲学是简单、灵活、易于扩展。它的设计允许开发者自定义几乎所有的组件,以满足特定的需求。通过阅读源码,你可以更深入地理解 MyBatis 的内部工作原理,并能够更好地使用它。