spring-data-jpa

Spring Boot 整合 Spring Data Jpa

Spring Data JPA 是 Spring 框架提供的一个模块,用于简化与关系型数据库的交互和数据访问。它基于JPA(Java Persistence API)标准,并提供了一组易于使用的API和工具,帮助开发人员更轻松地进行数据库操作。通过Spring Data JPA,开发人员可以通过编写简洁的代码来执行常见的 CRUD 操作,同时还支持高级查询、分页、事务管理等功能。它的目标是提供一种更简单、更高效的方式来处理数据库操作,减少开发人员的工作量,并提高应用程序的可维护性和可扩展性。 本文将会指导你如何在 Spring Boot 应用中整合、使用 Spring Data Jpa。 软件版本: Java:17 Spring Boot:3.1.3 MySQL:8.0.27 创建工程 点击 start.springboot.io 快速创建 Spring Boot 整合 Spring Data Jpa 的示例应用。 其中包含了如下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- JPA --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> 项目设置 创建实体类 在 cn.springdoc.demo.entity 包中创建 SysUser 实体类。 package cn.springdoc.demo.entity; import java.time.LocalDateTime; import jakarta.persistence.Column; import jakarta.

为什么 JPA Entity 类需要有默认的无参构造函数?

1、概览 在本教程中,我们将学习在 JPA 中,为什么实体类必须要有默认无参数构造函数? 为了理解无参数构造函数的意义,我们将使用一个简单的 Employee 实体示例。我们将观察缺少默认构造函数是如何导致编译时错误的。我们将深入探讨 JPA 在实体实例化中对 Reflection 的使用。此外,我们还将简要介绍这些类中可能需要该构造函数的其他原因。 2、示例 让我们举一个简单的例子,建立一个名为 Employee 的实体类,其中包含 name、department 和自动生成的 id。让我们定义一个包含所有三个字段的构造函数: @Entity public class Employee { @Id private Long id; private String name; private int age; public Employee(Long id, String name, int age) { this.id = id; this.name = name; this.age = age; } // get 和 set } 不过,此时我们会发现 Employee 类无法编译:Class'Employee' should have [public, protected] no-arg constructor。 显然,在这里我们可以看到,我们定义了一个带有全参构造函数的 Entity 类,但却没有无参数构造函数。在这种情况下,会出现一个编译时错误,提示我们除了现有的构造函数外,还需要一个无参数构造函数。 在接下来的两节中,我们将围绕 Entity 类中的构造函数了解 JPA 规范。我们将了解如何修复错误,以及 JPA 施加这些约束的根本原因。

Spring Data JPA 中 findBy 和 findOneBy 的区别

1、概览 Spring Data Repository 提供了大量可简化数据访问逻辑实现的方法。然而,选择合适的方法并不总是像我们想象的那么容易。 以 findBy 和 findOneBy 为前缀的方法就是一个例子。尽管从名称上看,它们似乎做着同样的事情,但其实还是有一些区别的。 2、Spring Data 中的派生查询方法 Spring Data JPA 的派生查询方法功能经常受到称赞。这些方法提供了一种从方法名称派生特定查询的方法。例如,如果我们想通过 foo 属性检索数据,只需写 findByFoo() 即可。 通常,我们可以使用多个前缀来构建派生查询方法。这些前缀包括 findBy 和 findOneBy。下面,我们就来看看它们的实际应用。 3、实例 首先,我们来看看 Person 实体类: @Entity public class Person { @Id private int id; private String firstName; private String lastName; // 标准的 get 和 set 方法 } 在这里,我们将使用 H2 作为数据库。让我们使用一个基本的 SQL 脚本为数据库添加数据: INSERT INTO person (id, first_name, last_name) VALUES(1, 'Azhrioun', 'Abderrahim'); INSERT INTO person (id, first_name, last_name) VALUES(2, 'Brian', 'Wheeler'); INSERT INTO person (id, first_name, last_name) VALUES(3, 'Stella', 'Anderson'); INSERT INTO person (id, first_name, last_name) VALUES(4, 'Stella', 'Wheeler'); 最后,让我们创建一个 JPA repository 来管理我们的 Person 实体:

Spring Data JPA 中的 Scroll API

1、概览 Spring Data Commons 是总括 Spring Data project 的一部分,其中包含管理持久层的接口和实现。Scroll API 是 Spring Data Commons 提供的功能之一,用于处理从数据库读取的大型结果。 在本教程中,我们将通过一个示例探索 Scroll API。 2、依赖 Spring Boot 3.1 版本新增了 Scroll API 支持。Spring Data Commons 已包含在 Spring Data JPA 中。因此,添加 Spring Data JPA 3.1 版本就可以获得 Scroll API 功能: <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>3.1.0</version> </dependency> 最新的版本可在 Maven 中央仓库 中找到。 3、 Entity 类 例如,我们将使用 BookReview 实体,它包含不同用户对不同书籍的书评评级: @Entity @Table(name="BOOK_REVIEWS") public class BookReview { @Id @GeneratedValue(strategy= GenerationType.SEQUENCE, generator = "book_reviews_reviews_id_seq") @SequenceGenerator(name = "book_reviews_reviews_id_seq", sequenceName = "book_reviews_reviews_id_seq", allocationSize = 1) private Long reviewsId; private String userId; private String isbn; private String bookRating; // getter 和 setter 方法 } 4、Scroll API Scroll API 提供了分块迭代大型结果的功能。它提供稳定的排序、scroll 类型和结果限制。

Spring Data JPA 中的分页和排序

1、概览 当我们数据库中的记录数量较多的时候,一般不会一次性检索出所有记录,通常会通过分页的方式展现。 此外,我们还经常需要在分页时根据某些条件对数据进行排序。 在本教程中,我们将学习如何使用 Spring Data JPA 轻松实现分页和排序。 2、创建实体 首先,假设我们有一个 Product 实体作为 domain 类: @Entity public class Product { @Id private long id; private String name; private double price; // 构造函数, getter 和 setter } 我们的每个 Product 实例都有一个唯一的标识符: id、name 和 price。 3、创建 Repository 要访问我们的 Product,我们需要一个 ProductRepository: public interface ProductRepository extends PagingAndSortingRepository<Product, Integer> { List<Product> findAllByPrice(double price, Pageable pageable); } 通过让它继承 PagingAndSortingRepository,我们可以使用,用于分页和排序的 findAll(Pageable pageable) 和 findAll(Sort sort) 方法。 相反,我们也可以选择继承 JpaRepository,因为它也继承了 PagingAndSortingRepository。