返回顶部
首页 > 资讯 > 后端开发 > Python >executor包执行器功能
  • 603
分享到

executor包执行器功能

2024-04-02 19:04:59 603人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

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

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包内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: executor包执行器功能

本文链接: https://lsjlt.com/news/139614.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • executor包执行器功能
    Executor接口基于以下方法可以完成增,删,改查以及事务处理等操作。事实上,mybatis中的所有数据库操作是通过调用这些方法实现的。 public interface Exec...
    99+
    2024-04-02
  • java executor包参数处理功能
    sql语句中的参数赋值是有由executor包中的parameter子包完成的。 parameter子包其实只有一个parameterHandler接口,它定义了2个方法: publ...
    99+
    2024-04-02
  • java的executor包有什么功能
    本篇内容主要讲解“java的executor包有什么功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java的executor包有什么功能”吧!sql语句中的参数赋值是有由executor包中...
    99+
    2023-06-29
  • mybatis源码解读之executor包懒加载功能
    ProxyFactory是创建代理类的工厂接口,其中的setProperties方法用来对工厂进行属性设置,但是mybatis内置的两个实现类都没有实现该接口,所以不支持属性设置。c...
    99+
    2024-04-02
  • mybatis中如何实现executor包懒加载功能 
    这篇文章主要为大家展示了“mybatis中如何实现executor包懒加载功能 ”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mybatis中如何实现executor包懒加载功能&nb...
    99+
    2023-06-29
  • mybatis源码解读之executor包语句处理功能
    1.mybatis对多语句类型的支持 在mybatis映射文件中传参数,主要用到#{} 或者 ${}. #{}:表示使用这种符号的变量会以预编译的形式赋值到sql片段中。 ${}:表...
    99+
    2024-04-02
  • mybatis的executor包语句处理功能源码分析
    这篇“mybatis的executor包语句处理功能源码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mybatis的e...
    99+
    2023-06-29
  • mybatis源码解读-Java中executor包的语句处理功能
    目录1.mybatis对多语句类型的支持2.mybatis的语句处理功能1.mybatis对多语句类型的支持 在mybatis映射文件中传参数,主要用到#{} 或者 ${}. #{}...
    99+
    2024-04-02
  • Hive中Metastore、Driver、Executor等组件的功能和作用
    Metastore:Hive Metastore 是 Hive 中的一个关键组件,用于存储 Hive 元数据信息。元数据信息包括数...
    99+
    2024-03-07
    Hive
  • linux能不能执行exe
    这篇文章主要介绍了linux能不能执行exe的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇linux能不能执行exe文章都会有所收获,下面我们一起来看看吧。 ...
    99+
    2023-04-13
    linux exe
  • Python 打包可执行文件
       Python程序需要依赖本机安装的Python库,若想在没有安装Python的机器上运行,则需要打包分发,目前有两个比较好用的工具:PyInstaller和py2exe。其中py2exe应用在windows下,而PyInstall则可...
    99+
    2023-01-31
    可执行文件 Python
  • Linux关机时执行指定脚本功能实现
    1.关机时执行某个脚本的具体思路 (1)在文件夹/etc/init.d/下创建关机时需要执行的脚本file_name; (2)分别在文件夹/etc/rc0.d/和/etc/rc6.d/下创建该该脚本文件的链接文件K07f...
    99+
    2022-06-04
    Linux 执行脚本
  • crontab怎么实现每10秒执行一次功能
    这篇文章主要介绍了crontab怎么实现每10秒执行一次功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。实例如下:vim /var/spool/cron/root...
    99+
    2023-06-09
  • php ignore_user_abort()实现计划(定时执行)任务功能
    要实现计划任务功能,可以使用ignore_user_abort()函数来忽略用户中断,并且在后台继续执行脚本。以下是一个示例,展示了...
    99+
    2023-10-11
    php
  • Java打包Jar包后使用脚本执行
    打包jar包的应用场景: 有时候,我们需要将一个java工程,放在服务器上让它执行。我们知道在IDE中,都是人为操作,执行这个程序。但是如果没有IDE环境,那么怎么执行Java工程呢...
    99+
    2024-04-02
  • 云服务器包括哪些功能类型和功能
    云服务器(Cloud Stack)提供的主要功能类型包括: IaaS(基础设施即服务):将计算资源(IaaS)提供给云服务器,用户可使用服务器的硬件资源、软件资源和网络资源,按需获取相应的服务。 PaaS(平台即服务):将云服务器集成到...
    99+
    2023-10-26
    功能 类型 服务器
  • 云服务器包括哪些功能设备和功能
    云服务器(Cloud Stack)提供了虚拟化技术,使得用户可以将计算资源和存储资源放置到任何位置。以下是这些功能和设备的一般概念: 功能:云服务器提供的功能包括: 存储管理:存储管理是云服务器的核心功能之一,包括数据分层、数据复制、数...
    99+
    2023-10-26
    功能 服务器 设备
  • 云服务器包括哪些功能设备和功能组成的功能
    服务器:用于存储和管理所有的云资源,包括服务器虚拟化、网络、存储等。 数据库:用于存储和管理数据,包括数据存储、数据备份、数据恢复等。 负载均衡:用于优化云服务器的性能,确保在高流量的情况下,云服务器能够快速响应和处理请求。 网络设备:用...
    99+
    2023-10-27
    功能 服务器 设备
  • Spring Boot实现在启动时执行一次的功能
    Spring Boot实现在启动时执行一次的功能 方法一:@PostConstruct方法二:使用Spring Boot提供的CommandLineRunner接口或ApplicationRu...
    99+
    2023-09-09
    spring boot java spring
  • Python实现脚本锁功能(同时只能执行一个脚本)
    1. 文件锁 脚本启动前检查特定文件是否存在,不存在就启动并新建文件,脚本结束后删掉特定文件。 通过文件的判断来确定脚本是否正在执行。 方法实现也比较简单,这里以python脚本为例 #coding=u...
    99+
    2022-06-04
    脚本 功能 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作