Mybatis执行BatchExecutor(四)

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

BatchExecutor:顾名思义就是进行批量操作,通过批量操作来提高性能

public class BatchExecutor extends BaseExecutor {
 
  public static final int BATCH_UPDATE_RETURN_VALUE = Integer.MIN_VALUE + 1002;
 
  /* Statement链表**/
  private final List<Statement> statementList = new ArrayList<Statement>();
  
  /* batch结果链表**/
  private final List<BatchResult> batchResultList = new ArrayList<BatchResult>();
  private String currentSql;
  private MappedStatement currentStatement;
 
  public BatchExecutor(Configuration configuration, Transaction transaction) {
    super(configuration, transaction);
  }
 
  @Override
  public int doUpdate(MappedStatement ms, Object parameterObject) throws SQLException {
	//获得配置信息
    final Configuration configuration = ms.getConfiguration();
	//获得StatementHandler
    final StatementHandler handler = configuration.newStatementHandler(this, ms, parameterObject, RowBounds.DEFAULT, null, null);
    final BoundSql boundSql = handler.getBoundSql();
	//获得Sql语句
    final String sql = boundSql.getSql();
    final Statement stmt;
	//如果sql语句等于当前sql MappedStatement 等于当前Map碰到Statement
    if (sql.equals(currentSql) && ms.equals(currentStatement)) {
	  
      int last = statementList.size() - 1;
	  //获得最后一个
      stmt = statementList.get(last);
	  handler.parameterize(stmt);//fix Issues 322
	  //有相同的MappedStatement和参数
      BatchResult batchResult = batchResultList.get(last);
      batchResult.addParameterObject(parameterObject);
    } else {
	  //如果不存在就创建一个批处理操作
      Connection connection = getConnection(ms.getStatementLog());
      stmt = handler.prepare(connection);
      handler.parameterize(stmt);    //fix Issues 322
      currentSql = sql;
      currentStatement = ms;
	  //添加批量处理操作
      statementList.add(stmt);
      batchResultList.add(new BatchResult(ms, sql, parameterObject));
    }
  // handler.parameterize(stmt);
    //最终是调用jdbc的批处理操作
    handler.batch(stmt);
    return BATCH_UPDATE_RETURN_VALUE;
  }
 
  @Override
  public <E> List<E> doQuery(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql)
      throws SQLException {
    Statement stmt = null;
    try {
      flushStatements();
	  //获得配置信息
      Configuration configuration = ms.getConfiguration();
	  //获得StatementHandler
      StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameterObject, rowBounds, resultHandler, boundSql);
	  //获得连接
      Connection connection = getConnection(ms.getStatementLog());
      stmt = handler.prepare(connection);
	  //获得Statement
      handler.parameterize(stmt);
      return handler.<E>query(stmt, resultHandler);
    } finally {
      closeStatement(stmt);
    }
  }
 
  /* 刷新Statement,记录执行次数*/
  @Override
  public List<BatchResult> doFlushStatements(boolean isRollback) throws SQLException {
    try {
      List<BatchResult> results = new ArrayList<BatchResult>();
      if (isRollback) {
        return Collections.emptyList();
      }
	  //如果进行了批量处理
      for (int i = 0, n = statementList.size(); i < n; i++) {
        Statement stmt = statementList.get(i);
        BatchResult batchResult = batchResultList.get(i);
        try {
		  //记录批量处理执行操作的条数
          batchResult.setUpdateCounts(stmt.executeBatch());
          MappedStatement ms = batchResult.getMappedStatement();
		  //参数对象集合
          List<Object> parameterObjects = batchResult.getParameterObjects();
		  //生成key
          KeyGenerator keyGenerator = ms.getKeyGenerator();
          if (Jdbc3KeyGenerator.class.equals(keyGenerator.getClass())) {
            Jdbc3KeyGenerator jdbc3KeyGenerator = (Jdbc3KeyGenerator) keyGenerator;
            jdbc3KeyGenerator.processBatch(ms, stmt, parameterObjects);
          } else if (!NoKeyGenerator.class.equals(keyGenerator.getClass())) { //issue #141
            for (Object parameter : parameterObjects) {
              keyGenerator.processAfter(this, ms, stmt, parameter);
            }
          }
        } catch (BatchUpdateException e) {
          StringBuilder message = new StringBuilder();
          message.append(batchResult.getMappedStatement().getId())
              .append(" (batch index #")
              .append(i + 1)
              .append(")")
              .append(" failed.");
          if (i > 0) {
            message.append(" ")
                .append(i)
                .append(" prior sub executor(s) completed successfully, but will be rolled back.");
          }
          throw new BatchExecutorException(message.toString(), e, results, batchResult);
        }
		//记录操作
        results.add(batchResult);
      }
      return results;
    } finally {
      for (Statement stmt : statementList) {
        closeStatement(stmt);
      }
      currentSql = null;
      statementList.clear();
      batchResultList.clear();
    }
  }
 
}

 

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

Unity开源游戏源码精选:17个亲测可运行教学项目 Unity游戏开发中,掌握真实项目结构与工程实践远比熟记API更重要。本文围绕‘Unity开源项目’和‘游戏源码’两大核心概念,解析高质量开源资源的本质特征——结构清晰、逻辑可溯、修改即时反馈。从基础的MonoBehaviour生命周期组织,到进阶的ScriptableObject数据驱动、事件总线解耦,再到架构级的DOTS ECS设计与网络同步模式,技术价值在于将抽象原理落地为可调试、可验证、可迁移的代码范式。适用于新手建立开发直觉、中级开发者突破系统设计瓶颈,以及团队构建可维护框架。所有项目均基于Uni 阅读详情

相关推荐

python采集keep运动数据

我国2009年确立“全民健身日”;2012年,“广泛开展全民健身运动”写入十八大报告;到2014年上升为国家战略,全民健身的分量越来越重。推动全民健身和全民健康深度融合,通过全民健身实现全民健康。 全民健身运动在我国越来越普及,每天清晨和傍晚时分,城市的广场上、公园里,到处是运动健身的人们,跑步、打球、跳舞、游泳、打太极拳等运动项目十分丰富,人们在运动中获得越来越多的幸福感。 随之诞生出了很多运动app,例如keep,咪咕,微信等,大家可以通过app随时记录自己的运动数据,特别是对于很多的减肥人群来说,通过

Z_suger7的博客 5661

【Mybatis】BatchExecutor批量处理逻辑源码解析

public int doUpdate(MappedStatement ms, Object parameterObject) throws SQLException { final Configuration configuration = ms.getConfiguration(); final StatementHandler handler = configuration.newStatementHandler(this, ms, parameterObject, Ro...

1780

PCout(n) -- STM32F103RCT6 位带操作

位带操作,sys.h,PCout,PAout,PAout

weixin_50212044的博客 4024

myBatis源码之BatchExecutor

BatchExecutor是实现批处理操作,会将根据相同操作通过判断sql语句和MappedStatement来将执行放到List中,来执行批处理操作。 /** * @author Jeff Butler */ public class BatchExecutor extends BaseExecutor { public static final int BATCH_UPD

井底之蛙 3288

OC5021B 100V宽电压输入 LED车灯/大功率照明 DC降压型恒流驱动器

适用于LED大功率汽车大灯/大功率照明 OC5021B 100V宽电压输入 5A电流设计 DC-DC降压型恒流驱动IC

Handsome63841990的博客 2420

ROBOGUIDE教程:FANUC机器人X型焊枪气动点焊焊接

FANUC机器人X型焊枪气动点焊焊接虚拟仿真实现方法。

IndRobSim 4390

Mybatis源码学习(28)-Mybatis中的执行器BatchExecutor

一、前言 接着前面的《Mybatis中的执行器Executor(一)》继续分析学习Executor。在分析BatchExecutor类之前,先了解一下JDBC的批处理相关知识。 二、JDBC批处理   批量处理允许将相关的SQL语句分组到批处理中,并通过对数据库的一次调用来提交它们,一次执行完成与数据库之间的交互。需要注意的是:JDBC中的批处理只支持 insert、update 、delete ...

向心行者 5923

激光焦点动态跟踪技术实战大揭秘:电容式与同轴视觉的巅峰对决

激光焦点动态跟踪技术是保证激光加工质量的关键因素。本文对比评测了电容式和同轴视觉两种主流技术:电容式响应速度快、成本低,适合高速稳定加工环境,但易受电磁干扰;同轴视觉精度高、抗干扰强,适合精密加工和复杂工件,但成本较高且处理速度受限。评测结果表明,企业应根据加工需求、预算和环境选择合适技术。未来该技术将向智能化、多技术融合方向发展,为工业应用提供更优解决方案。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 128

MyBatis源码-解读Executor的三个实现类之BatchExecutor(批处理执行器)

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

小工匠 2万+

【Neo4j × Python】基于知识图谱的电影问答系统(含问题记录与解决)附:源代码(含Bug解决)

此前,曾介绍过Neo4j的一些基础知识,本篇将在PyCharm中与Neo4j建立关联,从0到1实现一个基于知识图谱的电影问答系统,实现过程中,没有一帆风顺,而是遇到了一些问题,因此也包含问题的记录与解决。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 3168

【25届数字IC秋招总结】面试经验13——豪威科技面试

25届数字ic面试记录———豪威科技

lalala0635的博客 365

Mybatis BatchExecutor 执行过程解读

1、sqlSession.commit()、transaction.commmit()与connection.commit()三者的区别/联系:connection.commit()对应一次实际的数据库事务手动提交的操作。sqlSession.commit()会有条件地触发transaction.commmit(),而transaction.commmit()则会有条件地触发connection.commit()。

qq_44734742的博客 2108

RDKit | 基于Murcko骨架聚类化合物库

化合物多样性评估 一种方法是使用合适的指纹技术将化合物矢量化并评估他们之间的距离。这种方法经常被使用,但是对于人类很难直观地理解化合物之间的距离。 基于Murcko骨架,分子大致聚集在化合物骨架中,并且每个簇中的顶部化合物都作为候选化合物。此方法非常符合人类的直觉,因此可以预期人将通过查看候选化合物列表来自动缩小化合物的范围。 Murcko骨架 Mur...

DrugOne 3768

MyBatis BatchExecutor 深度解析

在大型企业级应用中,数据库操作往往是性能瓶颈之一。想象一下,一个电商系统在高峰时段,需要处理大量的订单插入操作。如果每次插入操作都单独提交,那么数据库的压力会非常大,同时网络延迟和事务处理时间也会显著增加。为了解决这个问题,MyBatis 提供了 BatchExecutor,这是一种能够显著提高数据库操作效率的机制。BatchExecutor 的引入主要是为了解决在执行大量数据库插入、更新或删除操作时,频繁地提交事务带来的性能问题。

JavaCodePro的博客 1137

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

手写MyBatis第39弹:深入MyBatis BatchExecutor实现原理与最佳实践

通过对比和的update通过抽象接口,屏蔽了不同执行策略的复杂性,并通过与SqlSession的联动,提供了统一而灵活的用户体验。给开发者的启示:在需要大量写操作的场景(如数据导入、批量更新),务必使用(通过),性能提升可达数十倍甚至更高。批处理操作需要显式调用或才会真正执行。忘记提交是初学者常犯的错误。批处理操作同样受事务控制。在执行commit之前,所有操作都可以回滚。合理设置批处理大小(定期调用),可以避免超大事务导致数据库锁等问题。从到,我们看到的不仅仅是一个功能的添加,更是一个框架在。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 1856

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

MyBatis 源码解析:BatchExecutor 与 SimpleExecutor 详解

在 MyBatis 中,`Executor` 是执行 SQL 语句的核心组件。`SimpleExecutor` 和 `BatchExecutor` 是 `Executor` 的两种重要实现方式:前者负责简单的 SQL 执行,后者支持批量 SQL 执行。本文将通过自定义实现 `BatchExecutor` 和 `SimpleExecutor`,深入分析它们的工作机制,并理解它们在实际开发中的应用场景。

捕风捉你 · 星桥API接入与大模型实战 1537

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

MyBatis BatchExecutor:批处理原理与优化

在当今的软件开发领域,数据库操作是构建应用程序不可或缺的一部分。特别是在处理大量数据时,如何高效地执行数据库操作,成为了一个关键问题。MyBatis作为一款优秀的持久层框架,其核心组件之一——BatchExecutor,在处理批量数据库操作时发挥着至关重要的作用。本文将围绕MyBatis核心知识点之BatchExecutor进行概述,旨在帮助读者理解其概念、作用以及优势。在现实应用中,我们常常需要执行大量的数据库插入、更新或删除操作。

我是Java程序员廖志伟,感谢朋友们的支持! 723

Mybatis三大执行器介绍

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

共勉 3795

Mybatis执行器

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

架构师小吴的博客 1498

Mybatis源码解析之四 mybatis执行流程

目录 一、缘起 二、示例代码 1、mybatis单独测试操作代码 2、spring与mybatis的整合操作代码 3、总结 三、mybatis执行流程 1、mybatis的架构设计图 2、mybatis的执行流程图 3、mybatis执行流程时序图 4、Mybatis的核心组件 5、mybatis执行流程的分析 一、缘起 前三篇的文章...

liushangzaibeijing的博客 5万+

Mybatis执行器BatchExecutor、ReuseExecutor、SimpleExecutor介绍

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

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值