学科分类
目录
Spring Boot开发

基础环境搭建

使用缓存的主要目的是减小数据库数据的访问压力、提高用户体验,为此,这里结合数据库的访问操作对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语句。随着时间的积累,系统的用户不断增加,数据规模越来越大,数据库的操作会直接影响用户的使用体验,此时使用缓存往往是解决这一问题非常好的一种手段。

点击此处
隐藏目录