这篇博客学习下Mybatis操作中使用复述做缓存。这里其实主要学习几个注解:@CachePut, @Cacheable, @CacheEvict @CacheConfig。
下面话不多说了,来一起看看详细的介绍吧
<强> @Cacheable 强>
@Cacheable的作用主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
参数
解释
例子
价值
缓存的名称,在春天配置文件中定义,必须指定至少一个
例如:
@Cacheable (value=https://www.yisu.com/zixun/mycache)
@Cacheable (value=https://www.yisu.com/zixun/{“cache1”、“cache2”}
关键
缓存的关键,可以为空,如果指定要按照?表达式编写,如果不指定,则缺省按照方法的所有参数进行组合
@Cacheable(值=皌estcache”键=" #用户名")
条件
缓存的条件,可以为空,使用?编写,返回真实或者假,只有为真实才进行缓存
@Cacheable (value=皌estcache”,条件=" # userName.length ()> 2”)
<强>,@CachePut 强>
@CachePut的作用主要针对方法配置,能够根据方法的返回值对其结果进行缓存,和@Cacheable不同的是,它每次都会触发真实方法的调用,在其他地方写的是根据方法的请求参数对其结果进行缓存,实际是按方法返回值进行缓存的,这里我就遇到了一个坑,我开始的时候是在Mybatis的映射层进行缓存的,如下面的代码。但是缓存到复述的是零值,今天看了一博友的博客,交流了一下,才知道它缓存的是方法的返回值,如果把下面更新的返回值该为int,在复述中保存的是int类型,报的错误是int无法转换成用户对象。
@CachePut(值=" https://www.yisu.com/zixun/user "键=" # p0.id ") @Update({“更新用户组名称=#{名称},年龄=#{时代},id=# {id} "}) 无效更新用户(用户);
参数 解释 例子 价值 缓存的名称,在春天配置文件中定义,必须指定至少一个 @CachePut (value=https://www.yisu.com/zixun/盎捍妗? 关键 缓存的关键,可以为空,如果指定要按照?表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 @CachePut(值=皌estcache”键=" #用户名") 条件 缓存的条件,可以为空,使用?编写,返回真实或者假,只有为真实才进行缓存 @CachePut (value=皌estcache”,条件=" # userName.length ()> 2”)
<强>,@CachEvict 强>
, @CachEvict的作用主要针对方法配置,能够根据一定的条件对缓存进行清空
参数 解释 例子 价值 缓存的名称,在春天配置文件中定义,必须指定至少一个 @CacheEvict (value=https://www.yisu.com/zixun/盎捍妗? 关键 缓存的关键,可以为空,如果指定要按照?表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 @CacheEvict(值=皌estcache”键=" #用户名") 条件 缓存的条件,可以为空,使用?编写,返回真实或者假,只有为真实才进行缓存 @CacheEvict (value=皌estcache”,条件=" # userName.length ()> 2”) allEntries 是否清空所有缓存内容,缺省为假,如果指定为真,则方法调用后将立即清空所有缓存 @CachEvict (value=" testcache allEntries=true) beforeInvocation 是否在方法执行前就清空,缺省为假,如果指定为真,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存 @CachEvict (value=" testcache beforeInvocation=true)
<强> @CacheConfig 强>
所有的@Cacheable()里面都有一个价值=皒xx”的属性,这显然如果方法多了,写起来也是挺累的,如果可以一次性声明完那就省事了,有了@CacheConfig这个配置,@CacheConfig是一个类级别注释,允许共享缓存名称,如果你在你的方法写别的名字,那么依然以方法的名字为准。
还是在上一博客演示的基础上进行修改,原本是在Mybatis的映射层上增加缓存注解,但由于更新返回值为空白,所以这里又增加了一层服务,映射层算是DAO层。这里使用了@CacheConfig注解指定类级别属的价值性,如果在方法上定义就以方法为主,就近原则。