MyBatis执行SQL的完整原理及各步骤设计模式解析
ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花
MyBatis作为主流的ORM框架,核心价值是简化JDBC操作、实现SQL与代码解耦,其SQL执行流程分为全局初始化(加载配置)和运行时执行(SQL调度)两大阶段,每个环节都依托经典设计模式实现解耦、扩展与复用。下文按执行顺序拆解步骤,同步说明对应设计模式、实现载体和设计意图。
一、MyBatis全局初始化阶段(启动加载,仅执行一次)
该阶段核心是加载核心配置、映射文件,解析SQL语句,构建全局上下文对象,为后续SQL执行做准备,是设计模式密集应用的环节。
步骤1:加载配置文件(mybatis-config.xml、Mapper.xml)
核心动作:读取XML配置文件、注解配置,解析数据源、事务、Mapper接口、SQL语句、结果映射等信息。
用到的设计模式:建造者模式(Builder)
- 实现载体:XMLConfigBuilder、XMLMapperBuilder、SqlSessionFactoryBuilder
- 设计意图:配置解析流程复杂、参数繁多,Builder模式分离对象构建与表示,分步组装Configuration核心对象,屏蔽底层解析细节,对外提供简洁的构建入口。
- 关键逻辑:SqlSessionFactoryBuilder调用XMLConfigBuilder解析全局配置,最终封装为Configuration对象。
步骤2:构建Configuration核心配置对象
核心动作:整合所有解析后的配置信息,存储Mapper接口、SQL语句、缓存、插件、类型转换器等全局元数据。
用到的设计模式:单例模式(Singleton)
- 实现载体:Configuration全局单例、TypeHandlerRegistry、MapperRegistry
- 设计意图:全局配置只需一份实例,避免重复解析、资源浪费,保证整个应用生命周期内配置唯一性。
步骤3:创建SqlSessionFactory工厂对象
核心动作:基于Configuration对象,生产SqlSession会话实例,SqlSession是MyBatis操作数据库的核心入口。
用到的设计模式:工厂方法模式(Factory Method)
- 实现载体:SqlSessionFactory接口、DefaultSqlSessionFactory实现类
- 设计意图:封装SqlSession创建细节,屏蔽底层连接获取、事务初始化逻辑,对外统一获取会话的入口,方便切换不同SqlSession实现。
二、MyBatis运行时SQL执行阶段(业务调用,每次查询/更新执行)
该阶段是用户调用Mapper接口、执行SQL的核心流程,分为获取会话、代理调用、SQL解析、参数处理、JDBC执行、结果映射六大步骤。
步骤4:获取SqlSession会话对象
核心动作:通过SqlSessionFactory.openSession()获取SqlSession实例,同时获取数据库连接、初始化事务上下文。
用到的设计模式:工厂方法模式+适配器模式(Adapter)
- 工厂方法:延续SqlSessionFactory的职责,标准化会话创建流程。
- 适配器模式:TransactionFactory适配不同事务实现(JDBC事务、MANAGED事务),统一事务管理接口;DataSource适配不同数据源实现。
步骤5:获取Mapper接口代理对象
核心动作:调用sqlSession.getMapper(XXXMapper.class),获取Mapper接口的动态代理对象,MyBatis通过代理拦截接口方法。
用到的设计模式:动态代理模式(JDK Proxy)+ 工厂模式
- 实现载体:MapperProxyFactory、MapperProxy(实现InvocationHandler)
- 设计意图:Mapper接口无实现类,动态代理拦截方法调用,将接口方法映射到对应的SQL语句,实现SQL与业务代码解耦;MapperProxyFactory批量生产代理对象,简化创建逻辑。
步骤6:代理拦截,定位MappedStatement(SQL元数据)
核心动作:代理对象拦截方法后,根据方法全限定名,从Configuration中查找对应的MappedStatement(封装SQL、参数映射、结果映射、缓存策略等元数据)。
用到的设计模式:策略模式(Strategy)+ 门面模式(Facade)
- 策略模式:MappedStatement封装不同SQL的执行策略(查询、更新、存储过程),统一调度入口。
- 门面模式:Configuration对外提供统一的MappedStatement查询入口,屏蔽内部注册表、缓存查找细节。
步骤7:参数处理与SQL预处理
核心动作:解析SQL中的#{}占位符,将用户传入的参数转换为JDBC可识别的参数类型,完成参数映射;生成可执行的JDBC PreparedStatement。
用到的设计模式:策略模式+模板方法模式(Template Method)
- 策略模式:TypeHandler接口适配不同数据类型(String/Integer/Date等)的参数转换,不同类型对应不同TypeHandler实现。
- 模板方法模式:ParameterHandler定义参数处理流程,子类实现具体参数赋值逻辑,固定流程、可变细节。
步骤8:执行SQL(查询/更新)
核心动作:通过Executor执行器调度JDBC操作,分为一级缓存校验、SQL执行、事务管理三大环节。
用到的设计模式:模板方法模式+装饰器模式(Decorator)+ 策略模式
- 模板方法模式:Executor接口定义执行流程(缓存校验→执行SQL→结果处理),SimpleExecutor、ReuseExecutor、BatchExecutor实现具体逻辑。
- 装饰器模式:CachingExecutor装饰基础Executor,在不改动原有执行逻辑的前提下,新增二级缓存功能,实现功能动态增强。
- 策略模式:根据配置切换Executor实现(简单/复用/批量执行器),适配不同业务场景。
步骤9:结果集映射(ResultSet→Java对象)
核心动作:解析JDBC返回的ResultSet,根据ResultMap配置,将数据库列名映射为Java对象属性,封装为POJO/集合返回。
用到的设计模式:模板方法模式+策略模式+组合模式(Composite)
- 模板方法模式:ResultSetHandler定义结果映射流程,子类实现具体解析逻辑。
- 策略模式:复用TypeHandler完成数据库类型到Java类型的转换。
- 组合模式:ResultMap嵌套映射(一对一、一对多),用组合模式处理复杂对象映射关系。
步骤10:释放资源与事务提交/回滚
核心动作:关闭ResultSet、Statement、数据库连接,提交/回滚事务,清理会话资源。
用到的设计模式:模板方法模式
- 实现载体:Executor、SqlSession的close()/commit()/rollback()方法
- 设计意图:固定资源释放、事务管理流程,统一异常处理和资源回收逻辑,避免资源泄漏。
三、核心设计模式汇总表
建造者模式 | 配置解析、对象构建 | 简化复杂对象创建,分离构建与表示 |
单例模式 | 全局Configuration、注册表 | 保证全局实例唯一,避免资源重复 |
工厂方法模式 | SqlSessionFactory、Mapper代理创建 | 封装对象创建细节,统一入口 |
动态代理模式 | Mapper接口调用 | 无实现类拦截方法,映射SQL语句 |
装饰器模式 | Executor缓存增强 | 动态扩展功能,不改动原有逻辑 |
模板方法模式 | SQL执行、参数/结果处理 | 固定流程,封装可变细节 |
策略模式 | 类型转换、执行器切换 | 适配不同场景,实现算法互换 |
适配器模式 | 事务、数据源适配 | 兼容不同第三方组件,统一接口 |
核心总结:MyBatis通过设计模式实现了高内聚、低耦合,核心流程标准化、扩展点灵活化,既保证了框架的稳定性,又支持插件、自定义类型处理器、多数据源等场景扩展。
ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花
本专栏聚焦Java主流持久层框架MyBatis,从基础搭建到源码原理,系统拆解核心组件、动态SQL、结果映射与缓存机制。助力开发者从入门到精通,掌握高效数据层开发技能,适配电商、金融等复杂业务场景。

查看11道真题和解析