2 Spring Data JPA

Wu Jun 2020-01-10 10:33:16
06 Spring > 05 Data.md

Java 持久化 API(Java Persistence API, JPA)基于 POJO 的持久化机制,制定了规范,具体由厂商实现。

只需按照约定好的【方法命名规则】编写 Repository 接口,不需要实现类,就可实现对数据库的访问和操作。

hibernate 实现了 JPA 规范,Spring Data JPA 进一步封装了 Hibernate。

1 配置

maven

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

application.properties

spring.jpa.properties.hibernate.hbm2ddl.auto = update
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql = true

spring.jpa.properties.hibernate.hbm2ddl.auto 有几种配置:

不配置此项,表示禁用自动建表功能

2 简单使用

2.1 建立 entity

@Entity
@Data
public class User {
    @Id
    @GeneratedValue
    private long id;
    @Column(nullable = false, unique = true)
    private String userName;
    @Column(nullable = false)
    private int age;
}

2.2 扩展 Repository 接口

扩展 Repository 接口或其子接口 JpaRepository、 PagingAndSortingRepository 和 CrudRepository

应用启动后自动生成接口的实现,提供默认通用方法。

public interface UserRepository extends JpaRepository<User, Long> {
}

2.3 启用 Spring Data JPA

@EnableJpaRepositories 注解,扫描查找扩展自 Spring Data JPA Repository 接口的所有接口。

@Configuration
@EnableJpaRepositories{basePackages="com.xxx.xxx"}
public class JpaConfiguration{
    ...
}

3 定义查询方法

只需使用属性名和关键字构建 Repository 方法签名, 就能让 Spring Data JPA 生成方法实现

当创建 Repository 实现的时候, Spring Data 会检查 Repository 接口的所有方法, 解析方法的名称, 并基于被持久化的对象来试图推测方法的目的。

3.1 方法组成

Repository 方法是由一个动词、 一个可选的主题、 关键词 By 以及一个断言所组成。

User findByUsername(String userName);

findByUsername() 这个样例中, 动词是 find, 断言是 Username, 主题并没有指 定, 暗含的主题是 User。

3.2 比较操作

断言中的多个限制条件可以进行比较操作

4 声明自定义查询

如果 Spring Data 的这个小型的 DSL 无法满足需求,还可以通过 @Query 注解来解决问题。

Query("select * from User where username like '%abc'")
List<User> findByAllAbcUser();

5 混合自定义的功能

当 Spring Data JPA 为 Repository 接口生成实现的时候, 它还会查找名字与接口相同, 并且添加了 Impl 后缀的一个类。 如果这个类存在的话, Spring Data JPA 将会把它的方法与 Spring DataJPA 所生成的方法合并在一起。