谈谈mybatis的执行器

    技术2025-02-11  15

    JDBC执行流程: 提到JDBC是因为mybatis就是一个基于JDBC的ORM框架

    mybatis执行器: 执行器接口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.不能有自定义的数据处理器 org.apache.ibatis.executor.CachingExecutor#query

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

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

    作用范围:以上这五个执行器的作用范围,都严格限制在SqlSession生命周期范围内。

    执行流程:

    SqlSession接口的提供降低了mybatis调用的复杂度,更加容易上手。

    参考资料: https://my.oschina.net/u/3737136/blog/1812422

    Processed: 0.012, SQL: 9