Spring Boot设置并使用缓存

版权声明:原创文章,未经允许,禁止转载! https://blog.csdn.net/weixin_36512652/article/details/81711911
几个缓存注解的作用:
  • @Cacheable:将方法的返回结果根据key指定的键保存在缓存中,以后要获取相同的数据直接从缓存中共获取
    • cacheNames/value:指定Cache组件名称
    • key:指定缓存时使用的key,默认使用方法参数值,可以使用#a0、#p0、#参数名等,支持SpEL表达式,root可省略
    • keyGenerator:指定key的生成器的组件id,如自定义的KeyGenerator
    • cacheManager:指定缓存管理器
    • cacheResolver:指定缓存解析器
    • condition:指定在哪种条件下缓存,如condition = “#id>=1”在参数>=1时缓存
    • unless:指定该条件为真时不缓存
    • sync:指定是否使用异步模式
  • @CachePut:不管缓存中是否有需要的数据,都会执行该注解标注的方法,并将结果更新到缓存,属性见上
  • @CacheEvit:执行方法后,清除key指定的缓存
    • allEntries:默认为false,值为true,删除所有缓存
    • beforeInvocation:默认为false,值为true,在方法调用之前清除缓存
  • @CacheConfig:定义一些通用或公共的规则,如cacheNames、keyGenerator等
可使用的SpEL表达式:
名称 示例 作用
caches 当前被调用方法使用的缓存组件的列表 #root.caches[n].name
target 当前被调用的目标对象 #root.target
targetClass 当前被调用的目标对象类 #root.targetClass
method 当前被调用的方法 #root.method
methodName 当前被调用的方法名 #root.methodName
args 当前被调用方法的参数列表 #root.args[0]
argname 参数名 #参数名、#p0、#p1、#a0、#a1
result 方法返回结果 #result
使用缓存的步骤:

(1)创建一个Spring Boot应用,勾选Cache、Web、MySQL、Mybatis模块,在主程序类上添加注解,开启基于注解的缓存

@MapperScan(basePackages = "com.youngpain.cache.mapper")
@SpringBootApplication
@EnableCaching

(2)创建JavaBean,和数据库中的表对应,并配置数据源

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybatis_database
    username: root
    password: 1741248769
    driver-class-name: com.mysql.jdbc.Driver
  redis:
    host: 39.108.114.57
#开启驼峰命名法
mybatis:
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    com.youngpain.cache.mapper: debug

(3)创建mapper接口进行增删改查操作

/**
 * 部门表的增删改查操作
 */
public interface DepartmentMapper {

    @Insert("insert into department(id,depart_name,depart_build) values(#{id},#{depart_name},#{depart_build})")
    void insertDepartment(Department department);

    @Delete("delete from department where id=#{id}")
    void deleteDepartment(Integer id);

    @Update("update department set depart_name=#{departName},depart_build=#{departBuild} where id=#{id}")
    void updateDepartment(Department department);

    @Select("select * from department where id=#{id}")
    Department getDepartmentById(Integer id);
}

(4)创建service

@Service
@CacheConfig(cacheNames = {"departs"})
public class DepartmentService {

    @Autowired
    DepartmentMapper departmentMapper;

    @Cacheable(key = "#a0.id")
    public void insertDepartment(Department department) {
        departmentMapper.insertDepartment(department);
    }

    @CacheEvict(key = "#p0")
    public void deleteDepartment(Integer id) {
        departmentMapper.deleteDepartment(id);
    }

    @CachePut(key = "#a0.id")
    public Department updateDepartment(Department department) {
        departmentMapper.updateDepartment(department);
        return department;
    }

    @Cacheable(key = "#id", condition = "#p0>=1")
    public Department getDepartmentById(Integer id) {
        return departmentMapper.getDepartmentById(id);
    }
}

(5)创建controller

@Controller
public class DepartmentController {

    @Autowired
    DepartmentService departmentService;

    @GetMapping("/index")
    public String index() {
        return "index";
    }

    @GetMapping("/deleteDepart/{id}")
    public String deleteDepart(@PathVariable("id") Integer id, Model model) {
        model.addAttribute("condition", "delete");
        Department delete = departmentService.getDepartmentById(id);
        model.addAttribute("department", delete);
        departmentService.deleteDepartment(id);
        return "success";
    }

    @PostMapping("/updateDepart")
    public String updateDepart(Department department, Model model) {
        model.addAttribute("condition", "update");
        Department update = departmentService.updateDepartment(department);
        model.addAttribute("department", update);
        return "success";
    }

    @GetMapping("/getDepart/{id}")
    public String getDepartmentById(@PathVariable("id") Integer id, Model model) {
        model.addAttribute("condition", "delete");
        Department get = departmentService.getDepartmentById(id);
        model.addAttribute("department", get);
        return "success";
    }
}

(6)测试结果:

  • @Cacheable:第一次查询数据,控制台发出sql语句,之后再查询直接从缓存中获取
  • @CachePut:调用方法修改某个数据后,再次查询该数据是从缓存中获取的更新后的数据
  • @CacheEvict:调用该方法后,再次查询某个数据需要重新发出sql语句查询

ps:之前只是用markdown记笔记,今天第一次用markdown写博客,写起来好舒服啊QAQ

猜你喜欢

转载自blog.csdn.net/weixin_36512652/article/details/81711911