使用Spring Data REST

介绍

Spring Data REST是个快速构建REST服务的脚手架,这里整个项目是基于Spring Boot的

下载依赖

1
2
3
4
5
6
7
8
9
10
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependencies>

实体类映射

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.example.demo;

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import java.util.List;

@Data
@Entity
public class Student {
@Id
@GeneratedValue
private long id;

private String name;
}

配置数据DAO

1
2
3
4
5
6
7
8
package com.example.demo;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;

@RepositoryRestResource
public interface StudentRepository extends JpaRepository<Student, Long> {
}

CRUD

对于集合资源

GET 返回资源,通过page、size和sort来控制返回的数据
POST 创建一个新的资源
HEAD 资源是否可用

除了这些外,其他请求都不支持

对于单个资源

GET 返回单个资源
HEAD 返回资源是否可用
PUT 替换资源
PATCH 部分更新资源
DELETE 删除资源

对于关联的资源

GET 获取资源

Create

新建使用POST

1
2
3
4
5
6
7
8
curl -X POST \
http://localhost:8080/students \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-H 'Postman-Token: 01b18db0-58a2-4315-8df3-0f783f8d13d0' \
-d '{
"name": "Jobs"
}'

Read

1
2
3
4
读取采用GET
curl -X GET http://localhost:8080/students

curl -X GET http://localhost:8080/students/1

Update

更新使用PUT

1
2
3
4
5
6
7
8
curl -X PUT \
http://localhost:8080/students/1 \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-H 'Postman-Token: 0b4029f6-42ba-4c79-9c31-b2f1cb884898' \
-d '{
"name": "James"
}'

Delete

1
2
3
4
5
6
7
8
curl -X DELETE \
http://localhost:8080/students/1 \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-H 'Postman-Token: c13c0395-eb18-4b43-b16f-8cea06f5f0b0' \
-d '{
"name": "James"
}'

对于关联资源的CRUD

这个是被关联的资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.example.demo;

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import java.util.List;

@Data
@Entity
public class Teacher {
@Id
@GeneratedValue
private Long id;

private String name;
}

这事包含关联资源的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.example.demo;

import lombok.Data;
import org.springframework.data.annotation.LastModifiedDate;

import javax.persistence.*;
import java.util.Date;
import java.util.List;

@Data
@Entity
public class Student {
@Id
@GeneratedValue
private long id;
@Version
private long version;
@LastModifiedDate
private Date date;

private String name;

@OneToMany
private List<Teacher> teachers;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.example.demo;

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import java.util.List;

@Data
@Entity
public class Teacher {
@Id
@GeneratedValue
private Long id;

private String name;
}

Create

  1. 先插入两个教师
1
2
curl -X POST http://localhost:8080/teachers -d '{ "name": "James Hadden" }'
curl -X POST http://localhost:8080/teachers -d '{ "name": "Crise Pual" }'

教师的ID分别为1, 2

  1. 新建学生
1
2
3
curl -X POST http://localhost:8080/students -d '{ "name": "James Hadden", "teachers": [
"http://localhost:8080/teachers/1", "http://localhost:8080/teachers/1"
] }'

这个时候会新建成功,并且教师的信息也会关联到学生上

1
2
3
curl -X POST http://localhost:8080/students -d '{ "name": "James Hadden", "teachers": [
"http://localhost:8080/teachers/1", "http://localhost:8080/teachers/1"
] }'

我们再次插入学生信息,这个时候数据库就会报错了,因为@OneToMany注解是一个教师只能属于一个学生。这个时候注解应该改为@ManyToMany,这个时候就能插入了

Update

未完待续!