Spring Data REST基于Spring Data的repository之上并自动将其导出为REST资源。目前Spring Data REST支持Spring Data JPA、Spring Data MongoDB、Spring Data Neo4j、Spring Data GemFire、Spring Data Cassandra的 repository 自动转换成REST服务。简单点说,Spring Data REST把我们需要编写的大量REST模版接口做了自动化实现.
利用spring boot + spring-data-rest + spring-data-jpa实现基本的增删改查api
dependencies {
compile 'com.alibaba:druid:1.1.17'
compile 'org.springframework.boot:spring-boot-starter-data-jpa'
compile 'org.springframework.boot:spring-boot-starter-data-rest'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'mysql:mysql-connector-java'
}
配置spring boot
server.port = 80
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.url = jdbc:mysql://192.168.134.128:3306/db_book?serverTimezone=CTT&useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true
spring.datasource.username = root
spring.datasource.password =
spring.jpa.database=mysql
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
创建Book实体类:
package com.wise.tiger.domain;
import javax.persistence.*;
import java.time.LocalDate;
@Entity
@Table(name = "tb_book")
public class Book {
/**
* id
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
/**
* 图书名称
*/
@Column(length = 12,nullable = false)
private String title;
/**
* 图书作者
*/
@Column(length = 12)
private String author;
/**
* 图书价格
*/
private float price;
/**
* 出版社信息
*/
@Column(length = 25)
private String publisher;
/**
* 图书简介
*/
@Lob
private String intro;
/**
* 出版日期
*/
private LocalDate publishDate = LocalDate.now();
// ******************setter and getter**********//
}
创建BookRepository接口
package com.wise.tiger.repository;
import com.wise.tiger.domain.Book;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
@RepositoryRestResource(path = "book")
public interface BookRepository extends JpaRepository<Book,Integer> {
}
在Repository接口上添加@RepositoryRestResource注解,并添加了一个Path为book。这样即可实现Book实体类的RESTFul风格的所有(基于Repository接口定义的api)接口。没有service层也没有Controller。
启动项目spring boot进行测试
要在自己的查询方法中使用分页,需要更改方法签名以接受其他可分页参数,并返回一个页面而不是列表。例如,以下查询方法导出到/book/search/titleStartsWith并支持分页:分页参数:
page:当前页,从0开始,默认值0
size:每页显示记录数,默认值20
可通过参数指定:http://localhost/book/?page=1&size=5
排序参数
sort
格式:http://localhost/book/?page=1&size=5&sort=title,desc
其中title为排序属性名称,desc为降序,升序为asc
@RestResource(path = "titleStartsWith", rel = "titleStartsWith")
Page findByTitleStartsWith(@Param("title") String title, Pageable p);
到目前为止,我们只写了很少的代码,只写了repository(DAO),但是却已经实现了增删改查REST api。我们甚至连 controller都没有写,就访问了这么多的REST url。
我们只通过@RepositoryRestResource(path = "book")
在 repository中就能够把 /path路径暴露出来。便一切都有了,这就是spring-data-rest的魔力。上面我们所访问的 /book/* 的地址,是从repository中通过 @RepositoryRestResource
注解暴露出去的,现在我们写一个自己的Controller来暴露额外的REST资源,访问路径/book/search/listBooks
@RepositoryRestController
@RequestMapping("/book")
public class PersonController {
@RequestMapping(method = GET, value ="/search/listBooks")
public String list(){
return "查询得到符合要求全部图书信息,实际去repository中查 ";
}
}