• springboot缓存(一)


    mapper:

    @Mapper
    public interface StudentMapper {
    
        @Select("select * from student where id=#{id}")
        Student getById(Integer id);
    
        @Update("UPDATE student set age=#{age} ,name=#{name} where id=#{id}")
        void updateStu(Student student);
    
        @Delete("DELETE FROM student where id=#{id}")
        void deleByid(Integer id);
    
    
        @Select("select * from student where name=#{name}")
        Student getByName(String name);
    }
    

    服务层: 

    import com.yao.cache.entity.Student;
    import com.yao.cache.mapper.StudentMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cache.annotation.CacheEvict;
    import org.springframework.cache.annotation.CachePut;
    import org.springframework.cache.annotation.Cacheable;
    import org.springframework.cache.annotation.Caching;
    import org.springframework.stereotype.Service;
    
    @Service
    public class StudentService {
        @Autowired
        private StudentMapper studentMapper;
    
        /**
         * 属性:
         *     cacheNames default {}; 【指定缓存组件的名字】
         *
         *     key default "";  【 缓存数据指定的key:默认是方法的参数
         *       1、可以是方法的返回值. 编写SpEl ; #id参数id的值, #a0 ,#root.args[0] 】
         *
         *      keyGenerator default "";  【key的生成器,可以自己指定key的生成器指定id】  key/keyGenerator ;二选一使用
         *
         *     cacheManager default ""; 指定缓存管理器
         *    condition default "";  给定条件,满足才缓存  【condition="#id>0"】
         *
         *    unless default "";  与condition相反
         *
         *     sync default false;  【是否开启异步模式,默认false】
         *
         *     自动配置类: CacheAutoConfiguration
         * @param id
         * @return
         */
    
        @Cacheable(value = "stu")
        public Student getById(Integer id) {
    
            System.out.println("查询" + id + "学生");
            return studentMapper.getById(id);
        }
    
        /**
         * CachePut: 既调用方法,又更新缓存数据
         * 1、先调用目标方法
         * 2、将目标方法的结果缓存起来
         * <p>
         * 测试步骤:
         * 1、查询1号学生,查到的结果会放到缓存中
         * key:1 value :  name 赵云
         * 2、以后查询还是之前的结果
         * 3、更新1号学生:
         * 将方法的返回值也放入缓存了
         * key: 传入的student对象 值 : 返回的 student对象;
         * 4、查询1号学生?【 如果不加key="#result.id 或者 student.id" 则更新完后再次查询显示的还是更新前的数据,缓存也更新了,但是key不一样,默认的key是student,而更新前的key是student.id】
         * 因此要一致的话,应该是更新后的学生;
         * 【key = "#student.id"使用传入参数的学生id
         * key ="#result.id" 使用返回结果student的id;】
         *
         * @param student
         * @return
         * @Cacheable的key不能用#result
         */
        @CachePut(value = "stu", key = "#result.id")
        public Student updateStu(Student student) {
            System.out.println("updateStudent:" + student);
            studentMapper.updateStu(student);
            return student;
        }
    
        /**
         * CacheEvict: 缓存清除
         * key: 指定要删除的缓存
         * allEntries = true 删除这个缓存中所有的数据
         * 【 boolean allEntries() default false; 默认是false】
         * 【 boolean beforeInvocation() default false; 缓存的清除是否在方法之前执行,默认是false】
         *
         * @param id
         */
        @CacheEvict(value = "stu",beforeInvocation = true/* allEntries = true*/)/*key="#id"*/
        public void delStu(Integer id) {
            System.out.println("delStu" + id);
            //由于数据库数据少,这里不删除数据库数据,模拟一下就好
            // studentMapper.deleByid(id);
             //错误,缓存清除失败,如果加
            //【beforeInvocation() 方法之前执行,这样无论方法是否执行完都清除缓存】
            int i = 10 / 0; //除0异常
        }
    
    
        /**
         * Caching 用于复杂缓存处理
         * 【Cacheable[] cacheable() default {};
         *     CachePut[] put() default {};
         *     CacheEvict[] evict() default {};】
         */
        @Caching(
                cacheable = {
                        @Cacheable(value = "stu",key = "#name")
                },
                put = {
                        @CachePut(value = "stu",key="#result.age"),
                        @CachePut(value = "stu",key = "#result.id")
                }
        )
        public Student getByName(String name){
            Student byName = studentMapper.getByName(name);
            return byName;
        }
    }
    

    controller

    @RestController
    @RequestMapping("/stu")
    public class StudentController {
    
        @Autowired
        private StudentService studentService;
    
        @GetMapping("/get/{id}")
        public Student getById(@PathVariable("id") Integer id) {
            Student byId = studentService.getById(id);
            return byId;
    
        }
        @GetMapping("/get/name/{name}")
        public Student getByName( @PathVariable("name") String name) {
            Student byName = studentService.getByName(name);
            return byName;
    
        }
    
        @RequestMapping("/update")
        public Student UpdateById(Student student) {
            Student stu = studentService.updateStu(student);
            return stu;
    
        }
        @RequestMapping("/del")
        public  String del(Integer id){
            studentService.delStu(id);
            return "success";
        }
    
    
    }
    

     导入的包:

         <!--Mybatis 的依赖包-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.2</version>
            </dependency>
            <!--第三方连接池:druid-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.0</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-cache</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
               <version>8.0.15</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    不经一番彻骨寒,哪有梅花扑鼻香?
  • 相关阅读:
    250 浅拷贝Object.assign(target, ...sources),深拷贝
    249 递归:概念,利用递归求1~n的阶乘,利用递归求斐波那契数列,利用递归遍历数据
    248 闭包:概念,作用,案例,思考题案例,chrome 中调试闭包
    247 高阶函数 之 函数可以作为参数传递
    246 JavaScript严格模式
    245 改变函数内部 this 指向:call,apply,bind,call、apply、bind 三者的异同
    244 函数内部的this指向:6种
    243 函数:函数的3种定义方式,函数的6种调用方式
    242 Object.defineProperty
    241 获取对象的属性名:Object.keys(对象)
  • 原文地址:https://www.cnblogs.com/zongyao/p/13831124.html
Copyright © 2020-2023  润新知