SpringBoot2.x<<深入浅出>>

书籍推荐

书名:深入浅出Spring Boot 2.x
作者:杨开振
出版社:人民邮电出版社
demo: https://gitee.com/threenut/spring-boot
讲的很细致, 把一些很基础的SSM相关都细细的讲解了; 入门springboot必读;

读后感

springboot特点

  • 1.创建独立的 Spring 应用程序

  • 2.直接嵌入 Tomcat、Jetty 或 Undertow(无需部署 WAR 文件)

  • 3.提供自以为是的“入门”依赖项以简化您的构建配置

  • 4.尽可能自动配置 Spring 和 3rd 方库

  • 5.提供生产就绪功能,例如指标、健康检查和外部化配置

  • 6.完全无需代码生成,无需 XML 配置(自动装配)

1.整合mybatis

  1. 配置数据源, 连接数据库
  2. MyBatis的配置文件包括两个大的部分,一是基础配置文件,一个是映射文件

2.spring事务

事务的特性:原子性, 一致性, 隔离性, 持久性

  1. 事务的隔离级别

    • 未提交读-- 引发问题: 脏读, 不可重复读, 幻读
    • 读写提交-- 引发问题: 不可重复读, 幻读
    • 可重复读-- 引发问题: 幻读
    • 串行化-- 最高级别
  2. 事务的传播行为
    传播行为 是方法之间调用事务采取的策略问题;执行一个批量程序, 极少数的交易不能完成而回滚批量任务调用的其他交易,不应该因为极少数的交易不能完成而回滚批量任务调用的其他交易

    用来修饰 两个事务方法相互调用时, 事务如何处理; 传播机制 针对的是子方法中的传播机制

  • REQUIRED: 需要事务, 默认传播行为, 如果当前存在事务, 沿用当前事务, 否则新建一个事务运行子方法
  • REQUIRES_NEW:无论当前事务是否存在, 都会创建新的事务运行方法
  • NESTED: 在当前方法调用子方法时,如果子方法发生异常,只回滚子方法执行过的SQL,而不回滚当前方法的事务

3.整合Redis

  • 配置对应的redis配置文件后;

  • pom文件添加对应依赖, 使Jedis操作

  • 引入redisTemplate操作值
    1.redis 事务

    1. 简介: 首先Redis是支持一定事务能力的NoSQL,在Redis中使用事务,通常的命令组合是watch... multi...exec,也就是要在一个Redis连接中执行多个命令,这时我们可以考虑使用SessionCallback接口来达到这个目的。其中,watch命令是可以监控Redis的一些键;multi命令是开始事务,开始事务后,该客户端的命令不会马上被执行,而是存放在一个队列里,这点是需要注意的地方,也就是在这时我们执行一些返回数据的命令,Redis也是不会马上执行的,而是把命令放到一个队列里,所以此时调用Redis的命令,结果都是返回null,这是初学者容易犯的错误;exe命令的意义在于执行事务,只是它在队列命令执行前会判断被watch监控的Redis的键的数据是否发生过变化(即使赋予与之前相同的值也会被认为是变化过),如果它认为发生了变化,那么Redis就会取消事务,否则就会执行事务,Redis在执行事务时,要么全部执行,要么全部不执行,而且不会被其他客户端打断,这样就保证了Redis事务下数据的一致性--<深入浅出springboot2.X>
    2. 总结: 如果被观察的key的值发生了改变, 后面的插入换操作将不会成功

    2.spring 缓存注解操作redis
    为了进一步简化Redis的使用,Spring还提供了缓存注解,使用这些注解可以有效简化编程过程

  1. 配置信息 spring 缓存注解操作redis

     spring.cache.type=redis
     spring.cache.cache-names=redisCache
    
  2. 代码参考

      @Override
      @Transactional
       // 表示先从缓存中通过定义的键查询,如果可以查询到数据,则返回,否则执行该方法,返回数据,并且将返回结果保存到缓存中。
       @Cacheable(value = "redisCache", key = "'redis_entity_'+#id") //取参数id 缓存用户
       public RedisEntity getRedis(Integer id) {
       return redisTestDao.getRedis(id);
       }
       @Override
       @Transactional
       // 使用#result就代表返回的结果对象了
        @CachePut(value = "redisCache", key = "'redis_entity_'+#result.id")
       public RedisEntity saveRedis(RedisEntity redisEntity) {
            // 插入数据时 mybatis 回填实体的id信息
           redisTestDao.saveRedis(redisEntity);
     	   System.out.println(redisEntity + "   ---插入数据时 mybatis 回填实体		的id信息");
           return redisEntity;
       }
    
       @Override
        @Transactional
        //表示将方法结果返回存放到缓存中。
      @CachePut(value = "redisCache", condition = "#result != 'null'", key = 		"'redis_entity_'+#redisEntity.id")
        public RedisEntity updateRedis(RedisEntity redisEntity) {
            redisTestDao.updateRedis(redisEntity);
             return redisEntity;
         }
    
        @Override
       public List<RedisEntity> findRedis(String redisParam) {
            return redisTestDao.findRedis(redisParam);
       }
     
        @Override
        // 通过定义的键移除缓存,它有一个Boolean类型的配置项beforeInvocation,表示		在方法之前或者之后移除缓存。因为其默认值为false,所以默认为方法之后将缓存移除。
        @CacheEvict(value = "redisCache", key = "'redis_entity_'+#id", 				beforeInvocation = false)
       public int deleteRedis(int id) {
            return redisTestDao.deleteRedis(id);
       }
    
posted @ 2022-07-06 22:17  三只坚果  阅读(216)  评论(0编辑  收藏  举报