mybatis四大神器之Executor执行器

上篇文章介绍了mybatis中的关键对象SqlSessionFactory的创建过程,本篇文章继续介绍下执行器executor。每个SqlSession都会拥有一个Executor对象,这个对象负责增删改查操作,我们可以简单的将它理解为JDBC中Statement的封装版

executor继承结构

image
  • Executor接口:有两个实现类BaseExecutor、CachingExecutor
  • BaseExecutor:是一个抽象类,抽象类实现接口是”适配器模式“的体现,为了方便下一级实现类对接口中方法的实现;BaseExecutor有三个子类分别是simpleExecutor、ResuseExecutor、BatchExecutor
  • SimpleExecutor:是MyBatis中默认使用的执行器. 每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。(可以是Statement或PrepareStatement对象)
  • ReuseExecutor:可重用执行器,这里的重用指的是重复使用Statement. 它会在内部利用一个Map把创建的Statement都缓存起来,每次在执行一条SQL语句时,它都会去判断之前是否存在基于该SQL缓存的Statement对象,存在而且之前缓存的Statement对象对应的Connection还没有关闭的时候就继续用之前的Statement对象,否则将创建一个新的Statement对象,并将其缓存起来。因为每一个新的SqlSession都有一个新的Executor对象,所以我们缓存在ReuseExecutor上的Statement的作用域是同一个SqlSession
  • BatchExecutor:批处理执行器,.用于将多个sql语句一次性输送到数据库执行.
  • CachingExecutor:缓存执行器, 先从缓存中获取查询结果,存在就返回,不存在,再委托给Executor delegate去数据库取,delegate可以是上面任一的SimpleExecutor、ReuseExecutor、BatchExecutor

Executor的创建

在SqlSessionFactory创建完成后,调用openSession方法:

    public SqlSession openSession() {
        return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false);
    }

在SqlSessionFactory的默认实现类DefaultSqlSessionFactory可以看到openSession中调用了openSessionFromDataSource,在这个方法中会创建一个执行器,代码如下

private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
        Transaction tx = null;

        DefaultSqlSession var8;
        try {
            Environment environment = this.configuration.getEnvironment();
            TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(environment);
            tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
            Executor executor = this.configuration.newExecutor(tx, execType);
            var8 = new DefaultSqlSession(this.configuration, executor, autoCommit);
        } catch (Exception var12) {
            this.closeTransaction(tx);
            throw ExceptionFactory.wrapException("Error opening session.  Cause: " + var12, var12);
        } finally {
            ErrorContext.instance().reset();
        }

        return var8;
    }

执行器对象是由Coniguration对象负责创建的.Configuration对象会根据得到ExecutorType创建对应的Excecutor对象,并把这个Excecutor对象传给SqlSession对象

ExcecutorType的选择

ExecutorType来决定Configuration对象创建何种类型的执行器.它的赋值可以通过两个地方进行赋值.

首先.可以通过标签来设置当前工程中所有SqlSession对象使用的默认Executour

image

也可以通过SqlSessoinFactory中openSession方法来指定具体的SqlSession使用的执行器

image

原文地址

http://cbaj.gitee.io/blog/2020/07/25/mybatis%E5%9B%9B%E5%A4%A7%E7%A5%9E%E5%99%A8%E4%B9%8BExecutor%E6%89%A7%E8%A1%8C%E5%99%A8/#more

你可能感兴趣的:(mybatis四大神器之Executor执行器)