MyBatis执行流程分初始化和运行两阶段:初始化时解析配置生成Configuration,再构建线程安全的SqlSessionFactory;运行时通过Mapper代理获取MappedStatement,经ParameterHandler、Executor、ResultSetHandler协作完成SQL执行与结果映射,设计上强调职责分离、可扩展与开发体验。

面试时讲清楚 MyBatis 执行流程,关键不是背步骤,而是说清“谁在什么时候做了什么、为什么这么设计”。你可以按初始化和运行两大阶段来组织,突出组件职责与协作逻辑。
初始化阶段:构建全局能力
这一阶段只发生一次,核心是把配置变成内存中的对象体系。
- MyBatis 先加载 mybatis-config.xml 和所有 Mapper XML(或注解),解析成一个 Configuration 对象——它是整个框架的配置中枢,存着数据源、事务、映射语句、类型处理器等全部信息。
- 接着用 SqlSessionFactoryBuilder 基于 Configuration 构建出 SqlSessionFactory。它是个线程安全的单例工厂,不操作数据库,只负责生产 SqlSession。
- 这个过程屏蔽了 JDBC 驱动注册、连接池初始化等底层细节,让上层无需感知资源如何准备。
运行阶段:一次查询的完整链路
每次调用 Mapper 方法,都触发一条轻量级执行路径:
- 通过 SqlSession.getMapper(XXXMapper.class) 获取接口代理对象——本质是 JDK 动态代理,由 MapperProxy 拦截方法调用。
- 代理内部根据方法签名查到对应的 MappedStatement(封装了 SQL、参数类型、结果映射等元信息)。
- 参数经 ParameterHandler 绑定到 PreparedStatement;SQL 由 Executor(如 SimpleExecutor)执行,它还管理一级缓存。
- 查询结果交由 ResultSetHandler 处理:按 resultMap 规则,用 TypeHandler 完成字段到 Java 属性的类型转换与赋值。
特别要提的设计意图
这样讲能让面试官看到你理解背后的权衡:
立即学习“Java免费学习笔记(深入)”;
- 代理机制让开发者写接口方法就能查库,不用碰 JDBC 模板代码;
- Configuration 统一持有所有配置,组件间通过它共享上下文,避免参数层层传递;
- Executor、StatementHandler 等职责分离,便于替换(比如换 BatchExecutor 做批量插入)或增强(通过插件拦截);
- 延迟加载、一级缓存这些优化,都是基于这个分层结构自然延伸出来的,不是硬塞的功能。
不复杂但容易忽略。


















