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