mybatis MyBatis缓存实现类

2020-09-01  本文已影响0人  dylan丶QAQ

起因:在工作中常常要用到mybatis框架,如果对其执行流程不清楚的话,就会有一种出了bug不知道要去什么地方找的尴尬。本文为学习《Mybatis源码深度解析》后的总结。感谢江荣波的这本书。


1.MyBatis的缓存基于JVM堆内存实现

  了解一下MyBatis缓存的实现原理。MyBatis的缓存基于JVM堆内存实现,即所有的缓存数据都存放在Java对象中。MyBatis通过Cache接口定义缓存对象的行为,Cache接口代码如下

Cache接口

2.Cache接口中各个方法

getId():该方法用于获取缓存的Id,通常情况下缓存的Id为Mapper的命名空间名称。
putObject():该方法用于将一个Java对象添加到缓存中,该方法有两个参数,第一个参数为缓存的Key,即CacheKey的实例;第二个参数为需要缓存的对象。
getObject():该方法用于获取缓存Key对应的缓存对象。
removeObject():该方法用于将一个对象从缓存中移除。
clear():该方法用于清空缓存。
getReadWriteLock():该方法返回一个ReadWriteLock对象,该方法在3.2.6版本后已经不再使用。

3.Cache接口的实现类

  MyBatis中的缓存类采用装饰器模式设计,Cache接口有一个基本的实现类,即PerpetualCache类,该类的实现比较简单,通过一个HashMap实例存放缓存对象。需要注意的是,PerpetualCache类重写了Object类的equals()方法,当两个缓存对象的Id相同时,即认为缓存对象相同。另外,PerpetualCache类还重写了Object类的hashCode()方法,仅以缓存对象的Id作为因子生成hashCode。

  除了基础的PerpetualCache类之外,MyBatis中为了对PerpetualCache类的功能进行增强,提供了一些缓存的装饰器类,如图所示。

Mybatis缓存实现类

4.Cache缓存装饰器类功能

4.PerpetualCache类及MyBatis提供了缓存装饰类的使用案例

  如上面的代码所示,我们可以使用MyBatis提供的缓存装饰器类对基础的PerpetualCache类的功能进行增强,使用不同的装饰器后,缓存对象则拥有对应的功能。
  另外,MyBatis提供了一个CacheBuilder类,通过生成器模式创建缓存对象。下面是使用CacheBuilder构造缓存对象的案例:


不要以为每天把功能完成了就行了,这种思想是要不得的,互勉~!

上一篇下一篇

猜你喜欢

热点阅读