1.依赖包
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
2.启动main方法添加缓存注解
@EnableCaching
3.实体类实现序列化接口
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User implements Serializable{
private int id;
private String name;
}
4.mapper
@Mapper
public interface UserMapper {
//@Select("SELECT * FROM USER WHERE id = #{id}")
User findByName(@Param("id") int id);
@Insert("INSERT INTO USER(NAME) VALUES(#{name})")
int insert(@Param("name") String name);
@Update("update user set name =#{name} where id=#{id}")
int update(@Param("id") int id,@Param("name") String name);
@Delete("delete from user where id =#{id}")
int delete(@Param("id") int id);
5.service:
@Service
public class UserService {
@Autowired
UserMapper userMapper;
//缓存key为id的数据到缓存boy中
@Cacheable(value = "User",key = "#p0")
public User findByName(int id) {
User user=new User();
user=userMapper.findByName(id);
return user;
}
@CachePut(value = "User",key = "#p0.id")
public User insert3(User user) {
Integer count=userMapper.insert3(user);
System.out.println(user.getId());
return user;
}
//cacheput缓存新增的或者更新的数据到缓存,其中缓存名称为boy
//数据的key是boy 的id
@CachePut(value = "User",key = "#p0")
public User update(int id, String name) {
userMapper.update(id,name);
User user=new User();
user.setId(id);
user.setName(name);
return user;
}
@CacheEvict(value = "User",key = "#p0")
public User delete(int id) {
userMapper.delete(id);
User user=new User();
return user;
}
6.controller:
@RequestMapping("/select/{id}")
@ResponseBody
public void select(@PathVariable(value = "id") int id) {
Object obj=userService.findByName(id);
System.out.println(obj.toString());
}
@RequestMapping("/insert3")
@ResponseBody
public void insert3() {
User user=new User();
user.setName("555");
userService.insert3(user);
//System.out.println(userService.insert3(user));
}
@RequestMapping("/update/{id}/{name}")
@ResponseBody
public void update(@PathVariable(value = "id") int id,@PathVariable(value = "name") String name) {
System.out.println(userService.update(id,name));
}
@RequestMapping("/delete/{id}")
@ResponseBody
public void delete(@PathVariable(value = "id") int id) {
System.out.println(userService.delete(id));
}
配置Configuration:
package com.sa.ch_5_2_3.common;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurer;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.interceptor.CacheErrorHandler;
import org.springframework.cache.interceptor.CacheResolver;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.cache.interceptor.SimpleKeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import net.sf.ehcache.config.CacheConfiguration;
/**
* Created by 123 on 2018-06-14
*/
@Configuration
@EnableCaching
public class CachingConfiguration implements CachingConfigurer {
@Bean(destroyMethod="shutdown")
public net.sf.ehcache.CacheManager ehCacheManager() {
CacheConfiguration cacheConfiguration = new CacheConfiguration();
//name: Cache的名称,必须是唯一的(ehcache会把这个cache放到HashMap里)。
cacheConfiguration.setName("User");
/**
* 缓存的3 种清空策略 :
1、FIFO ,first in first out (先进先出).
2、LFU , Less Frequently Used (最少使用).意思是一直以来最少被使用的。
缓存的元素有一个hit 属性,hit 值最小的将会被清出缓存。
3、LRU ,Least Recently Used(最近最少使用). (ehcache 默认值).
缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,
那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
*/
cacheConfiguration.setMemoryStoreEvictionPolicy("LRU");
cacheConfiguration.setMaxEntriesLocalHeap(1000);
//timeToIdleSeconds: 对象空闲时间,指对象在多长时间没有被访问就会失效。
// 只对eternal为false的有效。默认值0,表示一直可以访问。
cacheConfiguration.setTimeToIdleSeconds(1);
//timeToLiveSeconds: 对象存活时间,指对象从创建到失效所需要的时间。
// 只对eternal为false的有效。默认值0,表示一直可以访问。
cacheConfiguration.setTimeToLiveSeconds(1);
net.sf.ehcache.config.Configuration config = new net.sf.ehcache.config.Configuration();
config.addCache(cacheConfiguration);
return net.sf.ehcache.CacheManager.newInstance(config);
}
@Bean
@Override
public CacheManager cacheManager() {
return new EhCacheCacheManager(ehCacheManager());
}
@Bean
@Override
public KeyGenerator keyGenerator() {
return new SimpleKeyGenerator();
}
@Override
public CacheResolver cacheResolver() {
return null;
}
@Override
public CacheErrorHandler errorHandler() {
return null;
}
}
测试:
http://localhost:8082/insert3
插入成功后返回主键id.
查询:http://localhost:8082/select/33
报错,
{
"msg": "Invalid bound statement (not found): com.sa.ch_5_2_3.mapper1.UserMapper.findByName",
"code": 0,
"obj": "http://localhost:8082/select/33"
}
因为设置的存活周期为一秒,而且sql的查询语句被注释掉了.
如果修改Configuration的配置时间,为600秒:
//timeToIdleSeconds: 对象空闲时间,指对象在多长时间没有被访问就会失效。
// 只对eternal为false的有效。默认值0,表示一直可以访问。
cacheConfiguration.setTimeToIdleSeconds(600);
//timeToLiveSeconds: 对象存活时间,指对象从创建到失效所需要的时间。
// 只对eternal为false的有效。默认值0,表示一直可以访问。
cacheConfiguration.setTimeToLiveSeconds(600);
则执行查询http://localhost:8082/select/33,是可以在缓存中查询到内容。