Mybatis之Executor执行器(一)

一、前言:

​ mybatis框架有四大步骤,分别为接口代理、门面会话、执行器、jdbc处理器,本文将针对执行器进行展开.

二、执行器

  • 执行器关系图

    Executor是执行器接口,BaseExecutor是一个抽象类,负责管理mybatis的一级缓存(会话级缓存)逻辑,BaseExecutor的子类有SimpleExecutor(简单执行器)、ReuseExecutor(可重用执行器)、BatchExecutor(批处理执行器),还有CachingExecutor,继承Executor,主要负责mybatis的二级缓存(应用级缓存).

    avatar

  • Executor

    Executor是mybatis中的执行器接口

    avatar

    avatar

  • BaseExecutor

    基础执行器,主要职责mybatis的一级缓存(会话级缓存),增、删、改都会清空一级缓存,下面看一下BaseExecutor的基本成员变量.

    avatar

  • SimpleExecutor

    简单执行器,每次都会创建一个StatementHandler(Statement处理器)进行查询.

  • ReuseExecutor

    可重用执行器,内部会创建一个statementMap,用来缓存每次执行的sql语句创建的statement,从而达到复用.

    avatar

  • BatchExecutor

    批处理执行器,每次增、删、该操作会将sql语句创建的statement缓存到内部的statementList中,

    调用doFlushStatements才是真正对sql进行执行,将结果数据缓存到内部的batchResultList中,最终才能获取到执行结果

    avatar

  • CachingExecutor

    缓存执行器,主要职责mybatis的二级缓存(应用级缓存),包装Executor执行器,通过TransactionalCacheManager(事务缓存管理器)对当前的Executor进行二级缓存逻辑处理.

    avatar

三、存在BaseExecutor,为什么还要设计SimpleExecutor、ReuseExecutor、BatchExecutor?

​ mybatis的Executor体系思想为单一职责,如果将SimpleExecutor、ReuseExecutor、BatchExecutor放入其中,不由思索,BaseExecutor量太大,所做事情形同一个人做几个人的事情,所以这种单一职责设计是不是可以灵活运用,解决代码堆积在一个类的问题.

四、总结

​ 通过上面的了解,我们已经初步认识到mybatis中的Executor各大执行器,其中单一职责设计不由感到妙啊!细心的小伙伴已经发现了CachingExecutor中的delegate, 不知名会发现这是啥,其实这是装饰了Executor,没错这就是装饰器模式.

​ 切记BaseExecutor的一级缓存是会话级别的哟,增、删、改都会清空一级缓存,CachingExecutor的二级缓存是应用级的.

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

请我喝杯咖啡吧~

支付宝
微信