本篇由于是在SpringBoot的基础上学习SpringData Rest,可能和文档中会有一点不同。



一、什么是SpringData Rest?

    在了解这个概念之前,得先了解Repository,Repository是一个针对于数据库操作的组件的统称,最常见的有 Spring Data JPA、Spring Data MongoDB等等等。。。它最大的特点就是可以运用RESTFUL的风格自定义数据操作方法,同时不需要手写任何SQL来对数据库进行操作,底层会识别方法名从而帮你编写对应的SQL,唯一的缺点就是很难用作逻辑复杂的应用。在了解了Repository之后,再理解SpringData Rest就很容易了,它是在Repository的基础上将对数据库的操作流程转换成REST服务,它作为一个SpringMVC应用,非常适合当做一个微服务。

 



二、基础环境的搭建

    在SpringBoot下使用SpringData Rest必要的依赖有:

1.数据库加载驱动,如果没有本地安装数据库,可以使用SpringBoot内嵌数据库H2DataBase 依赖:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>

本篇文章中,我是使用了MySQL

2.SpringBoot web起步依赖

3.SpringBoot JPA 起步依赖

4.SpringBoot Data Rest 起步依赖

5.SpringBoot test 起步依赖

我这边为了方便还引入了alibaba的fastjson依赖

具体如下:

<dependencies>
       <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>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>

       <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>fastjson</artifactId>
           <version>1.2.44</version>
       </dependency>
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
       </dependency>
<!--       <dependency>
           <groupId>com.h2database</groupId>
           <artifactId>h2</artifactId>
       </dependency>-->
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-test</artifactId>
           <scope>test</scope>
       </dependency>
   </dependencies>



三、实现小demo

简单点说吧,新建一个entity实体类,随便加一点属性,再写一个Repository接口,加上注释@RepositoryRestResource,OK,敲定,运行程序,使用postman试试效果看,嘿,挺完美的。

springboot datetimeformat 参数 springboot data rest_REST

代码如下:

实体类ConfigUser:

@Entity
public class ConfigUser implements Serializable{

    @Id
    private String id;
    @Column(nullable = false)
    private String userName;
    @Column(nullable = false)
    private String password;
    @Column
    private String permission;
    @Column
    private String nickName;
    @Column
    private String userGroup;
    @Column
    private String level;
    @Column
    private String tel;
    @Column
    private String mail;
    
    //省略setter getter
}

Repository:



@Component
@RepositoryRestResource
public interface ConfigUserRepository extends JpaRepository<ConfigUser, String> {
    /**根据用户名获取用户信息*/
    ConfigUser findConfigUserByUserName(@Param("userName") String userName);


SQL:



DROP TABLE IF EXISTS config_user;

CREATE TABLE `config_user`(
  `id` VARCHAR(32) NOT NULL COMMENT '主键',
  `user_name` VARCHAR(255) NOT NULL COMMENT '用户名',
  `password` VARCHAR(255) NOT NULL COMMENT '登陆密码',
  `nick_name` VARCHAR(255) COMMENT '用户昵称',
  `permission` VARCHAR(255) COMMENT '权限',
  `user_group` VARCHAR(255) COMMENT '用户分组',
  `level` VARCHAR(255) NOT NULL DEFAULT '1' COMMENT '用户等级',
  `tel` VARCHAR(11) COMMENT '联系方式',
  `mail` VARCHAR(255) COMMENT '邮箱',
  PRIMARY KEY (`id`)
);

INSERT INTO `config_user` (`id`, `user_name`, `password`, `nick_name`, `permission`, `user_group`, `tel`, `mail`)
VALUES
('685c61b2c739103686a9f798118e953f', 'shaoyu', 'shaoyu', 'Swicky', 'all', 'people', '13312345678', 'shaoyu@balabala.com'),
('685c61b2c739103686a9f798118e953e', 'jinchi', 'jinchi', 'Big Devil', 'all', 'princess', '1827777777', 'jinchi@xiaomoxian.com'),
;



四、SpringBoot Data Rest用法剖析



1.获取可用资源

名字说的很术语,其实就是获取一些信息来告诉我们可以使用哪些URI获取数据,很简单,使用GET方式输入localhost就可以了(我这里的端口是使用了80,所以不需要使用:80的后缀)

springboot datetimeformat 参数 springboot data rest_REST_02

    在返回的links中会返回当前可使用所有的URI



2.资源的收集

在Repository接口上面添加注解@RepositoryRestResource可以指定将该接口暴露为REST服务,并且可以指定资源的名字和URI路径。

这样就可以使用 localhost/{path/}/实体类 的方式获取数据,(path是可指定可不指定,不指定可以忽略)

资源收集(就是查询)仅支持GET和POST方式,其他方式会报错“ 405 Method Not Allowed ”。

这种方式支持的参数有三种:

  • page - 页码,默认为0.
  • size - 返回长度,默认值为20.
  • sort - 排序方式,格式为 ($propertyname,)+[asc|desc]

如: http://localhost/configUsers?page=2&size=1&sort=userName,asc

在资源收集这一块还有一个search URI,可以查询所有已经暴露为REST服务的自定义的方法:

springboot datetimeformat 参数 springboot data rest_REST_03

当然,如果你想要将某个已经支持的方法不再暴露,只需要在该方法上面加上@RestResource(exported = false)注解就可以了,如果没有任何自定义方法暴露成REST服务,search URI的不会返回数据的。



3. item source(引用官方文档英文,感觉翻译成任何中文都感觉不合适)

和资源收集有点类似,不过仅仅只单独对一个实例进行操作,

支持GET、POST、PUT、PATCH和DELETE的http方法获取

GET多用于查询

POST多用于更新保存操作

PUT多用于更新操作

PATCH和PUT类似,但是是部分更新资源。

DELETE用于删除数据

写个实例说明一下吧:

b.  POST就是将实体类信息放在消息体中,如果指定了ID就是更新操作,如果没有指定就是保存操作

如:保存操作:

springboot datetimeformat 参数 springboot data rest_spring_04

和更新操作:

springboot datetimeformat 参数 springboot data rest_REST_05

c. PUT只用于更新,它和GET的方式URI一样,在消息体中录入相信信息就可以将数据更新:

springboot datetimeformat 参数 springboot data rest_REST_06

d. PATCH和PUT非常像,但是它只更新记录的数据,我觉得在项目中使用这个方法会比PUT要好很多:

springboot datetimeformat 参数 springboot data rest_spring_07

e. DELETE就不说了和GET的URI一样,作用就是删除单条数据


4. 关联资源

关联资源是指每个实体类关联一个的另一个实体对象,这个暂且放置,后续再添加一个权限类和用户类关联,然后再写出来。



5.其他

除了以上说到的几点之外,Spring Data Rest还提供了几个别的REST服务,这里不需要太过深入研究,了解就好:

搜索资源,搜索资源返回的是由Repository公开的所有查询方法的链接

方法资源,查询方法资源通过Repository接口上的单个查询方法执行查询

这两个仅支持GET方式。



五、SpringBoot Data Rest 自定义配置

在SpringBoot应用中可对springboot Data Rest进行自定义配置项的包括以下表格内容(中文文档翻译的很蛋疼)

Spring Boot可配置属性

名称

描述

基本路径

Spring Data REST的根URI

defaultPageSize

更改在单个页面中投放的默认项目数量

maxpagesize

更改单个页面中的最大项目数量

pageParamName

更改用于选择页面的查询参数的名称

limitParamName

更改页面中要显示的项目的查询参数的名称

sortParamName

更改用于排序的查询参数的名称

defaultMediaType

更改默认介质类型以在没有指定时使用

returnBodyOnCreate

如果在创建一个新实体时应该返回一个主体,那么请改变

returnBodyOnUpdate

如果在更新一个实体时应该返回一个机构,则更改

 原版文档对照:

Name

Description

basePath

root URI for Spring Data REST

defaultPageSize

change default number of items served in a single page

maxPageSize

change maximum number of items in a single page

pageParamName

change name of the query parameter for selecting pages

limitParamName

change name of the query parameter for number of items to show in a page

sortParamName

change name of the query parameter for sorting

defaultMediaType

change default media type to use when none is specified

returnBodyOnCreate

change if a body should be returned on creating a new entity

returnBodyOnUpdate

change if a body should be returned on updating an entity

 值得注意的是在SpringBoot中配置需要添加前缀:spring.data.rest

如:spring.data.rest.base-path:/api

实现的作用就是所有REST服务都需要在localhost后面添加/api作为REST服务的根目录

我这里没有用驼峰,而是使用了"-"连接符是由于使用SpringBoot版本是2.0.4-RELEASE。

在这里需要说明一下为什么要使用spring.data.rest作为前缀,SpringBoot应用的最大特点之一就是使用起步依赖,而SpringBoot Data Rest的起步依赖所使用的配置类是RepositoryRestMvcConfiguration

RepositoryRestMvcConfiguration会自动识别以spring.data.rest为前缀的各种配置项,原因可以参考我之前写的第一篇文章。

今天时间有点赶,暂时就写到这里了