Mybatis执行ReuseExecutor(五)

Mybaits源码解析4——SimpleExecutor、ReuseExecutor、BatchExecutor、CachingExecutor 上一篇对Executor接口进行了大致的分析,这边来针对它的实现进行分析。现在我们知道,mybatis默认情况下是使用simpleExecutor的,如果你需要修改,有两种方式,一是在setting中配置defualtExecutorType,另一种方式是通过SqlSessionManager指定executorType并创建sqlsession。下面以doUpdate和doQuery方法为例,比... 阅读详情

ReuseExecutor顾名思义就是重复使用执行,其定义了一个Map<String, Statement>,将执行的sql作为key,将执行的Statement作为value保存,这样执行相同的sql时就可以使用已经存在的Statement,就不需要新创建了,源码及分析如下:

/**
 * @author Clinton Begin
 */
public class ReuseExecutor extends BaseExecutor {
 
  private final Map<String, Statement> statementMap = new HashMap<String, Statement>();
 
  public ReuseExecutor(Configuration configuration, Transaction transaction) {
    super(configuration, transaction);
  }
 
  @Override
  public int doUpdate(MappedStatement ms, Object parameter) throws SQLException {
	//获得配置文件
    Configuration configuration = ms.getConfiguration();
	//获得statementHandler 包括插件内容
    StatementHandler handler = configuration.newStatementHandler(this, ms, parameter, RowBounds.DEFAULT, null, null);
	//转换为PrepareStatement
    Statement stmt = prepareStatement(handler, ms.getStatementLog());
    return handler.update(stmt);
  }
 
  @Override
  public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
    Configuration configuration = ms.getConfiguration();
    StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);
    Statement stmt = prepareStatement(handler, ms.getStatementLog());
    return handler.<E>query(stmt, resultHandler);
  }
 
  @Override
  public List<BatchResult> doFlushStatements(boolean isRollback) throws SQLException {
    for (Statement stmt : statementMap.values()) {
	  //关闭Statement
      closeStatement(stmt);
    }
	//清空sql
    statementMap.clear();
    return Collections.emptyList();
  }
 
  private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException {
    Statement stmt;
    BoundSql boundSql = handler.getBoundSql();
	//获得sql语句
    String sql = boundSql.getSql();
	//查看是否存在Statement
    if (hasStatementFor(sql)) {
	  //如果存在就获取Statement
      stmt = getStatement(sql);
    } else {
      Connection connection = getConnection(statementLog);
	  //否则通过连接创建一个Statement
      stmt = handler.prepare(connection);
	  //将sql语句及对应的Statement 保存到map中
      putStatement(sql, stmt);
    }
    handler.parameterize(stmt);
    return stmt;
  }
 
  private boolean hasStatementFor(String sql) {
    try {
	  //查看map中是否含有sql语句对应的Statement
      return statementMap.keySet().contains(sql) && !statementMap.get(sql).getConnection().isClosed();
    } catch (SQLException e) {
      return false;
    }
  }
 
  private Statement getStatement(String s) {
	//获得Sql语句对应的Statement
    return statementMap.get(s);
  }
 
  private void putStatement(String sql, Statement stmt) {
	//将sql语句及对应的Statement保存到map中
    statementMap.put(sql, stmt);
  }
 
}

 

本文原文地址:https://blog.youkuaiyun.com/qq924862077/article/details/52641902

MyBatis(六)横向分析Executor中的SimpleExecutor、ReuseExecutor、BatchExecutor 深入分析SimpleExecutor、ReuseExecutor、BatchExecutor的源码,解析不同的statement使用策略 阅读详情

相关推荐

MyBatis执行器

Mybatis 执行器、StatementHandler 接口

Mr.xing的博客 4073

MyBatis源码-解读Executor的三个实现类之ReuseExecutor(重用执行器)

文章目录PreExecutor 执行器接口继承关系ReuseExecutor(重用执行器)入门小demo Pre MyBatis源码-深入理解MyBatis Executor的设计思想 工程部分见 MyBatis源码- SqlSession门面模式 & selectList 源码解析 实际中,我们都是面向SqlSession编程的,不会直接调用Executor来执行业务逻辑,这里我们仅仅是为了深入了解下Executor体系架构才这么搞的,切记。 Executor 执行器 接口继承关系

小工匠 2万+

手把手教你用ROS2控制PX4无人机画个圆:从C++代码到Gazebo仿真全流程解析

本文详细解析了如何使用ROS2控制PX4无人机实现圆形轨迹飞行,涵盖从C++代码编写到Gazebo仿真的全流程。重点介绍了Offboard模式下的控制算法实现、圆形轨迹生成的数学原理,以及解决通信延迟和坐标系转换等常见问题的实用技巧。通过实战案例,帮助开发者快速掌握无人机轨迹跟踪仿真的核心技术。

weixin_30839881的博客 99

Mybatis的执行器类型

Mybatis的执行器类型有哪些?SimpleExecutor、ReuseExcutor、BatchExecutor

qq_39350797的博客 1104

如何检查你的系统是否支持 TPM 2.0

TPM 2.0 是 Windows 11 的硬性要求,作为安全加密芯片,用于存储密钥、认证信息,提升系统安全性。它可防止数据窃取,支持 BitLocker 等功能。多数现代主板已集成 TPM,但需在 BIOS 中启用。可通过 tpm.msc、PowerShell 或微软 PC 健康检查工具验证支持情况。部分设备采用固件实现的 fTPM/PTT,无需独立芯片。

山岚的运维笔记 119

linux中的sendmail发送邮件

linux下的sendmail发送邮件

无痕的博客 6435

【Mybatis中的五鼠闹东京】

北宋仁宗时期,江湖上有著名的三侠五义,其中五义又称五鼠:钻天鼠卢方、彻地鼠韩彰、穿山鼠徐庆、翻江鼠蒋平、锦毛鼠白玉堂, “三侠”是指北侠欧阳春、南侠展昭、丁氏双侠丁兆兰、丁兆蕙二人为一侠;“五义”是指钻天鼠卢方、彻地鼠韩彰、钻山鼠徐庆,翻江鼠蒋平,锦毛鼠白玉堂这五鼠弟兄。   一、Mybatis中的五鼠介绍 SqlSession对数据库的操作,将委托给执行器Executor来完成,而E...

250

【Solidworks学习使用(1)__2022版本保姆级安装方法】

Solidworks 2020安装

coder-kimbell的博客 6272

Mybatis执行器

mybatis执行sql语句的操作是由执行器(Executor)完成的,mybatis中一共提供了3种ExecutorREUSEsqlBATCHSIMPLE另外,mybatis还提供了一个缓存执行器,该执行器实际上是以上三种执行器的装饰类,用以处理缓存相关操作,实际干活的还是以上三种执行器之一。Executor。

架构师小吴的博客 1498

8、音频运行时系统的架构设计

本文深入探讨了音频运行时系统的分层设计及其优势,包括逻辑层和物理层的功能划分。通过分层设计,开发者可以更轻松地管理和优化音频资源,确保其在不同平台上的高效运行。文章还介绍了平台适配与优化、错误处理与调试以及未来发展方向等内容,为开发者提供了宝贵的参考和指导。

juice的博客 463

Mybatis三大执行器介绍

基于3.5.10版本的Mybatis源码,搞清楚SimpleExecutor、BatchExecutor、ReuseExecutor三大执行器之间区别,以及平时开发中要如何使用

共勉 3795

【爬虫实战】Instagram博主图片爬取:模拟登录+滚动加载,轻松抓取高清美图

在当今社交媒体时代,Instagram作为全球最受欢迎的图片分享平台之一,汇聚了无数优质博主的海量精美图片。对于数据爱好者、营销分析师、AI训练数据收集者来说,如何高效、稳定地爬取Instagram博主的图片,成为了一项极具实用价值的技术挑战。然而,Instagram的反爬机制日益严格,传统的静态页面请求已经无法满足需求。本文将带你从零开始,使用2024-2025年最新技术栈,实现模拟登录、滚动加载、高清图片下载的全流程爬虫。✅ 全流程代码可直接运行✅ 模拟手机端请求绕过反爬。

2201_76125261的博客 598

精通Mybatis之Executor执行器

前言 之前小编写的文章从未有过精通二字,因为感觉自己不配,这次发奋图强努力做到第一个框架的精通,就是这Mybatis了。为什么挑Mybatis因为他比较简洁(源码里面连注释都不太有),然后国内用的比较广泛以及代码量不大。小编还是比较有信心的,这次学习源码如之前在其他文章中所说的,我们从最核心开始,然后一步一步往外扩展,毕竟最外部的调用Api往往做了层层封装运用了各种设计模式,代码的联调也会不断的跳跃,让人很痛苦。所以咱们扒开外层看本质。一如既往的废话不多说,进入正题。 JDBC回顾 众所周知,Mybatis

a1032722788的博客 6201

Statistics and Machine Learning Toolbox

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

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Mybatis中的执行器(Executor)

在之前的文章中介绍了mybatis的基本使用,从使用流程中可知,在每次执行CURD的时候,都需要获取SqlSession这个对象,接口如下: 可以看出来这个接口主要定义类关于CRUD、数据库事务、数据库刷新等相关操作。下面看它的默认实现类: 可以看到DefaultSqlSession 实现了SqlSession中的方法,(其实我们自己也可根据需要去实现) 而在这个方法中,存在一个属性就是今天需要将的主角,Mybatis的执行器(Executor)。 Executor简单介绍 Exec.

liming0025的专栏 8092

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

mybatis执行器

mybatis执行器

yanjianpeng_2018的博客 2004

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Mybatis的Executor执行器

MyBatis 提供了三种主要的 Executor 实现:SimpleExecutor、ReuseExecutor 和 BatchExecutor。它们分别适用于不同的场景,从单次执行、频繁重复执行到批量执行,各有优缺点。了解这些执行器的工作原理和适用场景,可以帮助开发者在实际应用中选择最合适的 Executor,从而优化应用的性能和资源使用。

Flying_Fish_roe的博客 1747

Mybatis执行器BatchExecutor、ReuseExecutor、SimpleExecutor介绍

这里说下Executor接口和他的子类之间的关系BaseExecutor有三个实现类BatchExecutor、ReuseExecutor、SimpleExecutor是并列关系。

weixin_37862824的博客 899

Mybatis 都有哪些 Executor 执行器?它们之间的区别是什么

执行器主要特点适用场景每次执行都创建新的Statement,没有缓存适合单次执行、简单查询或低频次操作。缓存,复用执行过的 SQL适合有重复查询的场景,减少 SQL 解析开销。批量执行 SQL,减少与数据库的交互次数适合批量插入、批量更新、批量删除等大量数据处理操作。适用于简单的单次 SQL 执行。适用于重复执行的 SQL,能有效复用。适用于需要执行大量 SQL 的批量操作,能显著提高性能。在 MyBatis 的配置中,你可以根据应用场景选择不同的Executor。

午夜后是黎明,风雨后是骄阳 1288

MyBatis 中的三种执行器(Executor)

MyBatis 中的三种执行器(Executor)

liuruiaaa的博客 1342

来,全搞懂,原来Mybatis执行一个sql有这么多类型,绝

Executor 执行器 今天分享一下 Executor。它在框架中是具体sql的执行器,sqlSession(门面模式)封装通用的api,把具体操作委派给 Executor 执行,Executor协同BoundSql,StatementHandler,ParameterHandler 和 ResultSetHandler 完成工作。 它使用装饰器的方式组织 Executor 对象。如 CachingExecutor 装饰了SimpleExecutor 提供二级缓存功能。 可以通过插件机制扩展功能。m

weixin_51954021的博客 2189

mybatis面试之执行器都有哪些?

执行器一共有4个,分别是SimpleExecutor,ReuseExecutor,BatchExecutor,CachingExecutor,分别看下。 SimpleExecutor 执行数据库操作前,每次都会新建一个java.sql.statement,然后执行数据库操作。 ReuseExecutor 在SimpleExecutor的基础上,维护了一个sql->Statement的Map缓存,如果是相同的sql语句会复用java.sql.Statement,因为相同的sql语句,只有参数不同,只需

wang0907的博客 1519

Mybatis都有哪些Executor执行器?它们之间的区别是什么?

1、SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。 2、ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供下一次使用。简言之,就是重复使用Statement对象。 3、BatchExecutor:执行update(没有select,JDBC批处理不支持selec..

静默 3103
上一篇: Mybatis执行BatchExecutor(四)
下一篇: Mybatis执行CachingExecutor(六)
Roger_CoderLife
博客等级 码龄9年 211粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值