• SpringData jpa 详解


    目录

    一、Spring Data JPA 的主要特点和用法

    二、如何使用 Spring Data JPA

    三、SpringData jpa 分页和排序

    1、分页操作

    2、排序操作

    四、SpringData Jpa Querydsl


    Spring Data JPA 是 Spring 框架的一部分,它简化了对数据访问层的操作,特别是与关系型数据库的交互。它构建在 Java 持久化 API(JPA)之上,提供了更高层次的抽象,使开发人员能够更轻松地执行 CRUD(创建、读取、更新、删除)操作和复杂的查询。

    一、Spring Data JPA 的主要特点和用法

    1. Repository 接口: Spring Data JPA 引入了 Repository 接口,它是一个泛型接口,你可以为每个实体创建一个具体的仓库接口,该接口继承自 Repository。这些仓库接口可以用于执行各种数据库操作,包括基本的 CRUD 操作。

    2. 自动查询方法: Spring Data JPA 基于方法名约定,可以自动生成查询方法。例如,通过命名约定,你可以定义一个方法 findByLastName(String lastName),Spring Data JPA 将自动生成查询数据库中姓为指定值的记录的方法。

    3. 声明性事务管理: Spring Data JPA 与 Spring 框架的整合非常紧密,它支持声明性事务管理。你可以使用 @Transactional 注解来管理数据访问层的事务。

    4. 支持分页和排序: Spring Data JPA 提供了分页和排序的功能,可以轻松地执行分页查询和按特定字段排序查询。

    5. 复杂查询: 除了自动生成查询方法之外,Spring Data JPA 还允许你使用 @Query 注解和 JPQL(Java Persistence Query Language)来编写自定义查询。这使你能够执行复杂的数据库查询操作。

    6. 支持多种数据源: Spring Data JPA 不仅支持关系型数据库,还支持 NoSQL 数据库,如 MongoDB。

    二、如何使用 Spring Data JPA

    创建了一个 UserRepository 接口,它继承自 JpaRepository。这个接口提供了各种查询方法,包括 findByUsername,它会根据用户名从数据库中查找用户。

    1. import org.springframework.data.jpa.repository.JpaRepository;
    2. public interface UserRepository extends JpaRepository {
    3. User findByUsername(String username);
    4. }

    通过注入 UserRepository 的实例来执行数据库操作

    1. @Service
    2. public class UserService {
    3. @Autowired
    4. private UserRepository userRepository;
    5. public User findUserByUsername(String username) {
    6. return userRepository.findByUsername(username);
    7. }
    8. public void saveUser(User user) {
    9. userRepository.save(user);
    10. }
    11. }

    三、SpringData jpa 分页和排序

    Spring Data JPA 支持分页和排序操作,这使得在处理大量数据时更加方便

    1、分页操作
    • 使用 Spring Data JPA 提供的方法: Spring Data JPA 提供了一些内置的分页方法,例如 findAll(Pageable pageable)。你可以创建一个 Pageable 对象,指定要获取的页数和每页的大小,然后将其传递给分页方法。
    1. import org.springframework.data.domain.Page;
    2. import org.springframework.data.domain.PageRequest;
    3. import org.springframework.data.domain.Pageable;
    4. import org.springframework.data.jpa.repository.JpaRepository;
    5. public interface UserRepository extends JpaRepository {
    6. Page findAll(Pageable pageable);
    7. }
    1. import org.springframework.beans.factory.annotation.Autowired;
    2. import org.springframework.data.domain.Page;
    3. import org.springframework.data.domain.PageRequest;
    4. import org.springframework.stereotype.Service;
    5. @Service
    6. public class UserService {
    7. @Autowired
    8. private UserRepository userRepository;
    9. public Page getUsers(int page, int size) {
    10. Pageable pageable = PageRequest.of(page, size);
    11. return userRepository.findAll(pageable);
    12. }
    13. }
    • 自定义查询方法: 你也可以使用自定义的查询方法来实现分页。在查询方法的名称中,使用 Pageable 参数,并在查询方法中传递这个参数。
    1. import org.springframework.data.domain.Page;
    2. import org.springframework.data.domain.Pageable;
    3. import org.springframework.data.jpa.repository.JpaRepository;
    4. public interface UserRepository extends JpaRepository {
    5. Page findByLastName(String lastName, Pageable pageable);
    6. }
    1. import org.springframework.beans.factory.annotation.Autowired;
    2. import org.springframework.data.domain.Page;
    3. import org.springframework.data.domain.PageRequest;
    4. import org.springframework.stereotype.Service;
    5. @Service
    6. public class UserService {
    7. @Autowired
    8. private UserRepository userRepository;
    9. public Page getUsersByLastName(String lastName, int page, int size) {
    10. Pageable pageable = PageRequest.of(page, size);
    11. return userRepository.findByLastName(lastName, pageable);
    12. }
    13. }
    2、排序操作
    • 使用 Spring Data JPA 提供的方法: Spring Data JPA 也提供了内置的排序方法,例如 findAll(Sort sort)。你可以创建一个 Sort 对象,指定要按哪个字段进行排序,然后将其传递给排序方法。
    1. import org.springframework.data.domain.Sort;
    2. import org.springframework.data.jpa.repository.JpaRepository;
    3. public interface UserRepository extends JpaRepository {
    4. List findAll(Sort sort);
    5. }
    1. import org.springframework.beans.factory.annotation.Autowired;
    2. import org.springframework.data.domain.Sort;
    3. import org.springframework.stereotype.Service;
    4. @Service
    5. public class UserService {
    6. @Autowired
    7. private UserRepository userRepository;
    8. public List getUsersSortedByLastName() {
    9. Sort sort = Sort.by(Sort.Order.asc("lastName"));
    10. return userRepository.findAll(sort);
    11. }
    12. }
    • 自定义查询方法: 你也可以在自定义查询方法中使用 Sort 参数,以自定义排序方式。
    1. import org.springframework.data.domain.Sort;
    2. import org.springframework.data.jpa.repository.JpaRepository;
    3. public interface UserRepository extends JpaRepository {
    4. List findByLastName(String lastName, Sort sort);
    5. }
    1. import org.springframework.beans.factory.annotation.Autowired;
    2. import org.springframework.data.domain.Sort;
    3. import org.springframework.stereotype.Service;
    4. @Service
    5. public class UserService {
    6. @Autowired
    7. private UserRepository userRepository;
    8. public List getUsersByLastNameSorted(String lastName) {
    9. Sort sort = Sort.by(Sort.Order.asc("lastName"));
    10. return userRepository.findByLastName(lastName, sort);
    11. }
    12. }

    四、SpringData Jpa Querydsl

    pring Data JPA 与 Querydsl 结合使用可以更方便地执行复杂的数据库查询,Querydsl 是一个强大的查询框架,它允许你使用类型安全的 Java 查询语言来构建数据库查询。下面是一个示例,演示如何在 Spring Data JPA 中使用 Querydsl。

    1. 添加依赖:

    首先,你需要在项目中添加 Spring Data JPA 和 Querydsl 的依赖。

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-data-jpaartifactId>
    4. dependency>
    5. <dependency>
    6. <groupId>com.querydslgroupId>
    7. <artifactId>querydsl-jpaartifactId>
    8. dependency>

    2. 创建 Querydsl Predicate:

    使用 Querydsl 前,你需要定义实体的查询模型。你可以使用 Querydsl 插件来自动生成查询模型。假设你有一个名为 User 的实体,可以通过运行 Maven 插件生成查询模型:

    1. <build>
    2. <plugins>
    3. <plugin>
    4. <groupId>com.mysema.mavengroupId>
    5. <artifactId>apt-maven-pluginartifactId>
    6. <version>1.1.3version>
    7. <executions>
    8. <execution>
    9. <phase>generate-sourcesphase>
    10. <goals>
    11. <goal>processgoal>
    12. goals>
    13. <configuration>
    14. <outputDirectory>target/generated-sourcesoutputDirectory>
    15. <processor>com.querydsl.apt.jpa.JPAAnnotationProcessorprocessor>
    16. configuration>
    17. execution>
    18. executions>
    19. plugin>
    20. plugins>
    21. build>

    然后,在你的查询模型包中将生成一个 QUser 类,该类用于构建查询。

    3. 创建查询方法:

    在你的 Spring Data JPA Repository 接口中创建查询方法,你可以使用 Querydsl 的 QuerydslPredicateExecutor 接口来执行查询。

    1. import org.springframework.data.jpa.repository.JpaRepository;
    2. import org.springframework.data.querydsl.QuerydslPredicateExecutor;
    3. public interface UserRepository extends JpaRepository, QuerydslPredicateExecutor {
    4. }

    4. 使用 Querydsl 进行查询:

    在你的服务或控制器类中,你可以使用 Querydsl 查询模型和 Predicate 对象来执行查询。

    1. import com.querydsl.core.types.Predicate;
    2. import org.springframework.beans.factory.annotation.Autowired;
    3. import org.springframework.stereotype.Service;
    4. import java.util.List;
    5. @Service
    6. public class UserService {
    7. @Autowired
    8. private UserRepository userRepository;
    9. public List findUsersWithAgeGreaterThan(int age) {
    10. QUser qUser = QUser.user;
    11. Predicate predicate = qUser.age.gt(age);
    12. return (List) userRepository.findAll(predicate);
    13. }
    14. }

    在这个例子中,我们使用了 Querydsl 查询模型中生成的 QUser 类,以及 Predicate 对象来构建查询条件。然后,我们在 UserRepository 上使用 findAll 方法执行查询。

  • 相关阅读:
    工业控制系统安全需求的变化
    第七章 ObjectScript 一般系统限制
    刷题指南:关于输出内容的程序的小窍门
    CSS 实现:常见布局
    带你快速掌握Linux最常用的命令(图文详解)- 最新版(面试笔试常考)
    汇编语言是怎么一回事?
    Qt 中 connect 函数实现信号与槽函数的连接
    LeetCode 3 无重复字符的最长子串
    升级node到指定版本
    MySQL常见面试题汇总(建议收藏!!!)
  • 原文地址:https://blog.csdn.net/TreeShu321/article/details/133019747