H2数据库
新建一个模块
schema.sql
drop table if exists guest;
create table guest(id int primary key auto_increment,name varchar,role varchar);
data.sql
insert into guest values(1,'黄晓明','店长'),
(2,'杨紫','前台'),(3,'klxh','dachu');
然后正常创建controller、service、mapper并编写代码,例如查询全部guest
成功执行
缓存简介、Spring缓存、缓存使用
写一个小demo感受一下
1.在入口类添加注解@EnableCaching
2.在service实现类的方法上使用@Cacheable(“缓存名”)
缓存名为guests(缓存通过键值对形式存储),只有当id>1时才会存入缓存
@Cacheable(value = "guests",key = "#id",condition = "#id>1")//unless与condition相反,不满足这个条件才存入
@Override
public Guest getGuestById(int id) {
System.out.println("查询第" + id + "位嘉宾");
return mapper.getGuestById(id);
}
缓存具体应用
前面讲到了查询操作时所用的缓存注解,下面来看看更改和删除操作
GuestMapper
@Update("update guest set name=#{name},role=#{role} where id=#{id}")
int updateGuest(Guest guest);
@Delete("delete from guest where id = #{id}")
int deleteGuest(int id);
@Delete("delete from guest")
int deleteAllGuest();
GuestService
/**
* 使用缓存时 会把方法的返回值放入缓存中存储
* 此时的返回值是特殊的 不是原来的void or int
* @return
*/
Guest updateGuest(Guest guest);
void deleteGuest(int id);
void deleteAllGuest();
注意放到缓存中的意思就是,之后查询,这条更新过的记录就在缓存中了,可以直接从缓存中查
GuestServiceImpl
/**
*@CachePut注解代表添加缓存
* 设置key的值和cacheable保持一致
* 方式一 拿到参数的id —— key = "#guest.id"
* 方式二 拿到结果的id —— key = "#result.id"
* @param guest
* @return
*/
@CachePut(cacheNames = "guests",key = "#guest.id")
@Override
public Guest updateGuest(Guest guest) {
System.out.println("更新第" + guest.getId() + "位嘉宾");
mapper.updateGuest(guest);
return guest;
}
//将对应id的记录从缓存中移除
@CacheEvict(cacheNames = "guests",key = "#id")
@Override
public void deleteGuest(int id) {
System.out.println("删除第" + id + "位嘉宾");
mapper.deleteGuest(id);
}
/**
* @CacheEvict 属性
* allEntries 删除所有实例
* beforeInvocation 在方法调用之前 执行清除缓存逻辑
* 如果没有beforeInvocation,方法若中途出错,缓存则没有清除
*/
@CacheEvict(cacheNames = "guests", allEntries = true, beforeInvocation = true)
@Override
public void deleteAllGuest() {
System.out.println("删除所有嘉宾");
mapper.deleteAllGuest();
}