缓存

缓存的目的是加快查询, 在开启缓存的情况下, MyBatis会把查到的结果放到内存中,下次查到时会先从内存中查找,匹配则直接返回,提升性能。
缓存的类型、作用范围以及失效场景且往下看。

一级缓存

一级缓存针对同一个SqlSession内有效, 如果同一SqlSession中发生事务性操作则失效。默认开启。

二级缓存

二级缓存是Mapper级别的,默认关闭,同一mapper文件共享,同一mapper内如果发生事务性操作则失效,
如果要开启二级缓存则在核心配置文件加上

<setting name="cacheEnable" value="true" />

分布式环境下不建议用因为会造成不一致问题,这种情况下可以用redis来代替二级缓存,实现cache接口。
或者直接使用提供的redis缓存实现

插件

MyBatis四大组件(Executor StatmentHandler ParameterHandler ResultSetHandler)都提供了插件机制,可以可以拦截组件中的方法.
其实在四大对象创建出来的时候返回的是其代理对象,所以在执行方法时可以通过类似AOP方式实现自己的拦截逻辑。

自定义插件方法

  1. intercept方法 实现之
  2. plugin方法 生成target的代理 对象
  3. setProperties方法 传递插件所需要的参数
    加上 @Intercepts 注解,里面用@Signature定义拦截的方法

功能架构

mybatis功能架构分为三层
接口层 提供给外部 使用的API
数据处理层 负责 SQL解析和执行
框架支撑层 连接管理 、事务管理、配置加载、缓存处理

null

源码分析

四大组件

null
null
null
null

传统执行流程源码分析

mapper代理方式源码分析

设计模式

模式名称 举例 说明
Builder模式 SqlSessionFactoryBuilder
工厂方法模式 SqlSessionFactory
单例模式 LogFactory
代理模式 MapperProxy
组合模式 SqlNode
模板方法模式 BaseExecutor、SimpleExecutor、BaseTypeHandler
适配器模式 log包
装饰者模式 cache包
迭代器模式 PropertyTokenizer
适配器模式 log包