2019独角兽企业重金招聘Python工程师标准>>>
先抛一个官方文档: https://docs.spring.io/spring-data/rest/docs/2.6.6.RELEASE/reference/html/
如果英语不好,没关系,还有中文版的:https://springcloud.cc/spring-data-rest-zhcn.html#getting-started.boot
不过。。中文版的可能会让你吐血.
本篇由于是在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 依赖:
com.h2database h2
本篇文章中,我是使用了MySQL
2.SpringBoot web起步依赖
3.SpringBoot JPA 起步依赖
4.SpringBoot Data Rest 起步依赖
5.SpringBoot test 起步依赖
我这边为了方便还引入了alibaba的fastjson依赖
具体如下:
org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-data-rest org.springframework.boot spring-boot-starter-web com.alibaba fastjson 1.2.44 mysql mysql-connector-java org.springframework.boot spring-boot-starter-test test
三、实现小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, 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', '[email protected]'), ('685c61b2c739103686a9f798118e953e', 'jinchi', 'jinchi', 'Big Devil', 'all', 'princess', '1827777777', '[email protected]'), ;
四、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用于删除数据
写个实例说明一下吧:
a. GET就是使用RESTFUL的方式加入id的值获取单个实例:
http://localhost/configUsers/685c61b2c739103686a9f798118e953f
b. POST就是将实体类信息放在消息体中,如果指定了ID就是更新操作,如果没有指定就是保存操作
如:保存操作:
和更新操作:
c. PUT只用于更新,它和GET的方式URI一样,在消息体中录入相信信息就可以将数据更新:
d. PATCH和PUT非常像,但是它只更新记录的数据,我觉得在项目中使用这个方法会比PUT要好很多:
e. DELETE就不说了和GET的URI一样,作用就是删除单条数据
http://localhost/configUsers/685c61b2c739103686a9f798118e953f
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为前缀的各种配置项,原因可以参考我之前写的第一篇文章。
今天时间有点赶,暂时就写到这里了
gitee地址: https://gitee.com/swicky/spring_data_rest.git