MyBatis核心源码深度剖析核心执行器executor和缓存原理

本文深入剖析MyBatis的Executor执行器,包括SimpleExecutor、ReuseExecutor、BatchExecutor和CachingExecutor,以及一级缓存和二级缓存的工作机制。通过对JDBC执行器的回顾,阐述了MyBatis如何封装和优化JDBC,提升数据库操作效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

  • ​​1 JDBC回顾​​
  • ​​2 MyBatis的核心执行组件介绍​​
  • ​​2.1 SqlSession​​
  • ​​2.2 Executor​​
  • ​​2.3 StatementHandler​​
  • ​​3 Executor执行器分析​​
  • ​​3.1 JDBC中的执行器​​
  • ​​3.2 Mybatis执行器​​
  • ​​3.2.1 Executor接口​​
  • ​​3.2.2 BaseExecutor(基础执行器)​​
  • ​​3.2.3 SimpleExecutor(简单执行器)​​
  • ​​3.2.4 ReuseExecutor(可重用执行器)​​
  • ​​3.2.5 BatchExecutor(批处理执行器)​​
  • ​​3.2.6 CachingExecutor(二级缓存执行器)​​
  • ​​3.3 Executor的创建:​​
  • ​​4 一级缓存​​
  • ​​5 二级缓存​​
  • ​​6 小结​​

1 JDBC回顾

  1. 回顾JDBC执行过程

    添加jar包 -> 获得连接 -> 预编译SQL -> 执行SQL,读取结果 -> 关闭事务

public static void main(String[] args) throws Exception {
  // 1、注册驱动
  DriverManager.registerDriver(new com.mysql.jdbc.Driver());
  // 2、建立连接
  Connection con =
DriverManager.getConnection("jdbc:mysql://localhost:3306/test?
useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT", "root", "root");
  // 3、编写sql,进行预编译
  String sql = " select * from tb_brand;";
  PreparedStatement ps = con.prepareStatement(sql);
  // 4、执行查询,得到结果集
  ResultSet rs = ps.executeQuery();
  while (rs.next()) {
    int bid = rs.getInt("bid");
    String bname = rs.getString("bname");
   System.out.println("====> bid=" + bid + "\tbname=" + bname);
 }
  //5、关闭事务
  rs.close();
  ps.close();
  con.close();
}
  1. MyBatis对JDBC封装的执行过程

2 MyBatis的核心执行组件介绍

在Mybatis中,SqlSession对数据库的操作,将委托给执行器Executor来完成都将委托给执行器

Executor来完成;

Mybatis执行过程,主要的执行模块是: SqlSession->Executor->StatementHandler->数据库

四个核心组件:

① 动态代理 MapperProxy

② SQL会话 SqlSession

③ 执行器 Executor

④ JDBC处理器 StatementHandler

2.1 SqlSession

SqlSession采用了门面模式方便来让我们使用。他不能跨线程使用,一级缓存生命周期和它一致;

基本功能:增删改查基本的操作功能;

辅助功能:提交、关闭会话;

门面模式:提供一个统一的门面接口API,使得系统更加容易使用。

2.2 Executor

基本功能:改、查、维护缓存;

辅助功能:提交、关闭执行器、批处理刷新;

Executor 主要负责维护一级缓存和二级缓存,并提供事务管理的相关操作,它会将数据库相关操作

委托给 StatementHandler完成。

2.3 StatementHandler

经过执行器处理后交给了StatementHandler(声明处理器);

主要作用就是:参数处理、结果处理;

StatementHandler 首先通过 ParameterHandler 完成 SQL 语句的实参绑定,然后通过

java.sql.Statement 对象执行 SQL 语句并得到结果集,最后通过 ResultSetHandler 完成结果

集的映射,得到结果对象并返回。

3 Executor执行器分析

3.1 JDBC中的执行器

JDBC有三种执行器分别是Statement(简单执行器)、PreparedStatement(预处理执行器)、

CallableStatement(存储过程执行器)

Statement:基本功能:执行静态SQL

PreparedStatement:设置预编译,防止SQL注入

CallableStatement:设置出参、读取参数(用于执行存储过程)

3.2 Mybatis执行器

Executor继承结构分析

Mybatis给我们提供了三种执行器,分别是 :

SimpleExecutor(简单执行器)、

ResuseExecutor(可重用执行器)、

BathExecutor(批处理执行器)

这三个执行器继承了一个BaseExecutor(基础执行器),而这个基础执行器实现了Executor接口,其中

简单执行器是默认的执行器。

其实还有一种执行器CachingExecutor(二级缓存执行器)你开启二级缓存则会实例化它,在 BaseExecutor

的基础上,实现二级缓存功能。 (注意: BaseExecutor 的本地缓存,就是一级缓存。)

3.2.1 Executor接口

​ ​org.apache.ibatis.executor.Executor ,执行器接口。​ ​

主要定义了以下内容:

读和写操作相关的方法

事务相关的方法

缓存相关的方法

设置延迟加载的方法

设置包装的 Executor 对象的方法

public interface Executor {
  // 空 ResultHandler 对象的枚举
  ResultHandler NO_RESULT_HANDLER = null;
  // 更新 or 插入 or 删除,由传入的 MappedStatement 的 SQL 所决定
  int update(MappedStatement ms, Object parameter) throws SQLException;
  // 查询,带 ResultHandler + CacheKey + BoundSql
  <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds,
ResultHandler resultHandler, CacheKey cacheKey, BoundSql boundSql) throws
SQLException;
  // 查询,带 ResultHandler
  <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds,
ResultHandler resultHandler) throws SQLException;
  // 查询,返回值为 Cursor
  <E> Cursor<E> queryCursor(MappedStatement ms, Object parameter, RowBounds
rowBounds) throws SQLException;
  // 刷入批处理语句
  List<BatchResult> flushStatements() throws SQLException;
  // 提交事务
  void commit(boolean required) throws SQLException;
  // 回滚事务
  void rollback(boolean required) throws SQLException;
  // 创建 CacheKey 对象
  CacheKey createCacheKey(MappedStatement ms, Object parameterObject,
RowBounds rowBounds, BoundSql boundSql);
  // 判断是否缓存
  boolean isCached(MappedStatement ms, CacheKey key);
  // 清除本地缓存
  void clearLocalCache();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值