首先使用IDEA的Spring初始化器,引入cache,mysql,mybatis,web等模块
先在主方法加上以下注解开启cache缓存:
@EnableCaching
缓存加载方法体上的作用如下:
1.@Cacheable(cacheNames = “emp”,condition = “” ,unless = “” ,key = “” ,sync = “” )
这个注解用于运行方法时如果缓存中没有对应的返回值,就执行方法并且加入缓存.如果返回值已经存在于缓存中,则不执行该方法并且直接返回缓存中的值,可用于查询操作
@Cacheable(cacheNames = "emp",condition="a0>0") //将方法运行结果进行缓存
public Employee selectById(Integer id) {
System.out.println("Service层查询一个员工id=" + id);
Employee employee = employeeMapper.selectById(id);
return employee;
}
这里有几个常用取值:
cacheNames/value:指定存在于哪个缓存空间里,可以同时存进多个缓存空间,上面将查询的结果存入名称为emp的缓存空间里
condition:指定缓存的条件,上面执行结果是当传入的id值大于0时才执行缓存操作,即id小于等于零的返回值都不会被存进
unless:与condition相反,当unless的值为true时不会执行缓存
key:指定生成key的值,默认如果不配的话会将返回值作为key值,如上面生成的key就是id.生成键值对就是id:id
sync:指定是否为异步操作,当指定为true时为异步,这时候要注意unless将会失效!
2.@CachePut(value = “emp”,key = “#result.id”)
这个注解用于同步执行方法与缓存,即每次执行被注解的方法都会运行存入缓存操作,不论存在与否.多用于插入,更新等数据实时更新的操作
@CachePut(value = "emp",key = "#result.id") //方法执行缓存就更新,多用于缓存更新,默认key是返回的Employee
public Employee update(Employee employee) {
System.out.println("Service层更新一个员工id=" + employee.getId());
employeeMapper.update(employee);
return employee;
}
这里要注意,如果没有配置key的值,让其使用默认的key值将会是employee对象,会发现跟上面执行查询之后存入的key值不一样,务必要使用key更改默认的key值,这里用了SpEL表达式#result.id 这个表达式的意思是取下返回值的id作为key值.另外#result.id的写法不支持上面的注解@Cacheable,因为这个注解会先执行查询缓存操作.
至于注解里的取值跟上面差不多
3.@CacheEvict(value = “emp”, key = “#id”,beforeInvocation=“false”)
这个注解用于移除缓存中的数据,多用于删除
@CacheEvict(value = "emp", key = "#id")
public void delete(Integer id) {
System.out.println("Service层删除一个员工id=" + id);
employeeMapper.delete(id);
}
这里要注意,如果不知道key值,默认将会删除传入值为key值的数据
注解里的取值,还多出两个常用的:
allEntries:清除所有该缓存空间下的数据,即当配置了这个属性,key属性将会失效,默认值是false
beforeInvocation:是否在执行方法前删除缓存数据,默认是false,即默认是在执行方法之后执行的
4.@Caching()
这个注解可以定义多个缓存规则
@Caching(
cacheable = {
@Cacheable(value = "emp",key = "lastName")
},
put = {
@CachePut(value = "emp",key = "#result.id")
@CachePut(value = "emp",key = "#result.email")
}
)
public Employee selectByName(String lastName) {
return employeeMapper.selectByName(lastName);
}
可见上面介绍的方法都可以同时作用在一个方法上,就要使用该注解
5.@CacheConfig(cacheNames = “emp”)
第四个注解使用的示例会发现我们写了很多个相同的value=“emp”,那么我们可以使用@CacheConfig进行提取,这样下面在配置的时候就不要写上value或者cacheNames这两个属性了,要注意这个注解要写在当前类上作为公共属性.
@CacheConfig(cacheNames = "emp")
@Service
public class EmployeeService {