SpringBoot缓存管理

2、编写数据库表对应的实体类,并使用JPA相关注解配置映射关系

package com.hardy.springbootdatacache.entity;

import org.springframework.data.annotation.Id;

import javax.persistence.*;

/**

  • @Author: HardyYao

  • @Date: 2021/6/19

*/

@Entity(name = “t_comment”) // 设置ORM实体类,并指定映射的表名

public class Comment {

@Id // 映射对应的主键id

@GeneratedValue(strategy = GenerationType.IDENTITY) // 设置主键自增策略

private Integer id;

private String content;

private String author;

@Column(name = “a_id”) // 指定映射的表字段名

private Integer aId;

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getContent() {

return content;

}

public void setContent(String content) {

this.content = content;

}

public String getAuthor() {

return author;

}

public void setAuthor(String author) {

this.author = author;

}

public Integer getaId() {

return aId;

}

public void setaId(Integer aId) {

this.aId = aId;

}

@Override

public String toString() {

return “Comment{” +

“id=” + id +

“, content='” + content + ‘’’ +

“, author='” + author + ‘’’ +

“, aId=” + aId +

‘}’;

}

}

3、编写数据库操作的Repository接口文件

package com.hardy.springbootdatacache.repository;

import com.hardy.springbootdatacache.entity.Comment;

import org.springframework.data.jpa.repository.JpaRepository;

import org.springframework.data.jpa.repository.Modifying;

import org.springframework.data.jpa.repository.Query;

import org.springframework.transaction.annotation.Transactional;

/**

  • @Author: HardyYao

  • @Date: 2021/6/19

*/

public interface CommentRepository extends JpaRepository<Comment, Integer> {

/**

  • 根据评论id修改评论作者author

  • @param author

  • @param id

  • @return

*/

@Transactional

@Modifying

@Query(“update t_comment c set c.author = ?1 where c.id=?2”)

int updateComment(String author,Integer id);

}

4、编写service层

package com.hardy.springbootdatacache.service;

import com.hardy.springbootdatacache.entity.Comment;

import com.hardy.springbootdatacache.repository.CommentRepository;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.cache.annotation.Cacheable;

import org.springframework.stereotype.Service;

import java.util.Optional;

/**

  • @Author: HardyYao

  • @Date: 2021/6/19

*/

@Service

public class CommentService {

@Autowired

private CommentRepository commentRepository;

/**

  • 根据评论id查询评论

  • @Cacheable:将该方法的查询结果comment存放在SpringBoot默认缓存中

  • cacheNames:起一个缓存命名空间,对应缓存唯一标识

  • @param id

  • @return

*/

@Cacheable(cacheNames = “comment”)

public Comment findCommentById(Integer id){

Optional comment = commentRepository.findById(id);

if(comment.isPresent()){

Comment comment1 = comment.get();

return comment1;

}

return null;

}

}

5、编写controller层

package com.hardy.springbootdatacache.controller;

import com.hardy.springbootdatacache.entity.Comment;

import com.hardy.springbootdatacache.service.CommentService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

/**

  • @Author: HardyYao

  • @Date: 2021/6/19

*/

@RestController

public class CommentController {

@Autowired

private CommentService commentService;

@RequestMapping(value = “/findCommentById”)

public Comment findCommentById(Integer id){

Comment comment = commentService.findCommentById(id);

return comment;

}

}

6、编写配置文件

在全局配置文件application.properties中编写对应的数据库连接配置

MySQL数据库连接配置

spring.datasource.url=jdbc:mysql://localhost:3306/springbootdata?serverTimezone=UTC

spring.datasource.username=root

spring.datasource.password=root

显示使用JPA进行数据库查询的SQL语句

spring.jpa.show-sql=true

开启驼峰命名匹配映射

mybatis.configuration.map-underscore-to-camel-case=true

解决中文乱码问题

spring.http.encoding.force-response=true

7、测试

在浏览器中输入:http://localhost:8080/findCommentById?id=1 进行访问(连续访问三次):

SpringBoot缓存管理(一) 默认缓存管理

SpringBoot缓存管理(一) 默认缓存管理

在上图中,因为没有在SpringBoot项目中开启缓存管理,故虽然数据表中的数据没有任何变化,但是每执行一次查询操作,即便执行的是相同的SQL语句,都还是会访问一次数据库。

2、默认缓存使用

========

在前面搭建的Web应用的基础上,开启SpringBoot默认支持的缓存,以使用SpringBoot默认缓存。

1、在项目启动类的类名上方使用@EnableCaching注解开启基于注解的缓存支持

==========================================

package com.hardy.springbootdatacache;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cache.annotation.EnableCaching;

@EnableCaching // 开启SpringBoot基于注解的缓存管理支持

@SpringBootApplication

public class SpringbootdataCacheApplication {

public static void main(String[] args) {

SpringApplication.run(SpringbootdataCacheApplication.class, args);

}

}

2、使用@Cacheable注解对数据操作方法进行缓存管理

=============================

将@Cacheable注解标注在Service类的查询方法上,对查询结果进行缓存:

package com.hardy.springbootdatacache.service;

import com.hardy.springbootdatacache.entity.Comment;

import com.hardy.springbootdatacache.repository.CommentRepository;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.cache.annotation.Cacheable;

import org.springframework.stereotype.Service;

import java.util.Optional;

/**

  • @Author: HardyYao

  • @Date: 2021/6/19

*/

@Service

public class CommentService {

@Autowired

private CommentRepository commentRepository;

/**

  • 根据评论id查询评论

  • @param id

  • @return

*/

@Cacheable(cacheNames = “comment”)

public Comment findCommentById(Integer id){

Optional comment = commentRepository.findById(id);

if(comment.isPresent()){

Comment comment1 = comment.get();

return comment1;

}

return null;

}

}

3、测试访问

======

在浏览器中输入:http://localhost:8080/findCommentById?id=1 进行访问(连续访问三次):

SpringBoot缓存管理(一) 默认缓存管理

SpringBoot缓存管理(一) 默认缓存管理

可以看到,在使用SpringBoot默认缓存注解后,重复进行同样的查询操作,数据库只执行了一次SQL查询语句,说明项目开启的默认缓存支持已生效。

SpringBoot默认缓存底层结构:在诸多的缓存自动配置类中,SpringBoot默认装配的是SimpleCacheConfiguration,它使用的CacheManager是ConcurrentMapCacheManager,使用ConcurrentMap作为底层的数据结构,根据Cache的名字查询出Cache,每一个Cache中存在多个key-value键值对、缓存值。

4、缓存注解介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值