您的位置:首页 > 文旅 > 美景 > Spring Boot 3.3 【四】Spring Boot 整合JPA

Spring Boot 3.3 【四】Spring Boot 整合JPA

2024/12/23 9:25:58 来源:https://blog.csdn.net/wcblog/article/details/141221446  浏览:    关键词:Spring Boot 3.3 【四】Spring Boot 整合JPA

🌟 技术人聊管理 请关注 【技术管理修行】

一、JPA 简介

Spring Data JPA 是 Spring Data 项目的一部分,它为使用 Java Persistence API (JPA) 进行数据库访问提供了一种非常简便的方式。Spring Data JPA 的主要目的是简化基于 JPA 的数据访问层的开发工作,开发者可以更加专注于业务逻辑而不是繁琐的数据访问代码。

二、JPA 的主要作用和特点:

1. 自动化的 CRUD 操作:

  • 当定义了一个继承自 JpaRepository 的接口时,Spring Data JPA 会自动为该接口生成实现类,提供基本的 CRUD 操作(如 save, findById, findAll, deleteById 等)。
  • 这些方法的实现完全由 Spring Data JPA 自动生成,开发者无需编写任何代码。

2. 灵活的查询方法:

  • Spring Data JPA 支持通过方法名来定义查询,这意味着开发者可以通过简单的方法命名规则来定义复杂的查询逻辑,而不需要编写 JPQL 或 Criteria 查询。
  • 例如,方法 findByName(String name) 会自动映射到一个名为 name 的属性,并执行相应的查询。

3. 分页和排序支持:

  • Spring Data JPA 提供了内置的分页和排序支持,可以通过传递 PageableSort 对象来实现。
  • 这使开发者可以很容易地实现分页查询和排序功能。

4. 事务管理:

  • Spring Data JPA 自动处理事务管理,无需显式声明事务边界。
  • 通过注解 @Transactional 或者配置方式,可以很容易地控制事务的行为。

三、示例代码

1. 准备环境

  • Java 17 或更高版本
  • Maven 3.8 或更高版本
  • Spring Boot 3.3
  • MySQL 8.0 或更高版本

2. 添加依赖

<dependencies>  <dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-thymeleaf</artifactId>  <version>3.3.1</version></dependency>  <dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-web</artifactId>  <version>3.3.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId><version>3.3.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope><version>8.0.33</version></dependency>
</dependencies>
  • spring-boot-starter-thymeleaf 用于集成 Thymeleaf 模板引擎;
  • spring-boot-starter-web 提供 Spring MVCTomcat 等web开发所需依赖;
  • spring-boot-starter-data-jpa 用于集成 JPA 进行数据持久化;
  • mysql-connector-javaMySQL 数据库的 JDBC 驱动,用于连接 MySQL 数据库。

3. 配置数据库连接和JPA

编辑 application.yml 文件,添加以下内容:

server:port:8080
spring:datasource:url: jdbc:mysql://localhost:3306/spring_boot_jpa?useSSL=false&serverTimezone=UTCusername: rootpassword: rootjpa:hibernate: ddl-auto: updateshow-sql: true

4. 创建实体类

package com.jsglxx.demo.entity;import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;@Entity
public class Book {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String title;private String author;// 构造函数、getter 和 setter 省略}
  • @Entity:这个注解标记在类上,表示该类是一个JPA实体类,它会映射到数据库中的一个表。JPA会管理这个类的实例,并将它们持久化到数据库中。
  • @Id:这个注解标记在类的属性上,表示该属性是实体的主键。在这个例子中,id 属性被标记为主键,意味着在数据库中对应的表也会有一个名为 id 的列作为主键。
  • @GeneratedValue:这个注解用于指定主键的生成策略。在这个例子中,strategy = GenerationType.IDENTITY 表示主键的值将由数据库自动生成(通常是自增的)。这意味着当你插入一个新的实体到数据库时,数据库会自动为这个实体的 id 属性分配一个唯一的值。

5. 创建 Repository 接口

创建一个 BookRepository 接口继承自 JpaRepository

package com.jsglxx.demo.repository;import org.springframework.data.jpa.repository.JpaRepository;
import com.jsglxx.entity.Book;public interface BookRepository extends JpaRepository<Book, Long>{}

6. 创建 Service 层

创建一个 BookService 类:

package com.jsglxx.demo.service;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import com.jsglxx.entity.Book;
import com.jsglxx.repository.BookRepository;@Service
public class BookService {private final BookRepository bookRepository;@Autowiredpublic BookService(BookRepository bookRepository) {this.bookRepository = bookRepository;}//查询所有图书public List<Book> findAll() {return bookRepository.findAll();}//查询单个图书public Book findById(Long id) {return bookRepository.findById(id).orElse(null);}//保存单个图书public Book save(Book book) {return bookRepository.save(book);}//删除单个图书public void deleteById(Long id) {bookRepository.deleteById(id);}
}

7. 创建 REST 控制器

创建一个 BookController 类:

package com.jsglxx.demo.controller;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import com.jsglxx.entity.Book;
import com.jsglxx.service.BookService;@RestController
@RequestMapping("/api/books")
public class BookController {private final BookService bookService;@Autowiredpublic BookController(BookService bookService) {this.bookService = bookService;}@GetMappingpublic List<Book> getAllBooks() {return bookService.findAll();}@PostMappingpublic Book createBook(@RequestBody Book book) {return bookService.save(book);}@GetMapping("/{id}")public Book getBookById(@PathVariable Long id) {return bookService.findById(id);}@DeleteMapping("/{id}")public void deleteBook(@PathVariable Long id) {bookService.deleteById(id);}
}

四、运行测试

运行主类 DemoApplication.java,启动应用并测试 API。

1. Book实体类对应的表和列自动生成

在这里插入图片描述

2. 打开postman测试接口

1)创建图书:

在这里插入图片描述

2)查询所有图书

在这里插入图片描述

3)查询单个图书

在这里插入图片描述

五、总结

Spring Data JPA 通过提供一套高度抽象的接口和约定,极大地简化了基于 JPA 的数据访问层的开发工作。它不仅减少了样板代码的数量,还提高了开发效率,使得开发者可以更加专注于业务逻辑的实现。通过上述示例,我们可以看到如何使用 Spring Data JPA 来快速构建数据访问层,并与 Spring Boot 应用程序进行集成。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com