当前位置: 首页 > news >正文

【12.MyBatis源码剖析与架构实战】3.Executor源码剖析

MyBatis Executor 源码深度剖析

Executor是 MyBatis 中负责 SQL 执行和缓存管理的核心接口,位于SqlSession之下,是真正与数据库交互的组件。本文将深入剖析Executor的继承体系、核心实现类(BaseExecutorSimpleExecutorReuseExecutorBatchExecutorCachingExecutor),以及一级缓存、二级缓存、事务控制等关键机制。


一、Executor 接口定义

publicinterfaceExecutor{// 结果处理器标记(表示无自定义处理器)ResultHandlerNO_RESULT_HANDLER=null;// 查询方法(带分页和结果处理器)<E>List<E>query(MappedStatementms,Objectparameter,RowBoundsrowBounds,ResultHandlerresultHandler)throwsSQLException;<E>List<E>query(MappedStatementms,Objectparameter,RowBoundsrowBounds,ResultHandlerresultHandler,CacheKeykey,BoundSqlboundSql)throwsSQLException;// 刷新批处理语句(BatchExecutor 使用)List<BatchResult>flushStatements()throwsSQLException;// 更新操作(insert/update/delete)intupdate(MappedStatementms,Objectparameter)throwsSQLException;// 事务提交voidcommit(booleanrequired)throwsSQLException;// 事务回滚voidrollback(booleanrequired)throwsSQLException;// 创建缓存键(用于一级/二级缓存)CacheKeycreateCacheKey(MappedStatementms,ObjectparameterObject,RowBoundsrowBounds,BoundSqlboundSql);// 判断是否缓存命中(仅用于二级缓存)booleanisCached(MappedStatementms,CacheKeykey);// 清空本地缓存(一级缓存)voidclearLocalCache();// 延迟加载(处理嵌套查询)voiddeferLoad(MappedStatementms,MetaObjectresultObject,Stringproperty,CacheKeykey,Class<?>targetType);// 获取事务TransactiongetTransaction();// 关闭执行器voidclose(booleanforceRollback);// 是否已关闭booleanisClosed();// 设置执行器包装器(用于插件链)voidsetExecutorWrapper(Executorexecutor);}

二、Executor 继承体系

«interface»

Executor

+query()

+update()

+commit()

+rollback()

+flushStatements()

«abstract»

BaseExecutor

#PerpetualCache localCache

#PerpetualCache localOutputParameterCache

#Transaction transaction

#boolean closed

http://www.cnnetsun.cn/news/2020713.html

相关文章:

  • Python监控文件夹变动情况_watchdog库实现文件实时审计
  • 英雄联盟国服皮肤定制终极指南:R3nzSkin技术深度解析与安全实践
  • Playwright爬虫进阶:如何用`page.route`拦截请求、模拟登录并高效监听API数据?
  • 如何在新电脑上正确运行已部署的 Django 项目
  • 如何5分钟将B站视频转为文字?bili2text开源工具完全指南
  • 数据结构学习记录:树 + 二叉树 + 堆 从原理到手撕代码
  • PCIe 6.0的Shared Flow Control到底怎么玩?用Credit Block解决Buffer管理难题
  • Dify API跨域(CORS)配置失效终极解法:从nginx proxy_pass到FastAPI middleware的4层拦截点对照表(含Docker Compose完整配置片段)
  • 别再只会用`uvm_object_utils`了!拆解宏定义,搞懂UVM工厂注册的底层逻辑
  • 手把手教你用C++实现LR(1)语法分析器(附完整代码及避坑指南)
  • 隐形Unicode技巧:新型JavaScript混淆方法被用于针对美国PAC附属机构的网络钓鱼攻击
  • 别只用来抓包了!Burp Suite的Filter、Comparer和Decoder模块,帮你高效分析漏洞与调试API
  • Codex智能编程:告别重复造轮子
  • 杰理之一拖八工具烧录介绍【篇】
  • 从Ext4迁移到Btrfs实战:我的个人服务器数据无损转换全记录与避坑指南
  • OpencvSharp 算子学习教案之 - Cv2.Erode
  • 从GDC论文到UE5蓝图:手把手实现‘惯性化’动画过渡,让你的角色动作更物理
  • QtDataVisualization实战:用C++快速打造一个可交互的3D图表演示器(附完整源码)
  • GLM-4.1V-9B-Base应用场景:在线教育题图自动解析与知识点标注
  • 从收音机到5G:三极管频率特性模型演变史,以及它为什么今天依然重要
  • 手把手复现:用Python和OpenCV一步步理解Marr视觉计算理论的“要素图”
  • 别再手动仿真了!手把手教你配置Vivado 2018.3与ModelSim SE的联合仿真环境
  • 网络‘活地图’实战:用PyHPEcw7库+D3.js打造可点击的拓扑仪表盘
  • 首文双拼的衍生版:首嵋双拼
  • Halcon灰度投影实战:用‘简单’模式搞定二维码定位,告别Blob分析的烦恼
  • 高校大学生论文查重工具全面测评
  • 英雄联盟智能工具包:League Akari 终极使用指南与实战技巧
  • 别再被CORS报错搞懵了!手把手教你用Nginx反向代理5分钟搞定前端跨域
  • DJI Osmo Nano 4/5评测:小巧便携功能强,成冒险家与vlogger新宠!
  • Nebula 1.10 版本发布:支持 IPv6 覆盖网络,解锁多项新特性!