mybatis执行器Executor接口有六个实现,分别为:
在这里插入图片描述
类结构图:
在这里插入图片描述
下面对以上类图中的类进行说明:
执行器接口Executor:提供改查(常说的“增、删、改、查”可以合并为“改、查”),提交,回滚,关闭等操作。

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

简单执行器SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。(可以是Statement或PrepareStatement对象),多次执行同一sql多次进行预编译处理。

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

批量执行器BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理的(可以是Statement或PrepareStatement对象)
批处理刷新:executor.doFlushStatements(false);-----执行完毕提交事务

缓存执行器CachingExecutor:装饰设计模式,先从缓存中获取查询结果,存在就返回,不存在,再委托给Executor delegate去数据库取,delegate可以是上面任一的SimpleExecutor、ReuseExecutor、BatchExecutor。这里是二级缓存,调用query方法时执行首先查询二级缓存,如果二级没有再查询一级缓存。
这里需要注意使用二级缓存条件:1.主动开启二级缓存;2.不能有自定义的数据处理器,也就是handler
org.apache.ibatis.executor.CachingExecutor#query

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

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

下面我们来看一下关键执行器的流程图:

在这里插入图片描述

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐