Spring Data JPA

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 有几种配置:

  • create:每次加载生成新表。
  • create-drop:每次加载生成新表,但当 SessionFactory 关闭时,所生成的表将自动删除。
  • update:第一次加载时创建数据表,以后加载根据实体更新,只增不删。
  • validate:每次加载验证数据表结构,只会和已经存在的数据表进行比较,根据model修改表结构,但不会创建新表。

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

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 比较操作

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

  • IsAfter、 After、 IsGreaterThan、 GreaterThan
  • IsGreaterThanEqual、 GreaterThanEqual

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 所生成的方法合并在一起。

Author: iMine
Link: https://imine141.github.io/2020/07/17/Spring/Data/Spring%20Data%20JPA/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.