在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);
}
|
附录