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

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> 等标签。
  • 懒加载:探索关联对象延迟加载的实现细节。

相关文章:

  • Kotlin协程解析
  • 网狐旗舰大联盟组件源码私测笔记:结构分层、UI重构与本地实操全流程
  • RockyLinux9.3-24小时制
  • RabbitMQ 深度解析:从核心组件到复杂应用场景
  • Docker 渡渡鸟镜像同步站 使用教程
  • 【SimSession 】3:中继服务 linux和windows实现及MFC集成实现
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】3.2 缺失值检测与处理(NULL值填充/删除策略)
  • 数理性能大幅提升|暴雨一体机适配DeepSeek Prover v2
  • 在 Ubuntu 系统中,查看已安装程序的方法
  • 广东省考备考(第一天5.4)—言语
  • 【KWDB 创作者计划】_KWDB 性能优化与调优
  • C++负载均衡远程调用学习之上报功能与存储线程池
  • iview table组件 自定义表头
  • 施磊老师rpc(四)
  • ASP.NET MVC​ 入门与提高指南九
  • Java运算符学习笔记
  • 【翻译、转载】【译文】模型上下文协议(Model Context Protocol, MCP)简介
  • 邮件协议、签名与推送
  • C++23 新特性:为 std::pair 的转发构造函数添加默认实参
  • 《前端秘籍:SCSS阴影效果全兼容指南》
  • 英伟达:美国无法操纵监管机构在AI领域取胜,美企应专注创新而不是编造荒诞谣言
  • 陈芋汐世界杯总决赛卫冕夺冠,全红婵无缘三大赛“全满贯”
  • 英国传统两党受挫地方选举后反思,改革党异军突起“突破想象”
  • “五一”第三天郑州铁路局预计发送旅客76万人
  • 人民日报今日谈:为何重视这个“一体化”
  • 阿根廷发生5.6级地震,震源深度30公里