🌟 技术人聊管理 请关注 【技术管理修行】
一、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 提供了内置的分页和排序支持,可以通过传递 Pageable 或 Sort 对象来实现。
- 这使开发者可以很容易地实现分页查询和排序功能。
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 MVC 和 Tomcat 等web开发所需依赖;
- spring-boot-starter-data-jpa 用于集成 JPA 进行数据持久化;
- mysql-connector-java是 MySQL 数据库的 JDBC 驱动,用于连接 MySQL 数据库。
3. 配置数据库连接和JPA
编辑 application.yml 文件,添加以下内容:
server:
port:8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/spring_boot_jpa?useSSL=false&serverTimezone=UTC
username: root
password: root
jpa:
hibernate:
ddl-auto: update
show-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;
@Autowired
public 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;
@Autowired
public BookController(BookService bookService) {
this.bookService = bookService;
}
@GetMapping
public List<Book> getAllBooks() {
return bookService.findAll();
}
@PostMapping
public 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 应用程序进行集成。