MyBatis 四大组件深度剖析:从原理到实战

沉默是金,总会发光

大家好,我是沉默

最近有粉丝私信我:"面试官上来就问 MyBatis 的四大核心组件,我脑子一片空白,最后只能尴尬说自己主要写业务代码..."

听着是不是有点耳熟?

其实不只是你,很多程序员都对 MyBatis 的底层机制"只闻其声、不见其形"。

今天就带大家把这四大组件------Executor、StatementHandler、ParameterHandler、ResultSetHandler------的职责、原理和关键流程彻底捋一遍,附上精炼示例,帮你在面试或项目调优中脱颖而出。

**-**01-

MyBatis 四大组件职责

scss 复制代码
┌───────────────────────────────────────┐│              Executor                │  ← 事务 & 缓存管理,调度执行│   ┌───────────┬───────────┬──────────┐││   │           │           │          │││   │ StatementHandler ─────┐          │││   │ (建 stmt / 执行 SQL)  │          │││   └───────────┬───────────┘          │││               │                      │││       ParameterHandler               │││       (填充参数)                     │││                                       │││       ResultSetHandler                │││       (映射结果)                     ││└───────────────────────────────────────┘

- 02-

MyBatis 四大组件原理和关键流程

一、Executor:老板

  • 核心职责

    1. 调度 SQL 执行
    2. 事务提交/回滚
    3. 一级缓存/二级缓存 管理
  • 主要实现

    • SimpleExecutor:每次都 new 一个 Statement,适合短命查询
    • ReuseExecutor:重用相同 SQL 的 Statement,减少重复创建
    • BatchExecutor:批量提交,适合大批量写入
    • CachingExecutor:二级缓存代理,内部持有真实 Executor
  • 执行流程(摘自 SimpleExecutor#doQuery)

perl 复制代码
// 1. 构造 StatementHandler(可被插件拦截)StatementHandler handler = configuration.newStatementHandler(    executor, ms, param, rowBounds, resultHandler, boundSql);// 2. 准备 JDBC StatementStatement stmt = handler.prepare(connection, transactionTimeout);// 3. 参数绑定handler.parameterize(stmt);// 4. 真正执行并返回结果return handler.query(stmt, resultHandler);

二、StatementHandler:部门经理

  • 核心职责

    1. prepare() → 根据 SQL 类型(简单/预编译/存储过程)创建对应 Statement
    2. parameterize() → 委派给 ParameterHandler 绑定参数
    3. query()/update() → 调用 JDBC 执行,委托 ResultSetHandler 处理结果
  • 常用实现

    • RoutingStatementHandler:根据 SQL 类型路由到具体 Handler
    • SimpleStatementHandler:执行无参静态 SQL
    • PreparedStatementHandler:执行带 #{} 参数的预编译 SQL
    • CallableStatementHandler:执行存储过程
  • 示例:PreparedStatementHandler.query

java 复制代码
@Overridepublic <E> List<E> query(Statement stmt, ResultHandler resultHandler) throws SQLException {  PreparedStatement ps = (PreparedStatement) stmt;  ps.execute();                             // 执行 SQL  return resultSetHandler.handleResultSets(ps); // 委派结果映射}

三、ParameterHandler:翻译官

  • 核心职责

    将 Java 方法入参,转换并填充到 SQL 中的 "?" 占位符。

  • 默认实现 :DefaultParameterHandler

css 复制代码
@Overridepublic void setParameters(PreparedStatement ps) throws SQLException {  List<ParameterMapping> mappings = boundSql.getParameterMappings();  for (int i = 0; i < mappings.size(); i++) {    ParameterMapping pm = mappings.get(i);    Object value = /* 从 parameterObject 或 additionalParameter 拿到值 */;    TypeHandler th = pm.getTypeHandler();    th.setParameter(ps, i + 1, value, pm.getJdbcType());  }}
  • TypeHandler(类型处理器)
    • BaseTypeHandler 提供 setParameter 框架,交由子类实现 setNonNullParameter
    • 常见子类:StringTypeHandler、DoubleTypeHandler、DateTypeHandler...

四、ResultSetHandler:讲解员

  • 核心职责
    将 JDBC ResultSet 按照映射规则,构造成 Java 对象或集合。
  • 默认实现 :DefaultResultSetHandler
java 复制代码
private <E> List<E> handleResultSets(Statement stmt) throws SQLException {  ResultSet rs = stmt.getResultSet();  List<E> results = new ArrayList<>();  while (rs.next()) {    // 1. 构造目标对象(通过反射/构造函数)    Object row = createResultObject(rs, resultMap);    // 2. 按列映射属性并填充    applyPropertyMappings(rs, row, resultMap);    results.add((E) row);  }  return results;}
  • ResultHandler 与 ResultSetHandler
    • ResultSetHandler 负责"整批"读取并 map 出对象

    • ResultHandler(如 DefaultResultHandler)负责"逐条"消费,灵活自定义

- 03-

简单案例

单表查询全流程示意

sql 复制代码
// 1. 用户调用 Mapper 接口List<User> users = userMapper.selectAll();// 2. Executor#doQuery 调度StatementHandler sh = config.newStatementHandler(...);PreparedStatement ps = sh.prepare(conn, timeout);sh.parameterize(ps);// 3. JDBC 执行 & ResultSetHandler 映射ps.execute();List<User> list = sh.<User>query(ps, resultHandler);// 4. Executor 返回用户return list;

**-****04-**总结

  • Executor:全局调度者,掌控事务与缓存

  • StatementHandler:部门经理,管控 SQL 执行链路

  • ParameterHandler:翻译官,负责入参→JDBC

  • ResultSetHandler:讲解员,ResultSet→Java

掌握这四大组件的职责和协作原理,不仅能帮你在面试中游刃有余,也能为项目性能调优打下扎实基础。

复制代码

**-****05-**粉丝福利

r 复制代码
我这里创建一个程序员成长&副业交流群, 


 和一群志同道合的小伙伴,一起聚焦自身发展, 

可以聊:


技术成长与职业规划,分享路线图、面试经验和效率工具, 




探讨多种副业变现路径,从写作课程到私活接单, 




主题活动、打卡挑战和项目组队,让志同道合的伙伴互帮互助、共同进步。 




如果你对这个特别的群,感兴趣的, 
可以加一下, 微信通过后会拉你入群, 
 但是任何人在群里打任何广告,都会被我T掉。 
相关推荐
Joy T5 小时前
Agent 确定性上下文设计:从 Prompt 参数注入到能力分层
java·开发语言·微服务·架构·prompt·agent context
微订校园外卖平台7 小时前
同城外卖小程序开发:校园外卖系统四端架构与订单链路拆解
架构·外卖系统·本地生活·微订
m0_587383008 小时前
广州 24 小时自助健身房解决方案技术实现与实战指南
java·spring·小程序·架构·需求分析
牛战士coding8 小时前
AI Agent 如何接入真实业务系统?订单助手三层架构完整拆解
人工智能·架构
·云扬·8 小时前
Prompt 工程与安全:从 System 设计到注入防御
java·人工智能·安全·ai·prompt
收放扳机8 小时前
PCB收放板设备机械手架构选型参考——三轴/四轴/六轴/蜘蛛手对比
人工智能·科技·架构·自动化·制造·pcb工艺
九卷9 小时前
企业级Agent系统整体技术架构介绍
ai·架构·大模型·llm·agent·智能体
代码不停9 小时前
自动化测试(java)
java·开发语言·selenium·自动化
行百里er9 小时前
Redis 完结篇——Redis 热点问题在 Spring Boot 项目中实战
redis·后端
高频因子挖掘机10 小时前
只取最近 60 个交易日,却每次拉全历史:量化脚本变慢的原因与改法
后端·github·api