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
- 配置数据源, 连接数据库
- MyBatis的配置文件包括两个大的部分,一是基础配置文件,一个是映射文件
2.spring事务
事务的特性:原子性, 一致性, 隔离性, 持久性
-
事务的隔离级别
- 未提交读-- 引发问题: 脏读, 不可重复读, 幻读
- 读写提交-- 引发问题: 不可重复读, 幻读
- 可重复读-- 引发问题: 幻读
- 串行化-- 最高级别
-
事务的传播行为
传播行为 是方法之间调用事务采取的策略问题;执行一个批量程序, 极少数的交易不能完成而回滚批量任务调用的其他交易,不应该因为极少数的交易不能完成而回滚批量任务调用的其他交易用来修饰 两个事务方法相互调用时, 事务如何处理; 传播机制 针对的是子方法中的传播机制
- REQUIRED: 需要事务, 默认传播行为, 如果当前存在事务, 沿用当前事务, 否则新建一个事务运行子方法
- REQUIRES_NEW:无论当前事务是否存在, 都会创建新的事务运行方法
- NESTED: 在当前方法调用子方法时,如果子方法发生异常,只回滚子方法执行过的SQL,而不回滚当前方法的事务
3.整合Redis
-
配置对应的redis配置文件后;
-
pom文件添加对应依赖, 使Jedis操作
-
引入redisTemplate操作值
1.redis 事务- 简介: 首先Redis是支持一定事务能力的NoSQL,在Redis中使用事务,通常的命令组合是watch... multi...exec,也就是要在一个Redis连接中执行多个命令,这时我们可以考虑使用SessionCallback接口来达到这个目的。其中,watch命令是可以监控Redis的一些键;multi命令是开始事务,开始事务后,该客户端的命令不会马上被执行,而是存放在一个队列里,这点是需要注意的地方,也就是在这时我们执行一些返回数据的命令,Redis也是不会马上执行的,而是把命令放到一个队列里,所以此时调用Redis的命令,结果都是返回null,这是初学者容易犯的错误;exe命令的意义在于执行事务,只是它在队列命令执行前会判断被watch监控的Redis的键的数据是否发生过变化(即使赋予与之前相同的值也会被认为是变化过),如果它认为发生了变化,那么Redis就会取消事务,否则就会执行事务,Redis在执行事务时,要么全部执行,要么全部不执行,而且不会被其他客户端打断,这样就保证了Redis事务下数据的一致性--<深入浅出springboot2.X>
- 总结: 如果被观察的key的值发生了改变, 后面的插入换操作将不会成功
2.spring 缓存注解操作redis
为了进一步简化Redis的使用,Spring还提供了缓存注解,使用这些注解可以有效简化编程过程
-
配置信息 spring 缓存注解操作redis
spring.cache.type=redis spring.cache.cache-names=redisCache
-
代码参考
@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); }