缓存
缓存的目的是加快查询, 在开启缓存的情况下, MyBatis会把查到的结果放到内存中,下次查到时会先从内存中查找,匹配则直接返回,提升性能。
缓存的类型、作用范围以及失效场景且往下看。
一级缓存
一级缓存针对同一个SqlSession内有效, 如果同一SqlSession中发生事务性操作则失效。默认开启。
二级缓存
二级缓存是Mapper级别的,默认关闭,同一mapper文件共享,同一mapper内如果发生事务性操作则失效,
如果要开启二级缓存则在核心配置文件加上
<setting name="cacheEnable" value="true" />分布式环境下不建议用因为会造成不一致问题,这种情况下可以用redis来代替二级缓存,实现cache接口。
或者直接使用提供的redis缓存实现
插件
MyBatis四大组件(Executor StatmentHandler ParameterHandler ResultSetHandler)都提供了插件机制,可以可以拦截组件中的方法.
其实在四大对象创建出来的时候返回的是其代理对象,所以在执行方法时可以通过类似AOP方式实现自己的拦截逻辑。
自定义插件方法
- intercept方法 实现之
- plugin方法 生成target的代理 对象
- setProperties方法 传递插件所需要的参数
加上 @Intercepts 注解,里面用@Signature定义拦截的方法
功能架构
mybatis功能架构分为三层
接口层 提供给外部 使用的API
数据处理层 负责 SQL解析和执行
框架支撑层 连接管理 、事务管理、配置加载、缓存处理

源码分析
四大组件




传统执行流程源码分析
mapper代理方式源码分析
设计模式
| 模式名称 | 举例 | 说明 |
|---|---|---|
| Builder模式 | SqlSessionFactoryBuilder | |
| 工厂方法模式 | SqlSessionFactory | |
| 单例模式 | LogFactory | |
| 代理模式 | MapperProxy | |
| 组合模式 | SqlNode | |
| 模板方法模式 | BaseExecutor、SimpleExecutor、BaseTypeHandler | |
| 适配器模式 | log包 | |
| 装饰者模式 | cache包 | |
| 迭代器模式 | PropertyTokenizer | |
| 适配器模式 | log包 |
0条评论