前面我们我们已经看了Spring Boot中的很多知识点了,也见识到Spring Boot带给我们的各种便利了,今天我们来看看针对在Spring Boot中输出REST资源这一需求,Spring Boot带给我们哪些惊喜呢?最近这些文章是成一个系列的,如果小伙伴还没看前面几篇博客,读懂本文可能会有一些压力,建议对Spring Boot尚不了解的小伙伴先移步这里从SpringMVC到Spring Boot,已经很了解的小伙伴请忽略。OK,那么废话不多说,开始今天愉快的旅程吧。
关于什么是REST资源,很多小伙伴可能会有一种错觉,觉得地址栏写的干净整洁满足条件的就是RESTful架构,其实不然,关于什么是RESTful架构,给小伙伴们推荐这篇文章看一下理解RESTful架构,这篇博客带小伙伴们入个门是没问题的,如果还想了解更多关于REST的资料,自行Google吧。
创建工程并添加数据库依赖
当然,我们要从创建一个工程开始,工程的创建方式和前文一致,不同的是我们选择的依赖不同,这里我们选择JPA和Rest Repositories作为依赖,如下图:
OK,Project创建成功之后接下来我们要添加数据库依赖,我这里是继续使用mysql数据库,所以继续添加mysql数据库依赖,如下:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
在application.properties中数据库配置相关属性
这里配置和我们在上文中介绍的配置方式一致,如下:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/rest
spring.datasource.username=root
spring.datasource.password=123456
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jackson.serialization.indent_output=true
和我们在上文中介绍的配置方式一模一样,这里的东西如果小伙伴有不理解的可以参考这篇博客初识在Spring Boot中使用JPA,我在这里不再赘述。
创建实体类
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
private String name;
private Integer age;
private String address;
public Person() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Person(Long id, String name, Integer age, String address) {
this.id = id;
this.name = name;
this.age = age;
this.address = address;
}
}
实体类也是和上文介绍的一模一样,不再赘述。做好这些操作之后,运行我们的Project就可以在数据库中生成相应的表了,为了方便我们测试,我写了个简单的方法用来批量生成sql插入语句,方便我们后面做测试用,如下:
public class Test {
public static void main(String[] args) {
String[] addrss = new String[]{"西安", "北京", "郑州", "上海", "武汉", "长沙", "广州", "贵阳", "柳州", "咸阳", "蓝田", "渭南"};
String[] names1 = new String[]{"赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈"};
String[] names2 = new String[]{"强", "亚", "哲", "凡", "路", "举", "昕", "科", "武", "田"};
Random random = new Random();
for (int i = 0; i < 100; i++) {
System.out.println("insert into person(address,name,age) values('" + addrss[random.nextInt(addrss.length)] + "','" + names1[random.nextInt(names1.length)]+ names2[random.nextInt(names2.length)] + "','" + (20 + random.nextInt(70)) + "');");
}
}
}
运行该方法生成100条数据库插入语句,拷贝到数据库管理器中执行即可。
创建实体类的Repository
这个也和上文(初识在Spring Boot中使用JPA)中介绍的一模一样,而且还简单了许多,只提供了一个方法,如下:
public interface PersonRepository extends JpaRepository<Person,Long> {
List<Person> findByNameStartsWith(@Param("name") String name);
}
OK,做完这一切我们就可以测试了。不对,等等,我好像什么都没干呀,完全就是普通的JPA操作呀,这就是Spring Boot的便利之处,你是什么都不用干,直接测试你的Project吧。
测试
测试工具安装
REST测试工具多种多样,firefox和chrome上都有相应的插件,我这里以firefox上的RESTClient插件为例,我们先来看看安装过程:
工具安装对于各位智商杠杠滴的程序员来说应该没有什么难度,安装成功之后在浏览器的工具栏中会多出一个图标,如下:
点击该按钮,打开测试页面:
获取所有数据
在地址栏中访问http://localhost:8080/persons获取所有数据,如下图:
在Response Body (Raw)一栏中我们可以看到访问结果。
根据id获取单条数据
在地址栏中访问http://localhost:8080/persons/1获取id为1的数据,如下图:
查询数据
如果我们想调用刚刚自定义的PersonRepository中的方法来执行查询操作,那么只需对该方法稍作修改将之暴露为REST资源即可,如下:
public interface PersonRepository extends JpaRepository<Person,Long> {
@RestResource(path = "nameStartsWith",rel = "nameStartsWith")
List<Person> findByNameStartsWith(@Param("name") String name);
}
然后假设我们需要查询所有姓钱的人,那么在地址栏输入如下地址:http://localhost:8080/persons/search/nameStartsWith?name=钱
,访问结果如下:
分页查询
在地址栏输入http://localhost:8080/persons/?page=1&size=3进行分页查询,其中1表示第1页,3表示每页3条数据,查询结果如下:
在查询结果中,系统还给我们返回了首页地址、上页地址、下页地址以及尾页地址,如下:
排序查询
比如按照age字段从大到小排序,在地址栏输入这个http://localhost:8080/persons/?sort=age,desc,查询结果如下:
向数据库添加数据
上面我们演示的所有请求都是get请求,向数据库添加数据我们需要通过post请求,修改请求方式,然后在请求body中输入要提交的json字符串。同时我们还要告诉服务端,客户端提交的数据格式是json,所以在RESTClient工具的头部点击Headers,选择自定义头信息,如下:
然后添加Content-Type,如下:
OK,添加完头信息之后,就可以发起请求了,请求地址如下:http://localhost:8080/persons,访问结果如下:
如此之后,我们就向数据库中添加了一条数据了。
数据更新
通过put请求我们可以更新数据,假设我要更新id为99的数据,输入如下地址可以更新http://localhost:8080/persons/99,在请求body中传入修改参数,结果如下:
修改成功之后,数据库中该条数据随即变化。
数据删除
通过delete请求我可以删除一条数据,假设我要删除id为55的数据,先将请求改为delete请求,然后在地址栏输入如下地址http://localhost:8080/persons/55,结果如下:
这样,id为55的数据就被删除了。
定制
上面我们说了基本的请求,默认情况下我们访问所有数据的请求路径是http://localhost:8080/persons,如果想定制,我们可以在application.properties中进行配置,配置方式如下:
spring.data.rest.base-path=/api
这样,我的访问路径就变为了http://localhost:8080/api/persons.默认情况下我们是在实体类后面添加一个s形成路径,比如这里我们的实体类是Person,访问路径就是persons,有的时候我们需要对这个路径进行定制,这个可以在PersonRepository类中通过注解进行修改,如下:
@RepositoryRestResource(path = "people")
public interface PersonRepository extends JpaRepository<Person,Long> {
@RestResource(path = "nameStartsWith",rel = "nameStartsWith")
List<Person> findByNameStartsWith(@Param("name") String name);
}
OK ,经过上面两个定制操作之后,我的访问路径就变成这样了http://localhost:8080/api/people,访问结果如下:
简单吧。
本文案例下载:
本文案例GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test23-REST
更多Spring Boot资料请移步这里从SpringMVC到Spring Boot
以上。
参考资料:
《JavaEE开发的颠覆者 Spring Boot实战》第八章