微服务项目学习的第二天,做了数据的查询与缓存(redis和springcache)。
1、数据库操作的三种方式
- 使用jpa自带的方法在服务层直接调用;
- 在dao(数据库操作)层自定义方法,然后在服务层调用;(由Jpa自己生成sql语句,注意一些命名规则);
- 在dao(数据库操作)层自定义方法,并自己写原生Sql语句。
2、SQL语句的效率(多表联查)
2.1查询语句解释:
SELECT * FROM tb_problem,tb_pl WHERE id = problemid AND labelid = "2"(效率高)
SELECT * FROM tb_problem WHERE id IN (SELECT problemid FROM tb_pl WHERE labelid = "1")(使用IN之后效率不高)
SELECT * FROM tb_problem,tb_pl WHERE id = problemid AND labelid = "1" ORDER BY reply DESC;
SELECT * FROM tb_problem,tb_pl WHERE id = problemid AND labelid = "1" AND reply=0 ORDER BY createtime DESC;
- SQL优化的时候使用了IN 或者NOTIN效率都不会高
- DESC表示对所选列的降序排列,根据业务分析来决定要不要使用
- 联合写法格式:select… ,条件 and 条件 and … ORDER BY 字段 排序
(依据某个字段的升序降序(即就是前多少,最多少等等)和xxx添加来查询)应用于多表联查(业务之间有关联关系)
2.2 模糊查询关键字
like
2.3 应用实例:
//在使用增删改的时候要给Query注解前添加@Modifing;
//lable x 的最新回答列表,并使用分页查询(查询的时候根据replytime(回复时间)降序返回)
@Query(value = "SELECT * FROM tb_problem,tb_pl WHERE id = problemid AND labelid = ? ORDER BY replytime DESC;" ,nativeQuery = true)
Page<Problem> newList(String labelid, Pageable pageable);
//lable x 的热门回答列表,并使用分页查询(查询的时候根据reply(回复数量)降序返回)
@Query(value = "SELECT * FROM tb_problem,tb_pl WHERE id = problemid AND labelid = ? ORDER BY reply DESC;" ,nativeQuery = true)
Page<Problem> hotList(String labelid, Pageable pageable);
//lable x 的等待回答列表,并使用分页查询(等待回答即就是reply(回复数量)= 0 )
@Query(value = "SELECT * FROM tb_problem,tb_pl WHERE id = problemid AND labelid = ? AND reply=0 ORDER BY createtime DESC;" ,nativeQuery = true)
Page<Problem> waitList(String labelid, Pageable pageable);
3.分页查询要注意的问题
Pageable 和 Page这两个对象的包是源于springframework中的,更不是源于javax中的。
哈游一些分页的资料可以参考这个文档:http://wiki.bsdn.org/pages/viewpage.action?pageId=10912111
顺便推一下这个资料库(一些工具的介绍):http://wiki.bsdn.org/pages/viewpage.action?pageId=18939947
4.两种缓存redis和springcache
4.1 redis
- 添加依赖----配置文件添加端口号
- 注入RedisTemplate对象
- 使用redis缓存:redisTemplate.opsForValue().get(“article_”+id);
// 如果缓存没有则到数据库查询并放入缓存 if(article==null) { article = articleDao.findById(id).get(); redisTemplate.opsForValue().set("article_" + id, article); } return article
- opsForSet () 中的set不是设置的意思,是集合的意思,向已有的key中添加集合元素
- 使用redis设置过期时间
- 测试://设置过期时间(可用于短信验证,不适用于这个场景,只是在这里写一下)
- 设置过期时间单位:
4.2 springcache(springcache和redis没关系,不用加redis依赖包)
- 一共记住三个注解就可以(@EnableCaching、@Cacheable、@CacheEvict)
- 在GatheringService的findById方法添加缓存注解,这样当此方法第一次运行,在缓存中没有找到对应的value和key,则将查询结果放入缓存。
- 为GatheringApplication添加@EnableCaching开启缓存支持。
- 在GatheringService的findById方法添加缓存注解,这样当此方法第一次运行,在缓存中没有找到对应的value和key,则将查询结果放入缓存。
- 当我们对数据进行删改的时候,需要更新缓存。其实更新缓存也就是清除缓存,因为清除缓存后,用户再次调用查询方法无法提取缓存会重新查找数据库中的记录并放入缓存。
- 在GatheringService的update、deleteById方法上添加清除缓存的注解。
- redis(除了opsForValue)中的其他方法的介绍:
这一篇中主要写了redis的具体使用,要了解redis的详细内容,可以参考:https://www.cnblogs.com/linkworld/p/7808818.html