男男床做视频网站上海家装设计网站
引言
MyBatis 是一款轻量级的持久层框架,通过灵活的 SQL 映射和高效的执行机制,成为 Java 开发中的热门选择。要深入掌握 MyBatis 的工作原理,理解其核心类及其职责至关重要。本文将带你梳理 MyBatis 的关键类、初始化流程以及它们之间的协作关系,帮助你构建完整的 MyBatis 架构知识体系。
🧱 一、MyBatis 核心类概览
MyBatis 的核心类构成了其运行时的骨架,每个类都承担着特定的职责。以下是核心类的层级结构图:
SqlSessionFactoryBuilder↓
SqlSessionFactory (DefaultSqlSessionFactory)↓
SqlSession (DefaultSqlSession)↓
Executor↓
StatementHandler↓
ParameterHandler / TypeHandler / ResultSetHandler
📌 二、关键类职责详解
1. SqlSessionFactoryBuilder
- 包路径:
org.apache.ibatis.session.SqlSessionFactoryBuilder - 职责:
- 使用建造者模式(Builder Pattern)构建
SqlSessionFactory。 - 通过加载
mybatis-config.xml配置文件或 Java API 方式创建Configuration对象。
- 使用建造者模式(Builder Pattern)构建
- 特点:
- 是临时对象,通常在应用启动时使用一次后丢弃。
2. SqlSessionFactory
- 实现类:
DefaultSqlSessionFactory - 包路径:
org.apache.ibatis.session.SqlSessionFactory - 职责:
- 创建
SqlSession实例。 - 包含全局唯一的
Configuration实例,管理 MyBatis 的全局配置(如数据源、事务工厂、插件等)。
- 创建
- 特点:
- 线程安全,通常在应用生命周期内只初始化一次。
3. SqlSession
- 实现类:
DefaultSqlSession - 包路径:
org.apache.ibatis.session.SqlSession - 职责:
- 提供操作数据库的核心 API(如
selectList,insert,update,delete)。 - 是非线程安全的,每次请求应使用独立的
SqlSession实例。
- 提供操作数据库的核心 API(如
- 底层依赖:
- 通过
Executor执行 SQL 操作。
- 通过
4. Executor
- 实现类:
SimpleExecutor,ReuseExecutor,BatchExecutor - 包路径:
org.apache.ibatis.executor.Executor - 职责:
- SQL 执行引擎的核心,负责 SQL 的实际执行及缓存管理。
- 支持一级缓存(本地缓存)和二级缓存(跨 SqlSession 缓存)。
- 特点:
- 可通过拦截器(Interceptor)扩展功能(如分页、日志记录)。
5. MappedStatement
- 包路径:
org.apache.ibatis.mapping.MappedStatement - 职责:
- 封装一条 SQL 映射信息,包括 SQL 语句、参数类型、结果映射等。
- 每个 XML 中的
<select>、<update>等标签或注解中的 SQL 对应一个MappedStatement。
- 存储位置:
- 注册在
Configuration.mappedStatements中。
- 注册在
6. Configuration
- 包路径:
org.apache.ibatis.session.Configuration - 职责:
- MyBatis 全局配置的核心对象,包含数据库连接池、事务工厂、插件拦截器、语言驱动器等。
- 在初始化时由
SqlSessionFactoryBuilder加载生成。
- 扩展点:
- 支持自定义
LanguageDriver(如 Groovy、Velocity 模板引擎)。
- 支持自定义
7. StatementHandler
- 实现类:
RoutingStatementHandler,SimpleStatementHandler,PreparedStatementHandler,CallableStatementHandler - 包路径:
org.apache.ibatis.executor.statement.StatementHandler - 职责:
- 封装 JDBC 的
Statement、PreparedStatement、CallableStatement。 - 负责与 JDBC 层交互,执行 SQL。
- 封装 JDBC 的
- 扩展点:
- 可通过拦截器修改 SQL 或参数(如分页插件)。
8. ParameterHandler
- 实现类:
DefaultParameterHandler - 包路径:
org.apache.ibatis.executor.parameter.ParameterHandler - 职责:
- 将 Java 对象转换为 JDBC 类型并设置到
PreparedStatement中。 - 依赖
TypeHandler完成类型转换。
- 将 Java 对象转换为 JDBC 类型并设置到
9. TypeHandler
- 接口:
org.apache.ibatis.type.TypeHandler - 职责:
- 实现 Java 类型与 JDBC 类型之间的双向转换。
- MyBatis 内置了常见类型的处理器(如 Integer、String),也支持自定义。
10. ResultSetHandler
- 实现类:
DefaultResultSetHandler - 包路径:
org.apache.ibatis.executor.resultset.ResultSetHandler - 职责:
- 处理 JDBC 查询返回的
ResultSet,将其转换为 Java 对象。 - 支持一对一、一对多等复杂结果映射。
- 处理 JDBC 查询返回的
🧩 三、MyBatis 初始化流程解析
-
加载配置文件
- 通过
SqlSessionFactoryBuilder.build()方法读取mybatis-config.xml。 - 解析全局配置,构建
Configuration对象。
- 通过
-
解析映射文件
- 加载 Mapper XML 文件或注解中的 SQL 映射信息。
- 将每条 SQL 封装为
MappedStatement,注册到Configuration中。
-
创建
SqlSessionFactory- 返回
DefaultSqlSessionFactory实例,包含完整的Configuration。
- 返回
-
创建
SqlSession- 调用
sqlSessionFactory.openSession()创建SqlSession。 SqlSession内部持有Executor实例。
- 调用
-
执行 SQL
- 通过
SqlSession的 API(如selectList)触发 SQL 执行。 - 流程:
Executor→StatementHandler→ JDBC →ParameterHandler/ResultSetHandler。
- 通过
🎯 四、设计模式与扩展性
MyBatis 的设计融合了多种经典设计模式,提升了灵活性和可扩展性:
- 建造者模式:
SqlSessionFactoryBuilder负责构建SqlSessionFactory。 - 工厂模式:
SqlSessionFactory创建SqlSession。 - 代理模式:Mapper 接口通过动态代理生成实现类。
- 模板方法模式:
Executor的执行流程定义了骨架,具体步骤由子类实现。
扩展点示例:
- 自定义
LanguageDriver支持 Groovy、Velocity 等脚本语言。 - 通过拦截器(Interceptor)增强 SQL 执行逻辑(如分页、日志、权限控制)。
- 自定义
TypeHandler处理复杂类型转换(如 JSON、枚举)。
📚 五、总结与进阶建议
核心类职责一览表
| 类名 | 职责简述 |
|---|---|
SqlSessionFactoryBuilder | 构建 SqlSessionFactory |
SqlSessionFactory | 创建 SqlSession |
SqlSession | 提供数据库操作 API |
Executor | SQL 执行引擎 |
MappedStatement | 单条 SQL 的封装 |
Configuration | 全局配置管理器 |
StatementHandler | JDBC Statement 操作 |
ParameterHandler | 设置 SQL 参数 |
TypeHandler | Java 与 JDBC 类型转换 |
ResultSetHandler | 结果集处理 |
进阶学习方向
- 插件开发:研究拦截器机制,实现自定义插件(如审计日志、性能监控)。
- 缓存机制:深入理解一级缓存、二级缓存的实现原理。
- 动态 SQL:分析 XMLLanguageDriver 如何解析
<if>,<foreach>等标签。 - 懒加载:探索关联对象延迟加载的实现细节。
