Spring Boot 2精髓 - (6) Spring Data JPA

spring boot

以 Java Entity为中心, 将实体和实体关系对应到数据库的表和表关系, 这类工具通常就是 ORM (Object Relational Mapping)工具。 对实体和实体关系的操作会映射到 数据库操作。

SpringData JPA,它在 JPA 提供的简单语义上做了一定的封装,满足 CRUD 查询

SpringData,它为 Spring框架对访问 SQL和 NoSQL数据库提供了一致的方式

集成 Spring Data JPA

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

HikariCP 作为数据源提供者

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.5</version>
</dependency>

配置数据源

1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
public class DataSourceConfig {
@Bean(name = "dataSource")
public DataSource datasource(Environment env) {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl(env.getProperty("spring.datasource.url"));
ds.setUsername(env.getProperty("spring.datasource.username"));
ds.setPassword(env.getProperty("spring.datasource.password"));
ds.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
return ds;
}
}

配置JPA支持

Spring JPA Data 采用了Hibernate实现,Hibernate实现中有两个特性需要关注:

  • spring.jpa.hibemate.ddl-auto, 是否自动建库
  • spring.jpa.show-sql, 是否自动打印 SQL

Entity

实体类就必须使用@Entity来注解,JPA 也提供了大量的注解来表明实体属性和关系

  • @Id , 声明了一个属性将映射到数据库主键宇段。主键生成策略由注解 @GeneratedValue 来指定。比如,id 为自增主键,是 一种简单的数据库 主键生成策略,因此使用 GenerationType.IDENTITY 作为主键生成的策略 。
  • @Column,此注解表明属性对应到数据库的一个字段,且列名为 name指定的名称。
  • @ManyToOne, Many 指的是定义此属性的实体,即 User 实体,而 One 指的就是此注 解所注解的属性, ManyToOne 说明对象 User 和 Department 的关系是多对一关系,多 个用户属于一个部门 。
  • @JoinColumn,与 ManyToOne 搭配使用,说明外键字段是 department-id。

Repository

Repository 是 Spring Data 的核心概念,抽象了对数据库和 NoSQL 的操作,提供了接口 供开发者使用

CrudRepository

实现 Entity的简单增删改查功能

  • save
  • findByid
  • findAll
  • count
  • deleteByid
  • delete

PagingAndSortingRepository

增加了翻页查找和排序相关的操作

  • Iterable<T> findAll(Sort sort)
  • Page<T> findAll(Pageable pageable)

JpaRepository

提供了更多的实用功能,以及通过 Example 对象进行查询

Example 对象是 Spring Data JPA 提供的用来构造查询条件对象

持久化 Entity

save方法

Sort

JpaRepository 提供了如下表所述的内置查询

  • List findAll(); 返回所有实体
  • List findAJl(Iterable ids); 返回指定 id 的所有实体
  • T getOne(ID id) 根据 id 返回对应的实体,如果未找到,则返回 空
  • List findAll(Sort sort); 返回所有实体,按照指定顺序排序返回
  • Page findAll(Pageable pageable); 返回实体列表,实体的offset和 limit通过 pageable来指定

Sort对象用来指示排序

其他 Sort 的构造方法还包含:

  • public Sort(String… properties), 按照指定 的属性列表升序排序。
  • public Sort(Direction direction, String… properties),按照指定属性列表排序 ,排序由 Direction 指定, Direction 是一个枚举类,有 Direction.ASC 和 Direction.DESC 两类。
  • publicSort(Order…orders), Order可以通过Order静态方法来创建
    • public static Order asc(String propertyName)
    • public static Order desc(String propertyName)

Pageable 和 Page

Pageable 接口用于构造翻页查询, PageRequest 是其实现类,可以通过提供的工厂方法创建PageReques

基于方法名字查询

Spring Data 通过查询的方法名和参数名来自动构造一个 JPA OQL 查询

方法名和参数名需要遵守一定的规则, Spring Data JPA 才能自动转化为 JPQL:

  • 方法名通常包含多个实体属性用于查询,属性之间可以使用 AND 和 OR 连接,也支持 Between、 LessThan、 GreaterThan、 Like
  • 方法名可以以findBy、 getBy、 queryBy 开头
  • 查询结果可以排序,方法名包含 OrderBy+属性+ASC(DESC)
  • 可以通过 Top、 First来限定查询结果集
  • 一些特殊的参数可以出现在参数列表里,比如 Pageable、Sort

@Query 查询

注解 Query允许在方法上使用 JPQL

使用JPA Query

EntityManager 提供了实体操作的所有接口 ,可以通过 自动注入方式注入到 Spring 管理的 Bean 中, 通常是由@Service 注解的业务处理类上。

Example 查询

根据实体创建一个 Example对象,SpringData通过 Example对象来构造 JPQL

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2021 朝着牛逼的道路一路狂奔 All Rights Reserved.

访客数 : | 访问量 :