基础环境搭建
使用缓存的主要目的是减小数据库数据的访问压力、提高用户体验,为此,这里结合数据库的访问操作对Spring Boot的缓存管理进行演示说明。下面,我们先搭建Spring Boot缓存管理需要的基础环境。
1.准备数据
为了简便,这里使用第3章创建的springbootdata的数据库,该数据库有两个表t_article和t_comment,这两个表预先插入几条测试数据。
2.创建项目
(1)创建Spring Boot项目,引入相关依赖。使用Spring Initializr方式创建一个名为chapter06的Spring Boot项目,在Dependencies依赖选择项中添加SQL模块中的JPA依赖、MySQL依赖和Web模块中的Web依赖,效果如图1所示。
图1 Spring Boot整合JPA项目依赖选择
(2)编写数据库表对应的实体类。在chapter06中创建名为com.itheima.domain的包,在该包下针对数据库表t_comment编写对应的实体类Comment,并使用JPA相关注解配置映射关系,内容如文件1所示。
文件1 Comment.java
1 import javax.persistence.*;
2 @Entity(name = "t_comment") // 设置ORM实体类,并指定映射的表名
3 public class Comment {
4 @Id // 表明映射对应的主键id
5 @GeneratedValue(strategy = GenerationType.IDENTITY) // 设置主键自增策略
6 private Integer id;
7 private String content;
8 private String author;
9 @Column(name = "a_id") //指定映射的表字段名
10 private Integer aId;
11 // 省略属性getXX()和setXX()方法
12 // 省略toString()方法
13 }
(3)编写数据库操作的Repository接口文件。在chapter06中创建名为com.itheima.repository的包,并在该包下创建一个用于Comment实体类操作的Repository接口,内容如文件2所示。
文件2 CommentRepository.java
1 import com.itheima.domain.Comment;
2 import org.springframework.data.jpa.repository.*;
3 import org.springframework.transaction.annotation.Transactional;
4 public interface CommentRepository extends JpaRepository<Comment,Integer>{
5 // 根据评论id修改评论作者评论作者author
6 @Transactional
7 @Modifying
8 @Query("UPDATE t_comment c SET c.author= ?1 WHERE c.id = ?2")
9 public int updateComment(String author,Integer id);
10 }
文件2中,自定义了一个继承JpaRepository接口的CommentRepository接口文件,添加了一个评论修改方法updateComment(),操作Comment的一些通用方法可以从JpaRepository接口中继承。
(4)编写业务操作类Service文件。在chapter06中创建名为com.itheima.service的包,并在该包下创建一个用于Comment相关业务操作的Service实体类,内容如文件3所示。
文件3 CommentService.java
1 import com.itheima.domain.Comment;
2 import com.itheima.repository.CommentRepository;
3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.stereotype.Service;
5 import java.util.Optional;
6 @Service
7 public class CommentService {
8 @Autowired
9 private CommentRepository commentRepository;
10 public Comment findById(int comment_id){
11 Optional<Comment> optional = commentRepository.findById(comment_id);
12 if(optional.isPresent()){
13 return optional.get();
14 }
15 return null;
16 }
17 public Comment updateComment(Comment comment){
18 commentRepository.updateComment(comment.getAuthor(), comment.getaId());
19 return comment;
20 }
21 public void deleteComment(int comment_id){
22 commentRepository.deleteById(comment_id);
23 }
24 }
文件3中,自定义了一个CommentService业务操作类,使用注入的CommentRepository实例对象编写对Comment评论数据的查询、修改和删除操作。
(5)编写Web访问层Controller文件。在chapter06中创建名为com.itheima.controller的包,并在该包下创建一个用于Comment访问控制的Controller实体类,内容如文件4所示。
文件4 CommentController.java
1 import com.itheima.domain.Comment;
1 import com.itheima.service.CommentService;
2 import org.springframework.beans.factory.annotation.Autowired;
3 import org.springframework.web.bind.annotation.*;
4 @RestController
5 public class CommentController {
6 @Autowired
7 private CommentService commentService;
8 @GetMapping("/get/{id}")
9 public Comment findById(@PathVariable("id") int comment_id){
10 Comment comment = commentService.findById(comment_id);
11 return comment;
12 }
13 @GetMapping("/update/{id}/{author}")
14 public Comment updateComment(@PathVariable("id") int comment_id,
15 @PathVariable("author") String author){
16 Comment comment = commentService.findById(comment_id);
17 comment.setAuthor(author);
18 Comment updateComment = commentService.updateComment(comment);
19 return updateComment;
20 }
21 @GetMapping("/delete/{id}")
22 public void deleteComment(@PathVariable("id") int comment_id){
23 commentService.deleteComment(comment_id);
24 }
25 }
文件4中,自定义了一个CommentController评论管理控制类,使用注入的CommentService实例对象编写对Comment评论数据的查询、修改和删除方法。
3.编写配置文件
在项目全局配置文件application.properties中编写对应的数据库连接配置,内容如文件5所示。
文件5 application.properties
1 # MySQL数据库连接配置
2 spring.datasource.url=jdbc:mysql://localhost:3306/springbootdata?serverTimezone=UTC
3 spring.datasource.username=root
4 spring.datasource.password=root
5 #显示使用JPA进行数据库查询的SQL语句
6 spring.jpa.show-sql=true
文件5中,先对MySQL的连接进行了配置,然后配置了“spring.jpa.show-sql=true”用于展示操作的SQL语句,方便后续缓存使用效果演示。
4.项目测试
启动chapter06项目,项目启动成功后,在浏览器上访问“http://localhost:8080/get/1
”查询id为1的用户评论信息。不论浏览器刷新多少次,访问同一个用户评论信息,页面的查询结果都会显示同一条数据,但是,浏览器每刷新一次,控制台会新输出一条SQL语句,具体如图2和图3所示。
图2 findById()方法查询结果
图3 执行findById()方法控制台显示的SQL语句
之所以出现图2和图3的情况,这是因为没有在Spring Boot项目中开启缓存管理。在没有缓存管理的情况下,虽然数据表中的数据没有发生变化,但是每执行一次查询操作(本质是执行同样的SQL语句),都会访问一次数据库并执行一次SQL语句。随着时间的积累,系统的用户不断增加,数据规模越来越大,数据库的操作会直接影响用户的使用体验,此时使用缓存往往是解决这一问题非常好的一种手段。