一、核心原理:从JDBC封装到动态代理的ORM哲学
MyBatis的核心设计理念是对JDBC的轻量化封装,通过动态代理和配置驱动实现SQL与Java对象的解耦。其核心流程可分为三阶段:
- 初始化阶段
通过SqlSessionFactoryBuilder解析mybatis-config.xml和Mapper.xml,构建全局配置对象Configuration。该对象整合了数据源、事务管理器、类型处理器、插件链等组件,并注册所有MappedStatement(每个SQL标签的元数据封装)。 - 代理阶段
SqlSession.getMapper()通过MapperProxyFactory生成接口代理类,将方法调用映射为MappedStatement的唯一标识(如namespace.id)。代理类MapperProxy利用MapperMethod将方法参数转换为SQL参数对象,并调用SqlSession执行。 - 执行阶段
Executor作为执行引擎,通过模板方法模式处理一级缓存(BaseExecutor)、二级缓存(CachingExecutor装饰器)及SQL解析。最终由StatementHandler、ParameterHandler、ResultSetHandler完成JDBC底层操作,实现结果集到Java对象的映射。
二、核心源码:从配置解析到执行链路的关键实现
1. 初始化源码解析
- 配置加载:XMLConfigBuilder.parse()逐层解析配置文件,将<environments>转换为Environment对象(含数据源和事务工厂),<mappers>扫描生成MapperProxyFactory并注册到MapperRegistry。
- Mapper绑定:MapperAnnotationBuilder解析接口方法上的注解(如@Select),或通过XML的<select>标签生成MappedStatement,并注册到Configuration.mappedStatements。
2. 动态代理与执行链路
- 代理生成:MapperProxy.invoke()通过cachedMapperMethod缓存方法元数据,调用SqlSession.selectList()时,结合BoundSql动态生成参数化SQL。
- 执行器分层:SimpleExecutor(默认)每次创建新Statement,ReuseExecutor复用预处理语句,BatchExecutor支持批量操作。CachingExecutor通过TransactionalCacheManager实现跨会话的二级缓存。
三、调优技巧:性能与稳定性的双重提升
1. 缓存优化
- 一级缓存:默认开启(SqlSession级别),适用于单会话重复查询,但需注意事务隔离级别(如STATEMENT级别会立即清除缓存)。
- 二级缓存:需显式配置<cache/>,建议结合Redis等分布式缓存,避免集群环境下数据不一致问题。
2. 执行策略优化
- 批量操作:使用BatchExecutor并设置rewriteBatchedStatements=true(MySQL驱动参数),可提升插入性能10倍以上。
- 懒加载:通过aggressiveLazyLoading=false延迟加载关联对象,减少不必要的数据查询。
3. 连接与语句优化
- 连接池配置:POOLED数据源的poolMaximumActiveConnections和poolMaximumIdleConnections需根据并发量调整,避免连接泄漏。
- 预处理语句重用:启用ReuseExecutor减少SQL解析开销,适用于高频重复SQL场景。
四、云原生:MyBatis在分布式时代的进化
1. 动态数据源与多租户
- 多环境适配:通过Environment配置多数据源,结合Spring Cloud的动态路由,实现分库分表或读写分离。
- 配置中心集成:将mybatis-config.xml外置至Nacos或Consul,支持运行时热更新SQL超时时间、缓存策略等参数。
2. 容器化与资源治理
- 连接池弹性:在Kubernetes环境中,结合HikariCP的动态扩容能力,根据Pod负载自动调整连接数上限。
- 分布式事务:通过Seata的AT模式与MyBatis事务管理器整合,保障跨服务的ACID特性。
结语:从ORM到云原生的技术闭环
MyBatis凭借其灵活性(动态SQL、插件扩展)和透明性(源码可追溯性),在传统应用与云原生架构中均占据重要地位。深入理解其原理与源码,结合调优技巧与云原生实践,可构建高性能、易维护的数据访问层。未来,随着Serverless和Service Mesh的普及,MyBatis或将进一步与Sidecar模式结合,实现更细粒度的SQL治理。