文章目录

  • Pre
  • Executor 执行器
  • 接口继承关系
  • BatchExecutor(重用执行器)
    • 入门小demo
    • 源码
    • BatchExecutor VS ReuseExecutor

Pre

MyBatis源码-深入理解MyBatis Executor的设计思想

工程部分见
MyBatis源码- SqlSession门面模式 & selectList 源码解析

实际中,我们都是面向SqlSession编程的,不会直接调用Executor来执行业务逻辑,这里我们仅仅是为了深入了解下Executor体系架构才这么搞的,切记。


Executor 执行器


接口继承关系

这里我们重点看下Executor的 三个实现子类。

分别是:SimpleExecutor(简单执行器)、ReuseExecutor(重用执行器)、BatchExecutor(批处理执行器)。


BatchExecutor(重用执行器)

BatchExecutor 仅对修改操作(包括删除)有效哈 ,对 select操作是不起作用。

BatchExecutor 主要是用于做批量更新操作的 ,底层会调用Statement的 executeBatch()方法实现批量操作

入门小demo

 @Testpublic void testBatchExecutor() throws SQLException {// 通过factory.openSession().getConnection()实例化JdbcTransaction ,用于构建BatchExecutorjdbcTransaction = new JdbcTransaction(factory.openSession().getConnection());// 实例化BatchExecutorBatchExecutor executor = new BatchExecutor(configuration, jdbcTransaction);// 映射SQLms = configuration.getMappedStatement("com.artisan.UserMapper.updateById");Map map = new HashMap();map.put("arg0",1);map.put("arg1","222");// 调用doUpdateexecutor.doUpdate(ms,map);executor.doUpdate(ms,map);// 刷新executor.doFlushStatements(false);// 提交  否则不生效executor.commit(true);}


源码

currentSql 全局变量, 非线程安全

statementList 缓存 statement
batchResultList 缓存 返回结果

 @Overridepublic int doUpdate(MappedStatement ms, Object parameterObject) throws SQLException {final Configuration configuration = ms.getConfiguration();final StatementHandler handler = configuration.newStatementHandler(this, ms, parameterObject, RowBounds.DEFAULT, null, null);final BoundSql boundSql = handler.getBoundSql();final String sql = boundSql.getSql();final Statement stmt; //  当前sql , 并且是当前statementif (sql.equals(currentSql) && ms.equals(currentStatement)) {int last = statementList.size() - 1;stmt = statementList.get(last);applyTransactionTimeout(stmt);handler.parameterize(stmt);//fix Issues 322BatchResult batchResult = batchResultList.get(last);batchResult.addParameterObject(parameterObject);} else {Connection connection = getConnection(ms.getStatementLog());stmt = handler.prepare(connection, transaction.getTimeout());handler.parameterize(stmt);    //fix Issues 322currentSql = sql;currentStatement = ms;statementList.add(stmt);batchResultList.add(new BatchResult(ms, sql, parameterObject));}handler.batch(stmt);return BATCH_UPDATE_RETURN_VALUE;}


BatchExecutor VS ReuseExecutor

看输出 和 ReuseExecutor 感觉差不多,其实是有区别的

  • ReuseExecutor : 设置参数,执行,获取返回结果,然后在设置参数,执行,获取返回结果

  • BatchExecutor: 批量设置参数 , 执行 ,获取返回结果。

BatchExecutor仅执行一次,ReuseExecutor 执行多次

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

  1. MyBatis源码-解读Executor的三个实现类之SimpleExecutor(简单执行器)

    文章目录 Pre Executor 执行器 接口继承关系 SimpleExecutor(简单执行器) 入门小demo 实例化SimpleExecutor doQuery方法 Pre MyBatis源码 ...

  2. Mybatis源码解读-设计模式总结

    虽然我们都知道有26个设计模式,但是大多停留在概念层面,真实开发中很少遇到,Mybatis源码中使用了大量的设计模式,阅读源码并观察设计模式在其中的应用,能够更深入的理解设计模式. Mybatis至少 ...

  3. 2020年Mybatis源码解读

    目录标题 为什么需要ORM 框架Mybatis ORM框架-前身是Ibatis Mysql映射文件三要素: Mybatis 单独开发-快速入门 mybatis核心配置xml resultType 还是 ...

  4. MyBatis源码解读之源码结构

    2019独角兽企业重金招聘Python工程师标准>>> 目的 文章主要了解MyBatis源码结构,每个包的具体功能.如何去学习MyBatis源码. MyBatis源码结构导图 查看大 ...

  5. Mybatis源码分析之(三)mapper接口底层原理(为什么不用写方法体就能访问到数据库)

    mybatis是怎么拿sqlSession 在 上一篇的时候,我们的SqlSessionFactoryBuilder已经从xml文件中解析出了Configuration并且返回了sessionFact ...

  6. MyBatis 源码解读(零)导语

    简单介绍下我使用最多的持久层框架 Hibernate valuelist MyBatis 这三个框架,也是用过国内的一些产品,不过已经很少了. 虽然已经使用了很长时间,但是还没有认真的读过该项目的源码 ...

  7. MyBatis 源码解读-带着问题去看源码

    分析源码,我们还是从编程式的demo 入手.Spring 的集成我们会在后面讲到. InputStream inputStream = Resources.getResourceAsStream(re ...

  8. Mybatis源码:Executor 模板模式

    by yan 20220301 模板模式 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进 ...

  9. MyBatis 源码解读-获得Mapper 对象

    现在我们已经有一个DefaultSqlSession 了,必须找到Mapper.xml 里面定义的Statement ID,才能执行对应的SQL 语句. 找到Statement ID 有两种方式:一种 ...

最新文章

  1. 双水泵轮换工作原理图_「物业管理工作」水泵维护保养规程
  2. 如何在iOS或macOS上检查活动的Internet连接?
  3. 用python画哆啦a梦的代码解释_python画哆啦A梦和大雄
  4. 用Java读取xml文件内容
  5. 常见多媒体文件格式及视音频编解码总结
  6. dockerfile mysql例子_docker-compose 实用示例
  7. 使用Nginx反向代理来实现简单的负载均衡
  8. python存储json数据_python 存储json数据
  9. SQL Server:查找表的生成或顺序
  10. Vue 生命周期学习心得(上)
  11. win10主题更换_WIN10好用的小软件
  12. HDB3码:快速上手步骤实例
  13. UE4读取steam sessionsetting中Value是亚洲文字时 乱码/ UE4 fix asian character garbled when get sessionsetting
  14. 木瓜移动每日资讯0602:“店小秘”宣布完成1.35亿元人民币B+轮融资
  15. 高逼格的 SQL 写法:行行比较 !
  16. 趣闲赚~~~~~~青龙脚本
  17. 分段多项式及样条估计
  18. Eclipse插件TPTP-程序Profile与分析工具详细教程
  19. 不快乐的12个常见原因及有效疗法
  20. 工业嵌入式计算机系统介绍

热门文章

  1. Android Studio 出现 Gradle's dependency cache may be corrupt 解决办法
  2. php商城多属性选择,ecshop后台商品属性详解之复选属性
  3. 全球变暖java_全球变暖 蓝桥杯
  4. Python实现快速傅里叶变换(FFT)
  5. winform point数组带数值_带你学够浪:Go语言基础系列 - 8分钟学复合类型
  6. python为什么用号做注释符_Python为什么用#号作注释符?
  7. python解矩阵方程_用Python代写的Numpy求解线性方程组
  8. 电脑电池修复_笔记本电脑不充电是怎么回事?
  9. 171. Leetcode 406. 根据身高重建队列 (贪心算法-两个维度权衡题目)
  10. FCN全连接卷积网络(4)--Fully Convolutional Networks for Semantic Segmentation阅读(引言部分)