当前位置: 首页 > ds >正文

MyBatis 核心类详解与架构解析:从入门到源码级理解

引言

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 对象。
  • 特点
    • 是临时对象,通常在应用启动时使用一次后丢弃。

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 实例。
  • 底层依赖
    • 通过 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 的 StatementPreparedStatementCallableStatement
    • 负责与 JDBC 层交互,执行 SQL。
  • 扩展点
    • 可通过拦截器修改 SQL 或参数(如分页插件)。

8. ParameterHandler

  • 实现类DefaultParameterHandler
  • 包路径org.apache.ibatis.executor.parameter.ParameterHandler
  • 职责
    • 将 Java 对象转换为 JDBC 类型并设置到 PreparedStatement 中。
    • 依赖 TypeHandler 完成类型转换。

9. TypeHandler

  • 接口org.apache.ibatis.type.TypeHandler
  • 职责
    • 实现 Java 类型与 JDBC 类型之间的双向转换。
    • MyBatis 内置了常见类型的处理器(如 Integer、String),也支持自定义。

10. ResultSetHandler

  • 实现类DefaultResultSetHandler
  • 包路径org.apache.ibatis.executor.resultset.ResultSetHandler
  • 职责
    • 处理 JDBC 查询返回的 ResultSet,将其转换为 Java 对象。
    • 支持一对一、一对多等复杂结果映射。

🧩 三、MyBatis 初始化流程解析

  1. 加载配置文件

    • 通过 SqlSessionFactoryBuilder.build() 方法读取 mybatis-config.xml
    • 解析全局配置,构建 Configuration 对象。
  2. 解析映射文件

    • 加载 Mapper XML 文件或注解中的 SQL 映射信息。
    • 将每条 SQL 封装为 MappedStatement,注册到 Configuration 中。
  3. 创建 SqlSessionFactory

    • 返回 DefaultSqlSessionFactory 实例,包含完整的 Configuration
  4. 创建 SqlSession

    • 调用 sqlSessionFactory.openSession() 创建 SqlSession
    • SqlSession 内部持有 Executor 实例。
  5. 执行 SQL

    • 通过 SqlSession 的 API(如 selectList)触发 SQL 执行。
    • 流程:ExecutorStatementHandler → JDBC → ParameterHandler/ResultSetHandler

🎯 四、设计模式与扩展性

MyBatis 的设计融合了多种经典设计模式,提升了灵活性和可扩展性:

  • 建造者模式SqlSessionFactoryBuilder 负责构建 SqlSessionFactory
  • 工厂模式SqlSessionFactory 创建 SqlSession
  • 代理模式:Mapper 接口通过动态代理生成实现类。
  • 模板方法模式Executor 的执行流程定义了骨架,具体步骤由子类实现。

扩展点示例

  • 自定义 LanguageDriver 支持 Groovy、Velocity 等脚本语言。
  • 通过拦截器(Interceptor)增强 SQL 执行逻辑(如分页、日志、权限控制)。
  • 自定义 TypeHandler 处理复杂类型转换(如 JSON、枚举)。

📚 五、总结与进阶建议

核心类职责一览表

类名职责简述
SqlSessionFactoryBuilder构建 SqlSessionFactory
SqlSessionFactory创建 SqlSession
SqlSession提供数据库操作 API
ExecutorSQL 执行引擎
MappedStatement单条 SQL 的封装
Configuration全局配置管理器
StatementHandlerJDBC Statement 操作
ParameterHandler设置 SQL 参数
TypeHandlerJava 与 JDBC 类型转换
ResultSetHandler结果集处理

进阶学习方向

  • 插件开发:研究拦截器机制,实现自定义插件(如审计日志、性能监控)。
  • 缓存机制:深入理解一级缓存、二级缓存的实现原理。
  • 动态 SQL:分析 XMLLanguageDriver 如何解析 <if>, <foreach> 等标签。
  • 懒加载:探索关联对象延迟加载的实现细节。
http://www.xdnf.cn/news/4013.html

相关文章:

  • 《前端秘籍:SCSS阴影效果全兼容指南》
  • Linux的系统周期化任务
  • ES类的索引轮换
  • JVM——JVM是怎么实现invokedynamic的?
  • HttpPrinter 是一款功能强大的跨平台 Web 打印解决方案
  • C与指针——结构与联合
  • Feign的原理
  • cesium基础设置
  • xx外卖知识补充
  • 日语学习-日语知识点小记-进阶-JLPT-N1阶段(1):语法单词
  • Jetpack Compose 边距终极指南:Margin 和 Padding 的正确处理方式
  • 详细案例,集成算法
  • 高等数学第三章---微分中值定理与导数的应用(3.3泰勒(Taylor)公式)
  • JAVA组织/岗位拉取多段时间属性到一张表上时,时间段分隔问题
  • 解释一下NGINX的反向代理和正向代理的区别?
  • 【C++重载操作符与转换】下标操作符
  • Android学习总结之事件分发机制篇
  • Java大厂面试:Java技术栈中的核心知识点
  • 25.5.4数据结构|哈夫曼树 学习笔记
  • 深度学习在自动驾驶车辆车道检测中的应用
  • 硬件工程师面试常见问题(13)
  • 一个整数n可以有多种分划,分划的整数之和为n,在不区分分划出各整数的次序时,字典序递减输出n 的各详细分划方案和分划总数,详解
  • 5.4学习记录
  • 洛谷 P2473 [SCOI2008] 奖励关
  • TS 类型别名
  • ES6入门---第三单元 模块一:类、继承
  • 【操作系统】死锁
  • [pdf,epub]292页《分析模式》漫谈合集01-59提供下载
  • 【C语言入门级教学】VS使用调试技巧1
  • 算法笔记.求约数