标签:执行器 缓存 sqlSession Statement sql Mybatis 执行
JDBC的执行流程如下图:
先提起JDBC是因为mybatis就是一个基于JDBC的ORM(Object/Relation Mapping 对象/关系映射)框架。
mybatis执行器:
**执行接口Executor:**提供增删改查,提交事务,回滚,关闭等操作。
**抽象父类BaseExecutor:**主要提供获取连接,一级缓存等公共功能。query方法提供缓存使用。这也是我们经常说的基于sqlsession的一级缓存。
**简单执行器SimpleExecutor:**默认的执行器,每次执行sql 的时候,就开启一个Statement对象,用完就关闭这个对象(可以是Statement或Preparement对象),等于是每次执行都会开启预编译处理。
**重用执行器ReuseExecutor:**执行sql,以sql作为key查找Statement对象,存在就i使用,不存在就创建,用完后,不关闭Statement对象,而是放在Map<String,Statement>内,供下一次使用。(可以是Statement或Preparement对象),多次执行同一sql不重复进行预编译处理。
**批量执行器BatchExecutor:**执行sql时,将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理的(可以是Statement或PrepareStatement对象)。
需要特别注意的时, 当选择批量执行器时, 纵使在获取sqlSession时, 设置了自动提交事务, 也需要手动提交事务
批处理刷新:executor.doFlushStatements(false);-----执行完毕提交事务
**缓存执行器CachingExecutor:**先从缓存中获取结果,存在就放回,不存在就去数据库查询。这里是二级缓存,调用query方法时首先执行查询二级缓存,如果二级缓存没有再去查询一级缓存。二级缓存需要主动开启,不能自定义数据处理器。
**ClosedExecutor:**不需要关注,它是一个私有内部类。
**AbstractBaseExecutor:**不需要关注,这块儿不属于mybatis的代码。
局部设置:
在获取sqlSession时设置, 需要注意的时, 如果选择的是批量执行器时, 需要手工提交事务。
// 获取指定执行器的sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)
// 获取批量执行器时, 需要手动提交事务
sqlSession.commit();
全局配置:
可在全局配置文件中配置
<settings>
<setting name="defaultExecutorType" value="BATCH" />
</settings>
标签:执行器,缓存,sqlSession,Statement,sql,Mybatis,执行 来源: https://blog.csdn.net/sungancd/article/details/120389187
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。