1. MyBatis源码架构全景解析
作为Java生态中最受欢迎的ORM框架之一,MyBatis以其独特的SQL与代码解耦设计赢得了开发者青睐。我在实际项目中使用MyBatis已有五年时间,期间经历过各种复杂业务场景的考验。今天我将从源码层面,带大家深入理解这个框架的精妙设计。
MyBatis的核心价值在于它既保留了直接编写SQL的灵活性,又通过智能映射机制减轻了开发者的重复劳动。与Hibernate等全自动ORM不同,MyBatis采用了一种"半自动化"的折中方案——开发者需要编写SQL,但不必处理繁琐的结果集映射。这种设计哲学贯穿了整个框架的源码实现。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心执行流程拆解
2.1 从接口方法到SQL执行的全链路
当我们在Service层调用userMapper.selectById(1)时,背后其实触发了一个精密的执行链条:
-
动态代理拦截:MyBatis启动时会为每个Mapper接口生成
MapperProxy代理实例。这个代理类使用JDK动态代理技术,拦截所有接口方法调用。我在调试时发现,代理对象会缓存方法签名与SQL语句的映射关系,避免重复解析。 -
方法参数转换:
MapperMethod类负责将Java方法调用转换为数据库操作命令。它会处理各种参数情况:- 单个基本类型参数直接使用
- 多个参数会封装成Map
- 使用
@Param注解的参数会按指定名称处理
-
SQL会话调度:
SqlSession作为门面接口,将操作委托给Executor执行器。这里采用了经典的命令模式,使得SQL执行过程与具体实现解耦。
2.2 执行器与缓存机制
Executor是MyBatis执行体系的核心引擎,采用模板方法模式定义了SQL执行的标准流程:
java复制public abstract class BaseExecutor implements Executor {
// 查询方法模板
public <E> List<E> query(...) {
// 1. 创建缓存Key
CacheKey key = createCacheKey(...);
// 2. 检查一级缓存
