目录

Spring Data JPA

在JPA之前,ORM是更常用于指代这些框架的术语。这就是Hibernate被称为ORM框架的原因。

JPA允许我们将应用程序类映射到数据库中的表。

  • 实体管理器: : 定义映射后,它将处理与数据库的所有交互。
  • JPQL(Java持久性查询语言): 它提供了一种编写查询以对实体执行搜索的方法。它不同于SQL查询。 JPQL查询已经了解实体之间定义的映射。如果需要,我们可以添加其他条件。
  • 标准API : 它定义了一个基于Java的API以对数据库执行搜索。

Hibernate是JPA的实现。它是最流行的ORM框架,而JPA是定义规范的API。 Hibernate了解我们在对象和表之间添加的映射。它确保基于映射从数据库检索/存储数据。它还在JPA顶部提供了其他功能。

Spring Data JPA

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-bom</artifactId>
      <version>2021.2.3</version>
      <scope>import</scope>
      <type>pom</type>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
  </dependency>
<dependencies>
1
2
3
4
@EnableJpaRepositories(basePackages = "com.ynthm.persistence.repository") 
public class PersistenceConfig { 
    
}

Spring Data JPA提供了 三个存储库,如下所示:

  • CrudRepository: : 它提供标准的创建,读取,更新和删除。它包含诸如 findOne(),findAll( ),save(),delete(),等。
  • PagingAndSortingRepository : 它扩展了 CrudRepository 并添加了findAll方法。它使我们能够以分页方式排序和检索数据。
  • JpaRepository : 这是一个 JPA特定存储库,它在 Spring Data Jpa 中定义。它扩展了存储库CrudRepository和PagingAndSortingRepository。它添加了特定于JPA的方法,例如 flush(),以在持久性上下文上触发刷新。

spring-boot-starter-data-jpa

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.7.4</version>
</dependency>

Spring Data 分页

通过接口实现 PagingAndSortingRepository来分页查询,但这个分页并不能带条件。

Dao层接口实现JpaSpecificationExecutor就可以达到带条件分页的效果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Repository
public interface UserRepository
    extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User>{
}


@Test
public void testJpaSpecificationExecutor(){

int pageIndex = 1;
int pagesize = 10;
PageRequest pagerequest = new PageRequest(pageIndex - 1, pagesize);

Specification specification = new Specification() {
/**
* Root:表示查询的实体
* CriteriaQuery:可以从中得到root对象,即告知JPA criteria查询要查询哪一个实体类。还可以来添加查询条件。还可以结合EntityManager对象得到最终查询的TypedQuery对象。
* CriteriaBuilder:用于创建Criteria相关对象的工厂。
*/
  @Override
  public Predicate toPredicate(Root root, CriteriaQuery> query, CriteriaBuilder cb) {
    //年龄属性
    Path path = root.get("age");
    Predicate predicate = cb.gt(path, 5);//大于5
    return predicate;
  }
};

Page page = userRepository.findAll(specification, pagerequest);
}

QueryByExampleExecutor

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Test

public void test05(){
  Pageable pageable = PageRequest.of(0, 5);

  //条件值对象(定义一个查询实体,给相对应的属性赋值表示要查询的条件, 对象属性为空时代表全部查询)
  User user = new User();
  user .setName("wang");

  //表示创建一个空的条件匹配器(初始化)(进行模糊查询或等其它查询配置)
  ExampleMatcher exampleMatcher = ExampleMatcher.matching()
    //创建匹配条件, 加入匹配条件的对应实体属性和查询规则(查询pageAliase属性包含×××的数据)
    .withMatcher("name", ExampleMatcher.GenericPropertyMatchers.contains());
//        ExampleMatcher.GenericPropertyMatchers.contains() 包含关键字
//        ExampleMatcher.GenericPropertyMatchers.startsWith() 前缀匹配
//        ExampleMatcher.GenericPropertyMatchers.ignoreCase() 忽略大小写

  //定义查询条件 Example<T> 是JPA中装载查询条件的实体类
  //第一个参数是查询实体的查询条件, 第二个参数是条件匹配器(模糊查询等)
  Example<User> example = Example.of(cmsPage, exampleMatcher);
  Page<User> all = userRepository.findAll(example, pageable);
}

附录