Spring Cache优化数据库访问的项目实践

 更新时间:2024年01月07日 11:55:51   作者:冷风扇666  
本文主要介绍了Spring Cache优化数据库访问的项目实践,将创建一个简单的图书管理应用作为示例,并演示如何通过缓存减少对数据库的频繁查询,感兴趣的可以了解一下

在这篇博客中,我们将学习如何使用Spring Cache来优化数据库访问,提高系统性能。我们将创建一个简单的图书管理应用作为示例,并演示如何通过缓存减少对数据库的频繁查询。

1. 项目结构

首先,我们看一下项目的基本结构:

lfsun-study-cacheable
|-- src
|   |-- main
|       |-- java
|           |-- com.lfsun.cacheable
|               |-- controller
|                   |-- BookController.java
|               |-- dao
|                   |-- BookRepository.java
|               |-- entity
|                   |-- Book.java
|               |-- service
|                   |-- BookService.java
|                   |-- impl
|                       |-- BookServiceImpl.java
|               |-- LfsunStudyCacheableApplication.java
|       |-- resources
|           |-- application.properties
|-- pom.xml

2. 项目依赖

我们使用了Spring Boot和Spring Data JPA来简化项目配置。以下是主要的Maven依赖:

<!-- Spring Boot Starter -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

<!-- Spring Boot Starter Test -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

<!-- Spring Boot Starter Web -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- Spring Boot Starter Data JPA -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!-- Lombok for easy POJOs -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

<!-- MySQL Connector -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
</dependency>

3. 数据库配置

配置MySQL数据库连接信息和Hibernate方言:

spring.datasource.url=jdbc:mysql://localhost:3306/lfsun_study
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

4. 实体类

定义一个简单的实体类Book,用于表示图书信息:

@Entity
@Data
@Table(name = "cacheable_book")
public class Book implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String author;
}

5. 数据访问层

创建一个JPA Repository接口 BookRepository,用于数据库交互:

public interface BookRepository extends JpaRepository<Book, Long> {
    Book findByTitle(String title);
    void deleteByTitle(String title);
}

6. 服务层

实现一个 BookService 接口,并创建具体的服务实现 BookServiceImpl。在服务实现中,使用Spring Cache注解来优化数据库访问:

@Service
@AllArgsConstructor
public class BookServiceImpl implements BookService {

    private final BookRepository bookRepository;

    @Override
    @Cacheable(value = "books", key = "#title")
    public Book getByTitle(String title) {
        System.out.println("Getting book from database for title: " + title);
        return bookRepository.findByTitle(title);
    }

    @Override
    @CachePut(value = "books", key = "#result.title")
    public Book save(Book book) {
        System.out.println("Saving book to database: " + book.getTitle());
        return bookRepository.save(book);
    }

    @Override
    @Transactional
    @CacheEvict(value = "books", key = "#title")
    public void deleteByTitle(String title) {
        System.out.println("Deleting book from database for title: " + title);
        bookRepository.deleteByTitle(title);
    }
}

7. 控制器层

创建REST控制器 BookController 处理图书的获取、保存和删除操作:

@RestController
@RequestMapping("/books")
@AllArgsConstructor
public class BookController {

    private final BookService bookService;

    @GetMapping("/{title}")
    public Book getBookByTitle(@PathVariable String title) {
        return bookService.getByTitle(title);
    }

    @PostMapping
    public Book saveBook(@RequestBody Book book) {
        return bookService.save(book);
    }

    @PostMapping("/delete/{title}")
    public ResponseEntity<String> deleteBookByTitle(@PathVariable String title) {
        bookService.deleteByTitle(title);
        return new ResponseEntity<>("Book deleted successfully", HttpStatus.OK);
    }
}

8. 主应用程序类

在主应用程序类 LfsunStudyCacheableApplication 上启用Spring缓存:

@SpringBootApplication
@EnableCaching
public class LfsunStudyCacheableApplication {

    public static void main(String[] args) {
        SpringApplication.run(LfsunStudyCacheableApplication.class, args);
    }
}

测试

1. 新增图书

POST http://localhost:8888/books
Content-Type: application/json

{
  "title": "JavaStudy777",
  "author": "冷风扇",
  "isbn": "1234567890"
}

2. 获取图书信息

# GET请求
GET http://localhost:8888/books/JavaStudy777

3. 删除图书

# POST请求
POST http://localhost:8888/books/delete/JavaStudy777

image.png

到此这篇关于Spring Cache优化数据库访问的项目实践的文章就介绍到这了,更多相关Spring Cache数据库访问内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Java JConsole远程连接配置案例详解

    Java JConsole远程连接配置案例详解

    这篇文章主要介绍了Java JConsole远程连接配置案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • zookeeper集群搭建超详细过程

    zookeeper集群搭建超详细过程

    这篇文章主要介绍了zookeeper集群搭建超详细过程,本文对zookeeper集群测试通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • mybatis模糊查询之bind标签和concat函数用法详解

    mybatis模糊查询之bind标签和concat函数用法详解

    大家都知道bind 标签可以使用 OGNL 表达式创建一个变量井将其绑定到上下文中,接下来通过本文给大家介绍了mybatis模糊查询——bind标签和concat函数用法,需要的朋友可以参考下
    2022-08-08
  • 如何使用cmd命令行窗口运行java文件

    如何使用cmd命令行窗口运行java文件

    多年以来一直使用的是IDE来写java项目,导致很多的最基础的东西都渐渐模糊了,最近遇到一个问题就是如果命令行来运行一个java项目,这里总结下,这篇文章主要给大家介绍了关于如何使用cmd命令行窗口运行java文件的相关资料,需要的朋友可以参考下
    2023-10-10
  • 一文详解Java中多进程与多线程处理

    一文详解Java中多进程与多线程处理

    在Java编程中,多进程和多线程是两种常见的并发编程技术,用于提高程序的执行效率和响应速度,本文将为大家简单介绍一下多进程与多线程处理的相关知识,希望对大家有所帮助
    2025-01-01
  • SpringBoot整合LDAP的流程分析

    SpringBoot整合LDAP的流程分析

    这篇文章主要介绍了SpringBoot整合LDAP的流程分析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • SpringBoot中各种Controller的写法

    SpringBoot中各种Controller的写法

    这篇文章主要介绍了SpringBoot中各种Controller的写法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Mybatis-Plus使用ID_WORKER生成主键id重复的解决方法

    Mybatis-Plus使用ID_WORKER生成主键id重复的解决方法

    本文主要介绍了Mybatis-Plus使用ID_WORKER生成主键id重复的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Java实现一行一行读取文本的多种方法详解

    Java实现一行一行读取文本的多种方法详解

    这篇文章主要为大家详细介绍了Java实现一行一行读取文本的多种方法,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下
    2025-10-10
  • 解决RedisTemplate调用increment报错问题

    解决RedisTemplate调用increment报错问题

    这篇文章主要介绍了解决RedisTemplate调用increment报错问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11

最新评论