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

Mybatis 源码解读-SqlSession 会话源码和Executor SQL操作执行器源码

作者源码阅读笔记主要采用金山云文档记录的,所有的交互图和代码阅读笔记都是记录在云文档里面,本平台的文档编辑实在不方便,会导致我梳理的交互图和文档失去原来的格式,所以整理在文档里面,供大家阅读交流.

【金山文档 | WPS云文档】 SqlSession 会话源码和Executor SQL操作执行器源码

SqlSession 是框架与数据库交互的核心接口。

核心功能

  1. SQL 操作执行

‌提供 insert()update()delete()select() 等方法直接执行 SQL 语句,支持参数绑定与结果映射‌

  1. 事务管理

‌通过 commit()rollback() 控制事务提交与回滚,需手动调用(非自动提交模式)‌

  1. Mapper 接口代理

通过 getMapper(Class<T> type) 动态生成 Mapper 接口实现类,实现面向对象式数据库操作‌

  1. 缓存管理

‌默认启用一级缓存(会话级),缓存相同 SQL 查询结果,通过 clearCache() 可手动清空‌。‌

Executor 包是 MyBatis 执行 SQL 操作的核心引擎,位于 org.apache.ibatis.executor 包下,负责协调 SQL 执行全流程(包括缓存管理、事务控制、参数处理、结果映射等)

Executor 包是 MyBatis 的 ‌SQL 执行中枢‌,通过多态实现支持基础操作、缓存优化、批量处理等场景,并协调四大组件完成从 SQL 解析到结果映射的全链路操作‌

‌核心接口与实现

Executor 接口

定义 SQL 执行的标准方法:

public interface Executor {int update(MappedStatement ms, Object parameter);         // 执行更新操作<E> List<E> query(...);                                  // 执行查询操作void commit(boolean required);                           // 提交事务void rollback(boolean required);                         // 回滚事务CacheKey createCacheKey(...);                            // 创建缓存键boolean isCached(MappedStatement ms, CacheKey key);      // 检查缓存
}

基础实现类(BaseExecutor 子类)

类型

‌特点‌

‌适用场景‌

SimpleExecutor

默认执行器,每次执行创建新 Statement,执行后立即关闭

常规单条 SQL 操作

ReuseExecutor

复用 Statement 对象,缓存相同 SQL 的 Statement 以减少重复编译开销

高频重复 SQL

BatchExecutor

批量执行 SQL,通过 addBatch() 缓存操作,调用 flushStatements() 统一提交

批量插入/更新

增强实现类 CachingExecutor

  • 二级缓存代理‌:装饰器模式,在基础执行器外层添加二级缓存逻辑‌
  • 工作流程‌:
  1. 优先查询二级缓存(MappedStatement 级别);
  2. 缓存未命中时委托底层执行器(如 SimpleExecutor)查询数据库

‌协作组件

Executor 通过组合模式调用其他三大组件:

‌组件‌

‌职责‌

‌依赖关系‌

StatementHandler

处理 Statement 创建与参数绑定

Executor 调用其执行 SQL

ParameterHandler

转换参数类型并填充到 PreparedStatement

StatementHandler 调用

ResultSetHandler

封装结果集到 Java 对象

StatementHandler 调用

相关重要类介绍说明

SqlSessionManager 类

名称

描述

默认值

sqlSessionFactory

核心作用

  • 作为底层工厂实例,用于创建原生 SqlSession 对象(通过 openSe
http://www.lryc.cn/news/621314.html

相关文章:

  • 《Python函数:从入门到精通,一文掌握函数编程精髓》
  • Transformer网络结构解析
  • 《嵌入式 C 语言编码规范与工程实践个人笔记》参考华为C语言规范标准
  • CNN - 卷积层
  • GaussDB数据库架构师修炼(十六) 如何选择磁盘
  • 《算法导论》第 24 章 - 单源最短路径
  • 20250814 最小生成树总结
  • Java 大视界 -- Java 大数据机器学习模型在金融欺诈检测与防范策略制定中的应用(397)
  • 【Demo】AI-ModelScope/bert-base-uncase 模型训练及使用
  • 市面上有没有可以导入自有AI算法模型的低空平台?
  • pytorch学习笔记-Loss的使用、在神经网络中加入Loss、优化器(optimizer)的使用
  • Linux 对 YUM 包的管理
  • HTTPS 工作原理
  • Java使用Apache POI读取Excel文件
  • dkms安装nvidia驱动和多内核支持
  • label studio 服务器端打开+xshell端口转发设置
  • UniApp 中使用 tui-xecharts插件(或类似图表库如 uCharts)
  • 2025年Java大厂面试场景题全解析:高频考点与实战攻略
  • 20道DOM相关前端面试题
  • Java面试场景题大全精简版
  • VSCode打开新的文件夹之后当前打开的文件夹被覆盖
  • 树形DP详解
  • 基于springboot的信息化在线教学平台的设计与实现(源码+论文)
  • 2025天府杯数学建模C题
  • Python网络爬虫(二) - 解析静态网页
  • MFC的使用——使用ChartCtrl绘制曲线
  • 数据结构初阶(13)排序算法-选择排序(选择排序、堆排序)(动图演示)
  • 手机实时提取SIM卡打电话的信令声音-整体解决方案规划
  • 百度智能云x中科大脑:「城市智能体」如何让城市更会思考
  • pyecharts可视化图表-pie:从入门到精通