mybatis核心架构分三层:左为接口层(sqlsession与usermapper双向代理)、中为核心处理层(executor→statementhandler→parameterhandler/resultsethandler)、右为基础支撑层(configuration与datasource);一次查询从mapperproxy.invoke开始,经sqlsession、executor、statementhandler等组件协作,完成缓存校验、sql执行与结果映射;关键细节包括executor持有configuration引用及sqlsession非线程安全。

手绘 MyBatis 核心架构图不是考美术,而是考你对框架“谁干啥、谁找谁、数据怎么流”的理解是否清晰。面试官想看到的,是你能边画边讲清逻辑主线,而不是背下所有类名。
一、画图三步法:从左到右搭骨架
用白板或纸,按三层结构横向展开,不求精美,但求箭头明确、层级分明:
- 左边画接口层:写两个框——SqlSession(标“会话入口”)、UserMapper(标“动态代理接口”),中间加双向箭头,注明“getMapper() → MapperProxy 代理”
- 中间画核心处理层:自上而下排四个组件——Executor(标“执行调度中心”)、StatementHandler(标“SQL准备与执行”)、ParameterHandler(标“参数绑定”)、ResultSetHandler(标“结果映射”)。用实线单向箭头串起来:Executor → StatementHandler → ParameterHandler & ResultSetHandler
- 右边画基础支撑层:画一个大框 Configuration(标“全局配置中心”),里面简写:mappedStatements、typeHandlers、caches、dataSource;再画一个独立的 DataSource(标“连接池”),用虚线连到 Executor 和 StatementHandler
二、解释时紧扣“一次查询怎么跑通”
别平铺组件职责,就拿 userMapper.findById(1) 这一行代码说事,把流程串成故事:
- 调用开始于 MapperProxy.invoke(),它把方法签名和参数打包成 MapperMethod,再交给 SqlSession
- SqlSession 把活儿派给持有的 Executor,Executor 先查一级缓存,没命中就继续往下传
- Executor 找 Configuration 拿出 MappedStatement(含SQL文本、参数类型、结果映射规则),再交给 StatementHandler
- StatementHandler 调 ParameterHandler 把 Java 参数(如数字1)转成 JDBC 可识别的 PreparedStatement.setLong();再调 JDBC 执行 SQL
- 拿到 ResultSet 后,StatementHandler 交由 ResultSetHandler 处理,后者用 TypeHandler 做字段→属性类型转换,最终组装成 User 对象返回
三、点睛之笔:补两个关键细节
画完主干后,快速加两处小标注,立刻体现深度:
- 在 Executor 和 Configuration 之间画个双向虚线,写:“持有 Configuration 引用,从中获取 MappedStatement、Cache、TypeHandler”
- 在 SqlSession 框旁加注:“非线程安全,每次请求 new 一个,用完 close”——这是高频考点,顺带提一句“一级缓存在 SqlSession 级别”
讲清楚这三条线,架构图就立住了。重点不在画得多像,而在每一步都答得出“为什么是它干,而不是别人干”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











