JDBC的执行流程如下图:

centos7 mariadb批量执行一个文件夹内的SQL_mysql


先提起JDBC是因为mybatis就是一个基于JDBC的ORM(Object/Relation Mapping 对象/关系映射)框架。mybatis执行器:

centos7 mariadb批量执行一个文件夹内的SQL_mysql_02


执行接口Executor: 提供增删改查,提交事务,回滚,关闭等操作。

抽象父类BaseExecutor: 主要提供获取连接,一级缓存等公共功能。query方法提供缓存使用。这也是我们经常说的基于sqlsession的一级缓存。

简单执行器SimpleExecutor: 默认的执行器,每次执行sql的时候,就开启一个Statement对象,用完就关闭这个对象(可以是Statement或Preparement对象),等于是每次执行都会开启预编译处理。

重用执行器ReuseExecutor: 执行sql,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放在Map<String,Statement>内,供下一次使用。(可以是Statement或Preparement对象),多次执行同一sql不重复进行预编译处理。

批量执行器BatchExecutor: 执行sql时,将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理的(可以是Statement或PrepareStatement对象)。

需要特别注意的时, 当选择批量执行器时, 纵使在获取sqlSession时, 设置了自动提交事务, 也需要手动提交事务
批处理刷新:executor.doFlushStatements(false);-----执行完毕提交事务

缓存执行器CachingExecutor: 先从缓存中获取结果,存在就放回,不存在就去数据库查询。这里是二级缓存,调用query方法时首先执行查询二级缓存,如果二级缓存没有再去查询一级缓存。二级缓存需要主动开启,不能自定义数据处理器。

centos7 mariadb批量执行一个文件夹内的SQL_二级缓存_03


ClosedExecutor: 不需要关注,它是一个私有内部类。

AbstractBaseExecutor: 不需要关注,这块儿不属于mybatis的代码。

局部设置:
在获取sqlSession时设置, 需要注意的时, 如果选择的是批量执行器时, 需要手工提交事务。

// 获取指定执行器的sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)

// 获取批量执行器时, 需要手动提交事务
sqlSession.commit();

全局配置:
可在全局配置文件中配置

<settings>
    <setting name="defaultExecutorType" value="BATCH" />
</settings>