MyBatis本质是将接口方法调用通过配置元数据(MappedStatement)和组件协作(Executor→StatementHandler→ParameterHandler/ResultSetHandler)翻译为JDBC调用;启动阶段构建SqlSessionFactory与MappedStatement,执行阶段由SqlSession调度、Executor管控事务与缓存、StatementHandler封装JDBC操作。

面试时讲清楚 MyBatis 执行流程和底层原理,关键不是背步骤,而是讲出逻辑主线:它怎么把一个接口方法调用,变成一次数据库操作?重点突出「谁在什么时候做了什么、为什么这么设计」。
分两阶段讲清执行流程
MyBatis 的整个运行过程天然分成两个生命周期完全不同的阶段:
-
启动初始化阶段(只做一次):加载配置(
mybatis-config.xml和所有*Mapper.xml),解析 SQL 标签,为每条 SQL 创建MappedStatement对象,并全部注册进Configuration全局配置容器;再基于该配置构建唯一的SqlSessionFactory。 -
请求执行阶段(每次 CRUD 都走):从
SqlSessionFactory开启SqlSession→ 调用getMapper(UserMapper.class)获取代理对象 → 方法调用触发动态代理拦截 → 根据全限定名 + 方法名拼出statementId→ 从Configuration中查到对应MappedStatement→ 交由Executor执行。
说透三个核心组件的协作关系
不用罗列所有类,聚焦三个面试必问的“主角”,讲清它们的职责与流转:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
SqlSession 是对外统一入口,不干活,只调度。它把增删改查请求转给
Executor,自己不持有 SQL、不处理参数、不映射结果。 -
Executor 是真正干活的执行器,负责事务控制、一级缓存管理、并委派给
StatementHandler。面试可提一句:SimpleExecutor(每次新建 Statement)、ReuseExecutor(复用 Statement)、BatchExecutor(批量执行)——体现你懂扩展性设计。 -
StatementHandler 才是 JDBC 层的封装者:它创建
PreparedStatement,调用ParameterHandler绑定参数(如#{id}→ps.setLong(1, id)),再调用ResultSetHandler把结果集自动映射成 Java 对象(支持resultType或resultMap)。
点明关键设计意图,展现理解深度
光说“是什么”不够,要带一句“为什么”:
立即学习“Java免费学习笔记(深入)”;
- 用
SqlSessionFactory全局单例 +SqlSession每次新建,既保证配置复用、提升性能,又避免线程安全问题; - 一级缓存默认开启、作用域为
SqlSession,是因为同一次会话内重复查询同一数据大概率无需再查库; - Mapper 接口没有实现类,靠 JDK 动态代理生成代理对象,本质是把方法签名映射为
MappedStatement的查找动作——这就是“面向接口编程”在框架层的落地。
结尾可快速收束,强化印象
一句话总结:MyBatis 的本质,是把开发者写的接口方法,通过配置驱动的元数据(MappedStatement)和责任链式的组件协作(Executor → StatementHandler → ParameterHandler/ResultSetHandler),最终翻译成标准 JDBC 调用。它没消灭 JDBC,而是把它藏得更干净、用得更聪明。

















