Spring Data REST 初步
在前面的 REST 实践当中,可以看到常用的 CRUD 操作,是有常见的写法和模式的。对于很多资源的 CRUD,要写很多类似的数据库操作代码,那么有没有办法简化代码呢?人们自然已经想到办法了,接下来我们将学习如何使用 Spring Data REST 来简化 REST 服务的开发。
基本概念
首先我们需要了解一些新的概念:
如果你还不了解 ORM 以及相关概念,请先学习一下,这里不再赘述。
- JPA:JPA 全称 Java Persistence API,是 Sun 官方提出的一套 Java 持久化规范,也可以简单理解为 ORM 的规范。
- Hibernate:Hibernate 是一个知名 Java 持久化框架,它实现了 JPA 规范,可以被用作 JPA Provider。
- Spring Data JPA:Spring 的 JPA 组件,它提供了将 JPA 融入 Spring 框架的支持,它默认使用 Hibernate 作为 JPA Provider。
开始使用 Spring Data REST
以我们之前的 PersonDao 为例,下面我们使用 Spring Data REST 重写它。
首先在 pom 中加入相关依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
然后我们需要配置一下数据库连接。为了方便,我们接下来使用 yaml 进行有关配置,将 AppConfig 当中的数据库配置删除。
由于 SQLite 没有提供 Hibernate 的接入支持(Dialect),我们需要手动引入一下,有关代码在这里可以找到 https://github.com/restart1025/Spring-Boot-SQLite/blob/master/src/main/java/com/restart1025/sqlite/SQLiteDialect.java
将这个文件引入工程之后,修改配置文件,让 Hibernate 找到这个驱动:
spring:
profiles:
active: dev
datasource:
driver-class-name: org.sqlite.JDBC
url: jdbc:sqlite:D:\\test.db
username:
password:
jpa:
database-platform: com.skyline.SQLiteDialect
hibernate:
ddl-auto: update
show-sql: true
重写 Person,将 Person 定义成 JPA 兼容的 model:
package com.skyline.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Person {
@Id
@GeneratedValue
private int id;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
还记得之前提到的 @Repository 吗?Spring 当中数据持久化使用 Repository 这个概念进行抽象。首先创建一个新 package 名为 repository,然后创建我们的 Rest Repository:
package com.skyline.repository;
import com.skyline.model.Person;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
@RepositoryRestResource(path = "person")
public interface PersonRepository extends PagingAndSortingRepository<Person, Integer> {
}
然后启动程序, 一个完整的 Person REST 接口就可以使用了,没错,就是这么简单!
使用 curl 测试一下 Person 的接口:
创建:
$ curl -X POST http://localhost:8080/person -d"{ \"name\": \"chester\"}" --header "Content-Type : application/json"
{
"name" : "chester",
"_links" : {
"self" : {
"href" : "http://localhost:8080/person/1"
},
"person" : {
"href" : "http://localhost:8080/person/1"
}
}
}
获取:
$ curl -X GET http://localhost:8080/person/1
{
"name" : "chester",
"_links" : {
"self" : {
"href" : "http://localhost:8080/person/1"
},
"person" : {
"href" : "http://localhost:8080/person/1"
}
}
}
同样修改和删除也是可用的。此外还可以通过 /person 拿到所有的 person 列表,以及一些其他接口,有兴趣可以自己尝试一下。
可能你注意到了,返回的 JSON 当中有 _links 这种属性。这种 JSON 格式被称为 HATEOAS 格式,即 hal-json,是一种更加规范的 REST 接口标准。如果我们不想使用 hal-json,可以修改配置文件:
spring:
//...
data:
rest:
defaultMediaType: application/json