Mybatis源码分析——Executor

Mybatis源码分析之-Executor   mybatis的源代码相对于spring的来说简单了很多,对于初学者,可以先了解了mybatis的源码后再去了解spring的源码,本文主要来分析下Executor的内容 Executor介绍   Executor是mybatis的一个核心接口,所有的Mapper语句的执行都是通过Executor进行的。类结构图如下 1.Executor(顶层接口)   父接口,在此接口中定义了各种处理方... 阅读详情

在 MyBatis 中,Executor 是负责执行 SQL 语句的核心组件之一,它直接与数据库进行交互。Executor 的主要任务是执行数据库操作并处理结果,支持增、删、改、查(CRUD)操作。MyBatis 中的 Executor 是一个接口,通常有几种不同的实现方式,每种实现方式适用于不同的场景。

Executor 概述

Executor 是 MyBatis 框架中执行 SQL 语句的主要接口。它处理 SQL 会话的生命周期,负责查询、插入、更新和删除操作。Executor 的实现通过执行缓存、事务控制、结果映射等功能进行优化。

Executor 接口的主要方法

Executor 接口有多个方法,主要有以下几种:

  1. update(MapperStatement ms, Object parameter):

    • 执行更新操作,如 INSERT、UPDATE 或 DELETE。
    • MapperStatement 包含 SQL 语句和相关元数据,parameter 是传递给 SQL 语句的参数。
    • 返回值是执行的记录数。
  2. query(MapperStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler):

    • 执行查询操作,返回查询结果。
    • RowBounds 用于分页控制,ResultHandler 用于处理查询结果。
  3. batch(MapperStatement ms, List<Object> parameters):

    • 执行批量操作。这个方法通常用于批量插入、更新或删除。
  4. commit(boolean required):

    • 提交事务。如果事务是由当前 Executor 管理的,则提交事务。
  5. rollback(boolean required):

    • 回滚事务。如果事务是由当前 Executor 管理的,则回滚事务。
  6. flushStatements():

    • 刷新所有缓存的 SQL 语句并执行它们。
  7. getTransaction():

    • 获取当前执行器的事务管理器。

Executor 的实现类

Executor 接口有几个不同的实现类,分别适用于不同的场景:

  1. SimpleExecutor:

    • 是 MyBatis 中最基本的 Executor 实现,每次执行 SQL 语句时都会重新创建一个 Statement(如 PreparedStatement),并立即执行 SQL 语句。
    • 适用于对性能要求不高、对事务控制要求较简单的场景。
    • 它不使用缓存,每次执行都会查询数据库。
  2. ReuseExecutor:

    • 这个实现会缓存已创建的 Statement(即 PreparedStatement),下次相同 SQL 会复用该 Statement。
    • 可以提高性能,避免重复解析相同的 SQL。
    • 适用于重复执行相同 SQL 的场景。
  3. BatchExecutor:

    • 该实现将多个 SQL 操作合并为一个批量操作,通过 addBatch 和 executeBatch 来减少数据库交互的次数,适用于批量操作。
    • 适用于批量插入、更新、删除的场景。

事务管理与 Executor

Executor 通常与 MyBatis 的事务管理紧密结合。Executor 的事务控制方法,如 commit() 和 rollback(),与数据库事务密切相关。MyBatis 提供了一个统一的事务管理接口,并通过 Executor 来执行事务提交与回滚。

  • 在事务模式下,Executor 会在每次执行 SQL 语句时检查是否需要开启新事务,或者在同一事务内执行。
  • Executor 会根据事务的提交和回滚状态,确保数据库操作的一致性。

Executor 和 StatementHandler 的关系

Executor 与 StatementHandler 之间有着密切的关系。StatementHandler 负责准备 SQL 语句及其参数,而 Executor 负责执行这些语句。

  1. 执行查询时:

    • Executor 调用 StatementHandler 来准备 Statement,设置参数,然后执行 SQL 查询。
  2. 执行更新时:

    • Executor 会通过 StatementHandler 准备好 PreparedStatement,并执行更新操作。

执行 SQL 的流程

下面是 Executor 执行 SQL 的简化流程:

  1. 创建 Executor:根据配置选择 SimpleExecutor、ReuseExecutor 或 BatchExecutor。

  2. 创建 StatementHandler:Executor 会为每一个 SQL 语句创建一个 StatementHandler,负责处理 SQL 的准备和参数的绑定。

  3. 执行 SQL:

    • Executor 会调用 StatementHandler 来准备 SQL 语句和参数,然后执行 SQL 操作。
  4. 处理结果:

    • Executor 会处理 StatementHandler 返回的结果(如 ResultSet),并将结果映射为 Java 对象。
  5. 提交事务/回滚事务:在事务管理下,Executor 会处理事务的提交和回滚。

代码示例:Executor 的简化使用

public class MyBatisExecutorExample {
    public static void main(String[] args) {
        SqlSessionFactory sqlSessionFactory = ... // 获取 SqlSessionFactory
        try (SqlSession session = sqlSessionFactory.openSession()) {
            // 获取 Executor
            Executor executor = session.getExecutor();

            // 创建 MapperStatement
            MapperStatement ms = ...; // 用于描述 SQL 语句

            // 执行查询操作
            List<MyObject> result = executor.query(ms, null, RowBounds.DEFAULT, null);

            // 执行更新操作
            int rowsAffected = executor.update(ms, new Object());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

总结

  • Executor 是 MyBatis 中执行 SQL 操作的核心接口,负责执行 CRUD 操作,处理事务提交/回滚,以及缓存和批量操作的优化。
  • 它的实现类(如 SimpleExecutor、ReuseExecutor 和 BatchExecutor)适用于不同的使用场景,提供了不同的性能优化和事务控制方式。
  • Executor 通常与 StatementHandler 一起协作,StatementHandler 负责 SQL 语句的创建和参数绑定,而 Executor 负责执行这些语句并处理事务。

Executor 是 MyBatis 中的核心部分,理解它的工作原理对于深入学习 MyBatis 框架至关重要。

SQLExecutor   本系统用于对 Microsoft SQL Server 数据库或 Access 数据库进行维护。例如,金蝶、用友的数据库或其他应用系统的数据库。 基本思想:   为方便管理软件数据库的维护,系统将用于维护数据库的 SQL 程序划分为事务和任务来进行管理。事务是最基本的单位,一个用于维护数据库的任务包含一个或者多个事务。任务不仅包含事务,同时也包含了事务执行的顺序。两个包含相同事务的任务,如果其中事务的执行序列不同,则也应视为不同任务。   事务在用户指定的目标数据库上执行,事务的执行存在版本的限制。事务只能在指定版本的数据库上运行(参见数据库版本设置)。 立即下载

相关推荐

SQLExecutor: A Simple JDBC framework:小型易用的JDBC框架,简化了JDBC驱动程序的使用-开源

Jeff Smith的简单JDBC框架(JAR)。 使用独立于数据库的未经检查的异常代码。 支持Oracle,mySQL,HSQL和PostgreSQL-可以轻松扩展到新数据库。 请参阅以下文章(最初在Developer.com上发布):http://softtechdesign.com/products/SQLExecutor/SQLExecutor.htm

SQL executor解读 查询执行模型概述

执行器根据查询优化阶段产生的查询优化树,对其进行物理实现,例如对每一个结点进行初始化,分配内存等操作,将其转为查询执行树。注意:查询执行过程和查询执行树的建立过程是同时的,并不存在先生成查询执行树,再查询执行。这一节讲述了从查询语句到生成查询执行树所经历的过程,opengauss所采用的火山模型,得知查询执行模块是对查询优化模块所生成的执行计划树进行操作。查询优化树是一种对查询语法树进行优化后的形式,它利用一些等价变换规则和启发式规则,对查询语法树进行重组,剪枝等操作,以减少查询的执行代价。

Lohax的博客 472

STM32无线遥控小车的设计

基于SPI通信的无线摇杆小车的设计

weixin_69414084的博客 2933

mybatis (Sql执行流程 + Executor执行器 + 源码分析) (四)

Sql执行流程 + SqlSession + Executor执行 + 源码分析

959 974

宝塔面板磁盘扩容后不生效?5步搞定Linux服务器磁盘空间更新(附详细命令)

本文详细解析了Linux服务器磁盘扩容后宝塔面板显示不生效的常见问题。通过理解磁盘、分区、文件系统三层逻辑,提供5步解决方案:检查磁盘状态、安装growpart工具、扩展分区、使用resize2fs命令扩展文件系统,并最终验证结果。文中附有详细命令和针对XFS、LVM等进阶场景的指南,帮助用户彻底解决磁盘空间更新问题。

weixin_29271263的博客 129

从零开始理解固定翼能量控制:Pixhawk TECS算法保姆级教程

本文深入解析了Pixhawk飞控中的TECS(总能量控制)算法,旨在解决固定翼无人机纵向控制中速度与高度耦合的经典难题。教程从物理概念出发,阐释了TECS通过管理总能量与分配能量形态来实现油门与升降舵解耦的核心思想,并提供了参数调试的实战指南,帮助开发者优化飞行性能。

white的博客 251

Mybatis执行SQL流程(六)之Executor执行器

定义了执行器的通用骨架(如查询/更新流程、事务提交/回滚、本地缓存管理),将具体操作延迟到子类实现(SimpleExecutor、ReuseExecutor、BatchExecutor)中执行对方法进行了区分,Sqlsession调用 Executor 对应的方法执行sql。对于新增来说,涉及到主键自动生成keyGenerator、一级缓存清除、参数处理、typeHandler。对于查询来说,主要涉及到二级缓存、一级缓存、参数处理、结果集处理。真正执行sql是交给jdbc执行的。

qq_38077040的博客 815

信号处理算法:自适应滤波_(8).自适应陷波器

自适应陷波器是一种强大的工具,广泛应用于电力系统、通信系统和生物医学信号处理等领域。通过自适应调整滤波器的参数,自适应陷波器可以在特定频率处形成陷波,从而有效地抑制噪声或干扰信号。常见的自适应算法包括LMS和RLS,它们各有优缺点,可以根据实际需求选择合适的算法。

2401_87715305的博客 1371

六、SqlSession 的创建过程以及 Executor 执行 SQL 过程详解

源码地址:https://github.com/RononoaZoro/mybatis-book/tree/master 的 mybatis-book ( mybatis-chapter04 ) 文章内容出自《Mybatis 3 源码深度解析》第五章 1、XPath 方式解析 XML 文件 users.xml <?xml version="1.0" encoding="UTF-8" ?> <users> <user id = "1"> <.

戴泽王的博客 517

RK3399平台开发系列讲解(外设篇)交换芯片RTL8306M

网络:交换芯片RTL8306M 电路: make menuconfig 配置: 目录:arch/arm64/configs/rk3399_b201_defconfig CONFIG_FIXED_PHY=y 设备树: arch/arm64/boot/dts/rockchip/rk3399-b201-rev1.dts 时钟: Open之后首先校验网卡mac地址是否正确(stmmac_chec...

内核笔记 2394

FAST-LIVO2 源码精读(十八):实时性优化、漂移排查与工程落地

FAST-LIVO2 的工程价值,不在于某一个孤立的技巧,而在于它把"激光的几何精度、惯性的高频预测、视觉的纹理与色彩"用一套简洁的滤波框架紧紧拧在一起,又在实时性、鲁棒性、可扩展性之间取得了难得的平衡。先用内建计时表定位瓶颈,再按降采样、并行、滑窗、编译优化、双频输出逐项加速;遇到漂移先看现象、循诊断树定位根因、回到对应章节取解法。十八篇至此收束。

PX4-SLAM-PNC 218

SqlSession及StatementHandler、ParameterHandler、Executor、ResultSetHandler四大对象的关系和功能

参考:原来SqlSession只是个甩手掌柜?真正干活的是谁? 前言 我们在执行Sql之前,需要先获取SqlSession对象,但是我们也提到了SqlSession下面还有四大对象, 所以SqlSession只是个甩手掌柜,真正干活的却是Executor等四大对象:Executor,StatementHandler,ParameterHandler,ResultSetHandler。 那么本篇文章就让我们来仔细分析一下这四大对象。 MyBatis架构分层 首先我们先来建立一个MyBatis的整体认知,下面

Hanyinh的博客 2216

华为OD机试真题 新系统 9月16号 【统计特殊数字】

华为OD新系统机试真题【统计特殊数字】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【统计特殊数字】。

qq_45776114的博客 779

Mybatis执行器源码分析Executor

Mybatis执行器源码分析Executor概述结构图测试一把测试代码simpleExecutorreuseExecutorbatchExecutorbaseExecutorcachingExecutor使用sqlSession庖丁解牛获取sqlSessiong获取Excutor 逻辑:执行数据库逻辑未获取到二级缓存数据总结 概述 我们平时使用的时候很少关注这个Executor,往往一般是直接使用sqlSession进行数据操作,但是我们知道sqlSession拥有configruation 和Excuto

430

【新能源汽车DCDC变换器测试优化全攻略:解决电能质量/发热/过充等核心痛点】

高压直流转12V低压的DCDC变换器是新能源汽车电源系统的核心枢纽,承担着为整车低压附件、控制器及12V蓄电池供电/补电的关键作用。在新能源汽车乘用车、商用车等不同车型实际运营中,因PDU内DC/AC等模块干扰、DCDC自身设计缺陷、整车匹配性不佳及测试验证不充分,频发12V输出电能质量差导致后端元器件烧毁、变换器发热严重、蓄电池过充/欠充、智能补电功能失效等问题,还伴随低压侧电压瞬跌/浪涌、电磁干扰超标、振动后接触不良、高温下效率骤降等行业高频故障,直接影响整车可靠性和运营安全性。本文基于国标。

优快云-新能源汽车研发测试专业博主 1270

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Mybatis 源码分析(一)之 Mybatis 的Executor的初始化

Mybatis 的核心概念与源码分析 先看一下mybatis中几个核心的概念名词 名称 意义 Configuration 管理 mysql-config.xml 全局配置关 SqlSessionFactor Session 管理工厂 Session SqlSession 是一个面向用户(程序员)的接口。SqlSession中提供了很多操作数据库的方法 Executo...

挂机的阿洋zzZ 522

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Mybatis源码分析六之Executor

一、Executor 前文分析了SqlSession,总的说来就是实现了数据库操作的增删改查方法,但是具体的调用都是通过Executor来实现的,所以分析Executor对了解Mybatis是怎么运行极其重要。 Executor是SqlSession的构造参数之一,他的实例化过程是调用Configuration的newExecutor方法返回的Executor executor = configuration.newExecutor(tx, execType),tx是事务工厂(已经介绍过),execType

solayang的博客 694

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

MyBatis 源码分析——SqlSession接口和Executor类

mybatis框架在操作数据的时候,离不开SqlSession接口实例类的作用。可以说SqlSession接口实例是开发过程中打交道最多的一个类。即是DefaultSqlSession类。如果笔者记得没有错的话,早期是没有什么getMapper方法的。增删改查各志有对应的方法进行操作。虽然现在改进了很多,但是也保留了很多。我们依旧可以看到类似于selectList这样子的方法。源码的例子里面就可以

airfish20000的博客 637

mybatis 源码分析(三)Executor 详解

本文将主要介绍 Executor 的整体结构和各子类的功能,并对比效率; 一、Executor 主体结构 1. 类结构 executor 的类结构如图所示: 其各自的功能: BaseExecutor:基础执行器,封装了子类的公共方法,包括一级缓存、延迟加载、回滚、关闭等功能; SimpleExecutor:简单执行器,每执行一条 sql,都会打开一个 Statement,执行完成后关...

weixin_30258901的博客 221

MyBatis源码分析_Executor组件及3个火枪手(6)

Executor组件以及3个火枪手

街头小瘪三的专栏 919

Mybatis源码分析-Executor执行器源码分析

文章目录一、调用写法二、原生写法三、源码分析1.代理类的invoke方法2.invoke方法源码3.sqlSession.selectOne();4.selectList() 一、调用写法 SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> users

瑞文のBlog 392

Mybatis源码分析(三)Executor & 缓存

Executor 执行器使用 配置 <!-- SIMPLE 普通执行器:默认 REUSE 重用预处理处理语句执行器(PreparedStatement) BATCH 重用批量处理执行器 --> <setting name="defaultExecutorType" value="REUSE"/> 使用 String resource = "mybatis-config.xml"; //将XML配置文件构建为Configuration配置类 Reader reader

Men-DD 690

Mybatis源码--Executor源码分析

1 概述  Mybatis中所有的Mapper语句的执行都是通过Executor进行的,Executor是Mybatis的一个核心接口。针对Executor的学习,我们先来说说Executor的生成和Executor的分类,然后再来看看其中某个典型方法的具体执行。 2 Executor生成 Executor是通过Configuration的newExecutor函数来生成的,我们来看一看ne...

ONROAD0612的博客 841

mybatis源码分析(3)Executor执行器分析

1、执行器介绍 mybatis中按照功能区分有三种执行器,分别是 SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。 ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供...

曳凡的博客 664

【MyBatis】执行原理(四):Executor 执行SQL源码分析

4.执行sql 由于所有的 Mapper 都是 MapperProxy 代理对象,所以任意的方法都是执行MapperProxy的invoke()方法。 问题1:我们引入MapperProxy为了解决什么问题? 硬编码和编译时检查问题。它需要做的事情是:根据方法查找Statement ID的问题。 问题2:这里没有实现类,进入到invoke方法的时候做了什么事情?它是怎么找到我们要执行的SQL的? MapperProxy.invoke() public Object invoke(Object p

A minor 2518
上一篇: Mybatis源码分析——MappedStatement(2)
下一篇: Mybatis源码分析——StatementHandler
yang_xinkun
博客等级 码龄10年 108粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值