我的编程空间,编程开发者的网络收藏夹
学习永远不晚

executor包执行器功能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

executor包执行器功能

Executor接口基于以下方法可以完成增,删,改查以及事务处理等操作。事实上,mybatis中的所有数据库操作是通过调用这些方法实现的。

public interface Executor {
 
  ResultHandler NO_RESULT_HANDLER = null;
 
  // 数据更新操作,其中数据的增加、删除、更新均可由该方法实现
  int update(MappedStatement ms, Object parameter) throws SQLException;
  // 数据查询操作,返回结果为列表形式
  <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey cacheKey, BoundSql boundSql) throws SQLException;
  // 数据查询操作,返回结果为列表形式
  
  <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException;
  // 数据查询操作,返回结果为游标形式
  <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 createCacheKey(MappedStatement ms, Object parameterObject, RowBounds rowBounds, BoundSql boundSql);
  // 本地缓存是否有指定值
  boolean isCached(MappedStatement ms, CacheKey key);
  // 清理本地缓存
  void clearLocalCache();
  // 懒加载
  void deferLoad(MappedStatement ms, MetaObject resultObject, String property, CacheKey key, Class<?> targetType);
  // 获取事务
  Transaction getTransaction();
  // 关闭执行器
  void close(boolean forceRollback);
  // 判断执行器是否关闭
  boolean isClosed();
  // 设置执行器包装
  void setExecutorWrapper(Executor executor);
 
}

BaseExecutor是一个抽象类,并用到了模板模式,实现了其子类的一些共有的基础功能,而将与子类直接相关的操作交给子类处理。

public abstract class BaseExecutor implements Executor {
 
  private static final Log log = LogFactory.getLog(BaseExecutor.class);
 
  protected Transaction transaction;
  protected Executor wrapper;
 
  protected ConcurrentLinkedQueue<DeferredLoad> deferredLoads;
  // 查询操作的结果缓存
  protected PerpetualCache localCache;
  // Callable查询的输出参数缓存
  protected PerpetualCache localOutputParameterCache;
  protected Configuration configuration;
 
  protected int queryStack;
  private boolean closed;
 
 
 
 
  
  @Override
  public int update(MappedStatement ms, Object parameter) throws SQLException {
    ErrorContext.instance().resource(ms.getResource())
            .activity("executing an update").object(ms.getId());
    if (closed) {
      // 执行器已经关闭
      throw new ExecutorException("Executor was closed.");
    }
    // 清理本地缓存
    clearLocalCache();
    // 返回调用子类进行操作
    return doUpdate(ms, parameter);
  }
 
  
 
  
  @Override
  public <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException {
    BoundSql boundSql = ms.getBoundSql(parameter);
    // 生成缓存的键
    CacheKey key = createCacheKey(ms, parameter, rowBounds, boundSql);
    return query(ms, parameter, rowBounds, resultHandler, key, boundSql);
  }
 
  
  @SuppressWarnings("unchecked")
  @Override
  public <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {
    ErrorContext.instance().resource(ms.getResource()).activity("executing a query").object(ms.getId());
    if (closed) {
      // 执行器已经关闭
      throw new ExecutorException("Executor was closed.");
    }
    if (queryStack == 0 && ms.isFlushCacheRequired()) { // 新的查询栈且要求清除缓存
      // 清除一级缓存
      clearLocalCache();
    }
    List<E> list;
    try {
      queryStack++;
      // 尝试从本地缓存获取结果
      list = resultHandler == null ? (List<E>) localCache.getObject(key) : null;
      if (list != null) {
        // 本地缓存中有结果,则对于CALLABLE语句还需要绑定到IN/INOUT参数上
        handleLocallyCachedOutputParameters(ms, key, parameter, boundSql);
      } else {
        // 本地缓存没有结果,故需要查询数据库
        list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);
      }
    } finally {
      queryStack--;
    }
    if (queryStack == 0) {
      // 懒加载操作的处理
      for (DeferredLoad deferredLoad : deferredLoads) {
        deferredLoad.load();
      }
      deferredLoads.clear();
      // 如果本地缓存的作用域为STATEMENT,则立刻清除本地缓存
      if (configuration.getLocalCacheScope() == LocalCacheScope.STATEMENT) {
        clearLocalCache();
      }
    }
    return list;
  }
 
  
 
  
  @Override
  public CacheKey createCacheKey(MappedStatement ms, Object parameterObject, RowBounds rowBounds, BoundSql boundSql) {
    if (closed) {
      throw new ExecutorException("Executor was closed.");
    }
    // 创建CacheKey,并将所有查询参数依次更新写入
    CacheKey cacheKey = new CacheKey();
    cacheKey.update(ms.getId());
    cacheKey.update(rowBounds.getOffset());
    cacheKey.update(rowBounds.getLimit());
    cacheKey.update(boundSql.getSql());
    List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
    TypeHandlerRegistry typeHandlerRegistry = ms.getConfiguration().getTypeHandlerRegistry();
    for (ParameterMapping parameterMapping : parameterMappings) {
      if (parameterMapping.getMode() != ParameterMode.OUT) {
        Object value;
        String propertyName = parameterMapping.getProperty();
        if (boundSql.hasAdditionalParameter(propertyName)) {
          value = boundSql.getAdditionalParameter(propertyName);
        } else if (parameterObject == null) {
          value = null;
        } else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
          value = parameterObject;
        } else {
          MetaObject metaObject = configuration.newMetaObject(parameterObject);
          value = metaObject.getValue(propertyName);
        }
        cacheKey.update(value);
      }
    }
    if (configuration.getEnvironment() != null) {
      cacheKey.update(configuration.getEnvironment().getId());
    }
    return cacheKey;
  }
}

BaseExecutor有四个实现类:

  • CloseExecutor :仅表明自身已经关闭的执行器,没有其他实际功能
  • SimpleExecutor : 一个最为简单的执行器
  • BatchExecutor :支持批量执行功能的执行器
  • ReuseExecutor : 支持Statement对象复用的执行器。

SimpleExecutorBatchExecutorReuseExecutor 这三个执行器的选择是在mybatis的配置文件中进行的,可选的值由session包中的ExecutorType定义,这三个执行器主要基于StatementHandler完成创建Statement对象,绑定参数等工作。

到此这篇关于executor包执行器功能的文章就介绍到这了,更多相关executor包内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

executor包执行器功能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java的executor包有什么功能

本篇内容主要讲解“java的executor包有什么功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java的executor包有什么功能”吧!sql语句中的参数赋值是有由executor包中
2023-06-29

mybatis中如何实现executor包懒加载功能 

这篇文章主要为大家展示了“mybatis中如何实现executor包懒加载功能 ”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mybatis中如何实现executor包懒加载功能 ”这篇文章吧。
2023-06-29

mybatis的executor包语句处理功能源码分析

这篇“mybatis的executor包语句处理功能源码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mybatis的e
2023-06-29

crontab怎么实现每10秒执行一次功能

这篇文章主要介绍了crontab怎么实现每10秒执行一次功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。实例如下:vim /var/spool/cron/root * *
2023-06-09

Linux关机时执行指定脚本功能实现

1.关机时执行某个脚本的具体思路 (1)在文件夹/etc/init.d/下创建关机时需要执行的脚本file_name; (2)分别在文件夹/etc/rc0.d/和/etc/rc6.d/下创建该该脚本文件的链接文件K07file_name:s
2022-06-04

php ignore_user_abort()实现计划(定时执行)任务功能

要实现计划任务功能,可以使用ignore_user_abort()函数来忽略用户中断,并且在后台继续执行脚本。以下是一个示例,展示了如何使用ignore_user_abort()函数来实现计划任务功能:```php// 设置脚本不会在用户断
2023-10-11

云服务器包括哪些功能类型和功能

云服务器(CloudStack)提供的主要功能类型包括:IaaS(基础设施即服务):将计算资源(IaaS)提供给云服务器,用户可使用服务器的硬件资源、软件资源和网络资源,按需获取相应的服务。PaaS(平台即服务):将云服务器集成到平台之中,提供了一套完整的应用程序运行框架,可让用户基于自己的应用程序构建应用程序,无需关心应用程序的底层基础设施和技术。SaaS(软件即服务):在云服务器的基
2023-10-26

云服务器包括哪些功能设备和功能

云服务器(CloudStack)提供了虚拟化技术,使得用户可以将计算资源和存储资源放置到任何位置。以下是这些功能和设备的一般概念:功能:云服务器提供的功能包括:存储管理:存储管理是云服务器的核心功能之一,包括数据分层、数据复制、数据备份等等。数据库:云服务器存储的数据一般是由关系型数据库或者其他数据库类型存储的,例如MySQL、PostgreSQL等等。负载均衡:负载均衡可以保证多个云
2023-10-26

云服务器包括哪些功能设备和功能组成的功能

服务器:用于存储和管理所有的云资源,包括服务器虚拟化、网络、存储等。数据库:用于存储和管理数据,包括数据存储、数据备份、数据恢复等。负载均衡:用于优化云服务器的性能,确保在高流量的情况下,云服务器能够快速响应和处理请求。网络设备:用于连接云服务器和其他云资源,包括网络协议、路由、防火墙等。存储设备:用于存储和管理云服务器上的数据和应用程序。包括云硬盘、固态硬盘、云存储等。安全设备:用于保护云服务器...
2023-10-27

Python实现脚本锁功能(同时只能执行一个脚本)

1. 文件锁 脚本启动前检查特定文件是否存在,不存在就启动并新建文件,脚本结束后删掉特定文件。 通过文件的判断来确定脚本是否正在执行。 方法实现也比较简单,这里以python脚本为例#coding=utf-8## 文件锁脚本测试#impor
2022-06-04

云服务器包括哪些功能

云服务器是一种虚拟服务器软件,通常是由大型企业或组织使用。它们具有以下功能和特点:可靠性:云服务器通过使用多个服务器组件来实现可靠性。这意味着它们可以提供更高的服务水平,并且可以在多台服务器之间共享资源,以提高整个系统的可用性。弹性扩展:云服务器通过动态分配资源和负载能力,使得用户可以轻松地增加或减少资源。这有助于确保系统的性能和稳定性。高可用性:云服务器还具有高可用性功能,可以在单个服务器上创建
2023-10-26

云服务器包括什么功能

云服务器(CloudDistributedServer,简称CDP)是一种云计算基础设施,可以提供可伸缩的资源和负载分担服务,以提高数据中心的资源利用率、降低成本,并且使得用户可以按需快速地添加和扩展资源。CDP主要包括以下功能:弹性计算(ABuggingCloudComputing):CDP能够动态地调整资源的使用情况,使得用户可以在需要时随时添加和缩减资源。高可用性(High-Res
2023-10-26

云服务器包括哪些功能设备和功能设备组成的功能

云服务器的功能包括但不限于以下几个方面:云服务器的部署和运行:云服务器可以通过互联网连接到用户的计算机上,通过网络将计算资源分配给用户。用户可以使用云服务器提供的虚拟化技术,将应用程序部署在云服务器上,从而快速启动应用程序并快速运行。云服务器还提供了安全和网络管理功能,包括防火墙、DDoS攻击、V
云服务器包括哪些功能设备和功能设备组成的功能
2023-10-28

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录