Mybatis的Executor介绍
Mybatis中所有的Mapper语句的执行都是通过Executor进行的,Executor是Mybatis的一个核心接口,其定义如下。从其定义的接口方法我们可以看出,对应的增删改语句是通过Executor接口的update方法进行的,查询是通过query方法进行的。虽然Executor接口的实现类有BaseExecutor和CachingExecutor,而BaseExecutor的子类又有SimpleExecutor、ReuseExecutor和BatchExecutor,但BaseExecutor是一个抽象类,其只实现了一些公共的封装,而把真正的核心实现都通过方法抽象出来给子类实现,如doUpdate()、doQuery();CachingExecutor只是在Executor的基础上加入了缓存的功能,底层还是通过Executor调用的,所以真正有作用的Executor只有SimpleExecutor、ReuseExecutor和BatchExecutor。它们都是自己实现的Executor核心功能,没有借助任何其它的Executor实现,它们是实现不同也就注定了它们的功能也是不一样的。Executor是跟SqlSession绑定在一起的,每一个SqlSession都拥有一个新的Executor对象,由Configuration创建。
SimpleExecutor是Mybatis执行Mapper语句时默认使用的Executor。它提供最基本的Mapper语句执行功能,没有过多的封装的。
ReuseExecutor,顾名思义,是可以重用的Executor。它重用的是Statement对象,它会在内部利用一个Map把创建的Statement都缓存起来,每次在执行一条SQL语句时,它都会去判断之前是否存在基于该SQL缓存的Statement对象,存在而且之前缓存的Statement对象对应的Connection还没有关闭的时候就继续用之前的Statement对象,否则将创建一个新的Statement对象,并将其缓存起来。因为每一个新的SqlSession都有一个新的Executor对象,所以我们缓存在ReuseExecutor上的Statement的作用域是同一个SqlSession。
BatchExecutor的设计主要是用于做批量更新操作的。其底层会调用Statement的executeBatch()方法实现批量操作。
既然BaseExecutor下面有SimpleExecutor、ReuseExecutor和BatchExecutor,Executor还有一个CachingExecutor的实现,那我们怎么选择使用哪个Executor呢?默认情况下Mybatis的全局配置cachingEnabled=”true”,这就意味着默认情况下我们就会使用一个CachingExecutor来包装我们真正使用的Executor,这个在后续介绍Mybatis的缓存的文章中会介绍。那我们真正使用的BaseExecutor是怎么确定的呢?是通过我们在创建SqlSession的时候确定的。SqlSession都是通过SqlSessionFactory的openSession()创建的,SqlSessionFactory提供了一系列的openSession()方法。
public interface SqlSessionFactory { SqlSession openSession();
SqlSession openSession(boolean autoCommit);
SqlSession openSession(Connection connection);
SqlSession openSession(TransactionIsolationLevel level);
SqlSession openSession(ExecutorType execType);
SqlSession openSession(ExecutorType execType, boolean autoCommit);
SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level); SqlSession openSession(ExecutorType execType, Connection connection); Configuration getConfiguration(); }
从上面SqlSessionFactory提供的方法来看,它一共提供了两类创建SqlSession的方法,一类是没有指定ExecutorType的,一类是指定了ExecutorType的。很显然,指定了ExecutorType时将使用ExecutorType对应类型的Executor。ExecutorType是一个枚举类型,有SIMPLE、REUSE和BATCH三个对象。
而没有指定ExecutorType时将使用默认的Executor。Mybatis默认的Executor是SimpleExecutor,我们可以通过Mybatis的全局配置defaultExecutorType来进行配置,其可选值也是SIMPLE、REUSE和BATCH。
<setting name="defaultExecutorType" value="SIMPLE"/>
注意,当Mybatis整合Spring后,Spring扫描后生成的Mapper对象,底层使用的SqlSession都是用的默认的Executor。如果我们需要在程序中使用非默认的Executor时,我们可以在Spring的bean容器中声明SqlSessionFactoryBean,然后在需要指定Executor的类中注入SqlSessionFactory,通过SqlSessionFactory来创建指定ExecutorType的SqlSession。
Mybatis的Executor介绍相关推荐
- Executor介绍
1.Executor介绍: Executor是mybatis的核心接口之一,其中定义了数据库操作的基本方法,它的子类结构图如下:这这张关系图中,涉及到了模板方法模式和装饰器模式.BaseExecuto ...
- 后端:MyBatis缓存知识介绍
今天给大家分享一下MyBatis缓存知识介绍,希望对大家日常的开发当中能有所帮助! 一.MyBatis一级缓存 1.一级缓存介绍 当我们的程序MyBatis开启一次和数据库的会话,MyBatis会自动 ...
- Mybatis 拦截器介绍
Mybatis 拦截器介绍 1.1 目录 1.2 前言 1.3 Interceptor接口 1.4 注册拦截器 1.5 Mybatis可拦截的方法 1.6 利用拦截器进行分页 拦截器的一个作用就是我们 ...
- 《转载》Mybatis 拦截器介绍
Mybatis 拦截器介绍 1.1 目录 1.2 前言 1.3 Interceptor接口 1.4 注册拦截器 1.5 Mybatis可拦截的方法 1.6 利用拦截器进行分页 1.2 拦截器的一个作用 ...
- MyBatis超详细介绍——SQL语句构建器类
MyBatis超详细介绍--SQL语句构建器类 (本文作为学习笔记,了解更多请参考:MyBatis参考文档) MyBatis3提供了SQL类帮助构造SQL语句: private String sele ...
- MyBatis全局配置文件介绍
一.properties properties标签可以用于引入外部的配置文件,也可以用于定义全局变量. 比如我们在配置数据源的时候习惯把相关的信息单独的放在一个配置文件中,方便修改. 数据库配置信息d ...
- Mybatis源码介绍
Mybatis源码体系介绍和配置文件解析源码剖析 Mybatis和传统JDBC的优势 Mybatis MyBatis是一个持久层的ORM框架,使用简单,学习成本较低.可以执行自己手写的 SQL语句,比 ...
- 手写自己的MyBatis框架-Executor
到了sqlSession 的selectOne()方法,这里我们要去调用Executor 的query()方法,这个时候我们必须传入SQL 语句和参数(根据statementId 获取). 问题来了: ...
- mybatis数据库连接池介绍和源码剖析
mybatis数据库连接池分析介绍 一.数据库连接池 1.定义 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个:释放空闲时间超过最大空闲时 ...
最新文章
- matplotlib tick_params参数刻度线调整
- 实现Map并保持插入顺序的Java类?
- [mvc] 简单的forms认证
- 【微信小程序】wx:if
- float在python_如何在python中读取.float文件? - python
- 【今日CV 视觉论文速览】 04 Dec 2018
- windows下docker安装mysql
- 复杂关联SQL的优化
- WIN10常用快捷键(打开资源管理器、显示桌面、截图)
- 源码安装 nginx 并设置为 service
- 使用QRCode轻松实现二维码扫描下载的功能
- 【BZOJ】【2730】【HNOI2012】矿场搭建
- Java企业级实战项目《瑞吉外卖》
- 路由器最高速度/性能测试 - Windows 安装 IPerf3 及 使用方法
- html 设置字体加粗,css如何设置字体加粗样式?
- 零基础SSM入门教程(50)–Spring总结与展望SpringBoot、SpringCloud
- Turbo-rack技术背景及简介
- Unity地图分割组合时出现接缝的处理办法
- Linux CFS调度器之负荷权重load_weight--Linux进程的管理与调度(二十五)
- Java工程师修炼之路(校招总结)