本篇由于是在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试试效果看,嘿,挺完美的。
代码如下:
实体类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的后缀)
在返回的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服务的自定义的方法:
当然,如果你想要将某个已经支持的方法不再暴露,只需要在该方法上面加上@RestResource(exported = false)
注解就可以了,如果没有任何自定义方法暴露成REST服务,search URI的不会返回数据的。
3. item source(引用官方文档英文,感觉翻译成任何中文都感觉不合适)
和资源收集有点类似,不过仅仅只单独对一个实例进行操作,
支持GET、POST、PUT、PATCH和DELETE的http方法获取
GET多用于查询
POST多用于更新保存操作
PUT多用于更新操作
PATCH和PUT类似,但是是部分更新资源。
DELETE用于删除数据
写个实例说明一下吧:
b. POST就是将实体类信息放在消息体中,如果指定了ID就是更新操作,如果没有指定就是保存操作
如:保存操作:
和更新操作:
c. PUT只用于更新,它和GET的方式URI一样,在消息体中录入相信信息就可以将数据更新:
d. PATCH和PUT非常像,但是它只更新记录的数据,我觉得在项目中使用这个方法会比PUT要好很多:
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为前缀的各种配置项,原因可以参考我之前写的第一篇文章。
今天时间有点赶,暂时就写到这里了