杏彩体育网站注册Mybatis成神之路-Mybatis执行体系(Executor
栏目:公司动态 发布时间:2024-05-05 04:19:58

  杏彩体育网站注册Mybatis成神之路-Mybatis执行体系(Executor执行器详解)执行器的种类有:基础执行器、简单执行器、重用执行器和批处理执行器,此外通过装饰者设计模式额外添加了一个缓存执行器。 执行器存在的意义就是去处理SQL的共性。 如果说每个SQL调用是独立的,不需要缓存,不需要事务,也不需集中在一起进行批处理的话,Executor也就没有存在的必要。但事实上这些都是MyBatis中不可或缺的特性。所以才设计出Executor这个组件。 多个SQL可能拥有相同的共性:比如需要在同一个事务下使用,比如批处理等等

  1.2.1 Executor:执行器顶层接口(一般都是将某个工具的最基本的功能的抽象方法们定义成一个接口,只要继承自该类,都要实现该接口的所有抽象方法)

  11 close 一级缓存执行器BaseExecutor中的实现内容是:清空一级缓存,二级缓存执行器CachingExecutor中的实现内容是清空二级缓存

  在使用BatchExecutor执行器的时候,执行以下SQL会使用多少个Statement,返回的数据集元素有多少个?

  BaseExecutor的作用:公共执行器就是去处理三个子执行器中公有的功能逻辑,即1级缓存和事务:

  2 事务:多个SQL合并在一起就叫事务(一般使用Spring来管理事务,而不是Mybatis)

  3 缓存:执行器的功能,除了增删改查以外,有缓存和事务,还有多个SQL的重用,这些都是多个SQL执行过程中有共性的地方。杏彩体育平台(两个SQL,参数和SQL语句一样,那么就可以命中缓存,那么说缓存就是这两个SQL语句的共性。)

  基础执行器的构成主要是query方法和update方法,和几个抽象方法doQuery和doUpdate方法,查询的时候先是调用query方法,处理完1级缓存逻辑后,再去调用doQuery方法,把真正查询数据库的逻辑交给(执行器的三个子类),分别是:SimpleExecutor(简单执行器)(默认执行器),ReuseExecutor(重用执行器),BatchExecutor(批处理执行器)其中一个。杏彩体育注册

  它实现了Executor中的Query与update方法。会话中SQL请求,正是调用的这两个方法。Query方法中处理一级缓存逻辑,即根据SQL及参数判断缓存中是否存在数据,有就走缓存。否则就会调用子类的doQuery() 方法去查询数据库,然后在设置缓存。在doUpdate() 中主要是用于清空缓存。

  基础执行器实现了Executor接口,这个接口中有两个比较关键的方法,一个query方法,一个update方法:

  1 query方法:在会话请求当中,如果是查询就去调用query方法,query方法中有一级缓存的逻辑,他有缓存,我们就去走缓存,没有缓存的话,那么我们就会去从数据库里面查。查到了以后就将结果集放入一级缓存中。

  2 update方法:在update中,针对这个缓存的逻辑主要是去清空这个缓存,只要调用这个update方法,所有的一级缓存在当前会话中都会被全部清空,并不是针对一条数据,是清空全部。

  BaseExecutor总结:1 是简单执行器,重用执行器,批处理执行器的父类,存储着它们的共性功能,即缓存维护和事务管理 2 CachingExecutor二级缓存执行器的delegate属性指向BaseExecutor(根据OOP多态思想,因为是向上转型后的三种执行器之一)

  CachingExecutor设计使用了装饰器模式,delegate属性指向了BaseExecutor(使用装饰者模式,将三种Executor之一的执行器放入delegate属性中,执行它们的逻辑之前,先执行CachingExecutor的二级缓存逻辑),Mybatis一级缓存必须存在,二级缓存可有可无,装饰者模式使所有执行一级缓存的逻辑之前嵌套了二级缓存的执行逻辑,不得不说,二级缓存的责任链,装饰者等模式设计NB!!!,下一个章节就会讲到,大家拭目以待...

  ReuseExecutor 区别在于他会将在会话期间内的Statement进行缓存,并使用SQL语句作为Key。所以在相同会话内,执行下一请求的时候,不在重复构建Statement,而是从缓存中取出并设置参数,然后执行,提高性能。

  BatchExecutor 顾名思议,它就是用来作批处理的。但会将所有会话期间内的所有SQL请求集中起来,最后调用Executor.flushStatements() 方法时一次性将所有请求发送至数据库。

  这里它是利用了Statement中的addBath 机制吗?不一定,因为只有连续相同的SQL语句并且相同的SQL映射声明,才会重用Statement,并利用其批处理功能。否则会构建一个新的Satement然后在flushStatements() 时一次执行。 (保证执行顺序,保证调用顺序和执行顺序一定要是一样的,如果不一样...比如两个操作,新增和修改,一旦修改在新增前面,就会执行失败,因为此时还没有这个数据。)

  查看Executor 的子类还有一个CachingExecutor,这是用于处理二级缓存的。为什么不把它和一级缓存一起处理呢?因为二级缓存和一级缓存相对独立的逻辑,而且二级缓存可以通过参数控制关闭,而一级缓存是不可以的。综上原因把二级缓存单独抽出来处理。抽取的方式采用了装饰者设计模式,即在CachingExecutor 对原有的执行器进行包装,处理完二级缓存逻辑之后,把SQL执行相关的逻辑交给实至的Executor处理。