spring-data-rest实现增删改查
- 项目相关依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/>
</parent>
<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>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
- 实体类
@Data
@Entity
@Table(name = "member_info")
public class ProjectMember {
@Id
@GeneratedValue(generator = "uuid",strategy= GenerationType.AUTO)
@GenericGenerator(name = "uuid", strategy = "uuid")
@Column(name = "member_id")
private String memberId;
@Column(name = "project_id")
private String projectId;
@Column(name = "user_id")
private String userId;
@Column(name = "member_role")
private String memberRole;
@Column(name = "user_name")
private String userName;
}
实体创建后只需要DAO层,与传统写法不同,不需要其他业务层,DAO层如下:
- 实体对应DAO层
主要使用@RepositoryRestResource与@RestResource两个注解,如想了解原理,具体请百度,哈哈,下面让我们快速上手:
@RepositoryRestResource(collectionResourceRel = "member",path="member")
public interface ProjectMemberRepository extends JpaRepository<ProjectMember, String>{
@RestResource(path = "page")
Page<ProjectMember> findByProjectIdAndUserNameLike(String projectId,
String userName, Pageable pageable);
@RestResource(path = "memberList")
List<ProjectMember> findByProjectIdEquals(@Param("projectId") String projectId);
}
- 访问接口
启动项目访问http://localhost:8082/member,结果如下(作者使用postman):
{
"_embedded": {
"member": [
{
"memberId": "18",
"projectId": "8a929f8b729e1bd101729e39a1970007",
"userId": "4",
"memberRole": "1",
"userName": "业务用户7",
"_links": {
"self": {
"href": "http://localhost:8082/member/18"
},
"projectMember": {
"href": "http://localhost:8082/member/18"
}
}
},
{
"memberId": "19",
"projectId": "8a929f8b729e1bd101729e39a1970007",
"userId": "4",
"memberRole": "1",
"userName": "业务用户8",
"_links": {
"self": {
"href": "http://localhost:8082/member/19"
},
"projectMember": {
"href": "http://localhost:8082/member/19"
}
}
}
]
},
"_links": {
"self": {
"href": "http://localhost:8082/member{?page,size,sort}",
"templated": true
},
"profile": {
"href": "http://localhost:8082/profile/member"
},
"search": {
"href": "http://localhost:8082/member/search"
}
},
"page": {
"size": 20,
"totalElements": 2,
"totalPages": 1,
"number": 0
}
}
其中member中的内容是当前实体的所有实例,即数据库的数据;
_links中内容使用最频繁,http://localhost:8082/member/search是我们自己定义查询方法时使用最多的,请继续往下浏览
- 列表查询
上一步中我们看到的_links中href为http://localhost:8082/member{?page,size,sort}的即是列表查询接口,但是平时使用中我们通常会使用根据某个字段查询列表,所以我们在DAO层中写了此方法:
@RestResource(path = "page")
Page<ProjectMember> findByProjectIdAndUserNameLike(String projectId,String userName, Pageable pageable);
该方法调用示例如下,注意路径:
http://localhost:8082/member/search/page?projectId=8a929f8b729e1bd101729e39a1970007&userName=%%&page=0&size=10
由于是根据userName模糊查询,userName默认要传入字符串“%%”,不然是查询不到东西的;若要查询名称包含“业务”的,此时userName = %业务%
调用结果如下:
{
"_embedded": {
"member": [
{
"memberId": "18",
"projectId": "8a929f8b729e1bd101729e39a1970007",
"userId": "4",
"memberRole": "1",
"userName": "业务用户7",
"_links": {
"self": {
"href": "http://localhost:8082/member/18"
},
"projectMember": {
"href": "http://localhost:8082/member/18"
}
}
},
{
"memberId": "19",
"projectId": "8a929f8b729e1bd101729e39a1970007",
"userId": "4",
"memberRole": "1",
"userName": "业务用户8",
"_links": {
"self": {
"href": "http://localhost:8082/member/19"
},
"projectMember": {
"href": "http://localhost:8082/member/19"
}
}
}
]
},
"_links": {
"self": {
"href": "http://localhost:8082/member/search/page?projectId=8a929f8b729e1bd101729e39a1970007&userName=%25%25&page=0&size=10"
}
},
"page": {
"size": 10,
"totalElements": 2,
"totalPages": 1,
"number": 0
}
}
- 新增
POST接口,接口地址:
http://localhost:8082/member
接口参数为json:
{
"projectId":"8a929f8b729e1bd101729e39a1970007",
"userId":"33333",
"memberRole":"1",
"userName":"测试业务用户"
}
接口调用成功会返回新增的实体,结果如下:
{
"memberId": "8a929f87730a185401730a3a648e0000",
"projectId": "8a929f8b729e1bd101729e39a1970007",
"userId": "33333",
"memberRole": "1",
"userName": "测试业务用户",
"_links": {
"self": {
"href": "http://localhost:8082/member/8a929f87730a185401730a3a648e0000"
},
"projectMember": {
"href": "http://localhost:8082/member/8a929f87730a185401730a3a648e0000"
}
}
}
- 删除
DELETE接口,接口地址:
http://localhost:8082/member/8a929f87730a185401730a3a648e0000
接口地址最后是实体的id
- 修改
我们将前面查到的userName为“业务用户8”的用户修改userName为“用户88”
使用PUT接口,接口地址:
http://localhost:8082/member/19
接口参数为json:
{
"projectId":"8a929f8b729e1bd101729e39a1970007",
"userId":"4",
"memberRole": "1",
"userName":"用户88"
}
接口请求结果为已修改完成的实体:
{
"memberId": "19",
"projectId": "8a929f8b729e1bd101729e39a1970007",
"userId": "4",
"memberRole": "1",
"userName": "用户88",
"_links": {
"self": {
"href": "http://localhost:8082/member/19"
},
"projectMember": {
"href": "http://localhost:8082/member/19"
}
}
}
交流请Q:983717294