RESTful ,到如今相信已經沒人不知道這個東西了吧!關於 RESTful 的概念,我這裏就不作過多介紹了,傳統的 Struts 對 RESTful 支持不夠友好 ,可是 SpringMVC 對於 RESTful 提供了很好的支持,常見的相關注解有:html
@RestController @GetMapping @PutMapping @PostMapping @DeleteMapping @ResponseBody ...
這些註解都是和 RESTful 相關的,在移動互聯網中,RESTful 獲得了很是普遍的使用。RESTful 這個概念提出來很早,可是之前沒有移動互聯網時,咱們作的大部分應用都是先後端不分的,在這種架構的應用中,數據基本上都是在後端渲染好返回給前端展現的,此時 RESTful 在 Web 應用中基本就沒用武之地,移動互聯網的興起,讓咱們一套後臺對應多個前端項目,所以先後端分離,RESTful 順利走上前臺。前端
Spring Boot 繼承自 Spring + SpringMVC, SpringMVC 中對於 RESTful 支持的特性在 Spring Boot 中全盤接收,同時,結合 Jpa 和 自動化配置,對於 RESTful 還提供了更多的支持,使得開發者幾乎不須要寫代碼(不多幾行),就能快速實現一個 RESTful 風格的增刪改查。java
接下來,鬆哥經過一個簡單的案例,來向你們展現 Spring Boot 對於 RESTful 的支持。mysql
首先建立一個 Spring Boot 工程,引入 Web
、 Jpa
、 MySQL
、Rest Repositories
依賴:git
建立完成後,還須要鎖定 MySQL 驅動的版本以及加入 Druid 數據庫鏈接池,完整依賴以下:github
<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>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> <version>5.1.27</version> </dependency> </dependencies>
主要配置兩個,一個是數據庫,另外一個是 Jpa:web
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.username=root spring.datasource.password=root spring.datasource.url=jdbc:mysql:///test01 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=update spring.jpa.database-platform=mysql spring.jpa.database=mysql
這裏的配置,和 Jpa 中的基本一致。spring
前面五行配置了數據庫的基本信息,包括數據庫鏈接池、數據庫用戶名、數據庫密碼、數據庫鏈接地址以及數據庫驅動名稱。sql
接下來的五行配置了 JPA 的基本信息,分別表示生成 SQL 的方言、打印出生成的 SQL 、每次啓動項目時根據實際狀況選擇是否更新表、數據庫平臺是 MySQL。數據庫
這兩段配置是關於 MySQL + JPA 的配置,沒用過 JPA 的小夥伴能夠參考鬆哥以前的 JPA 文章:http://www.javaboy.org/2019/0407/springboot-jpa.html
@Entity(name = "t_book") public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "book_name") private String name; private String author; //省略 getter/setter } public interface BookRepository extends JpaRepository<Book,Long> { }
這裏一個是配置了一個實體類 Book,另外一個則是配置了一個 BookRepository ,項目啓動成功後,框架會根據 Book 類的定義,在數據庫中自動建立相應的表,BookRepository 接口則是繼承自 JpaRepository ,JpaRepository 中自帶了一些基本的增刪改查方法。
好了,代碼寫完了。
啥?你好像啥都沒寫啊?是的,啥都沒寫,啥都不用寫,一個 RESTful 風格的增刪改查應用就有了,這就是 Spring Boot 的魅力!
此時,咱們就能夠啓動項目進行測試了,使用 POSTMAN 來測試(你們也能夠自行選擇趁手的 HTTP 請求工具)。
此時咱們的項目已經默認具有了一些接口,咱們分別來看:
這個接口表示根據 id 查詢某一本書:
這是一個批量查詢接口,默認請求路徑是類名首字母小寫,而且再加一個 s 後綴。這個接口其實是一個分頁查詢接口,沒有傳參數,表示查詢第一頁,每頁 20 條數據。
查詢結果中,除了該有的數據以外,也包含了分頁數據:
分頁數據中:
若是要分頁或者排序查詢,可使用 _links 中的連接。http://127.0.0.1:8080/books?page=1&size=3&sort=id,desc
。
也能夠添加數據,添加是 POST 請求,數據經過 JSON 的形式傳遞,以下:
添加成功以後,默認會返回添加成功的數據。
修改接口默認也是存在的,數據修改請求是一個 PUT 請求,修改的參數也是經過 JSON 的形式傳遞:
默認狀況下,修改爲功後,會返回修改爲功的數據。
固然也能夠經過 DELETE 請求根據 id 刪除數據:
刪除成功後,是沒有返回值的。
不須要幾行代碼,一個基本的增刪改查就有了。
這些都是默認的配置,這些默認的配置實際上都是在 JpaRepository 的基礎上實現的,實際項目中,咱們還能夠對這些功能進行定製。
最普遍的定製,就是查詢,由於增刪改操做的變化不像查詢這麼豐富。對於查詢的定製,很是容易,只須要提供相關的方法便可。例如根據做者查詢書籍:
public interface BookRepository extends JpaRepository<Book,Long> { List<Book> findBookByAuthorContaining(@Param("author") String author); }
注意,方法的定義,參數要有 @Param 註解。
定製完成後,重啓項目,此時就多了一個查詢接口,開發者能夠經過 http://localhost:8080/books/search 來查看和 book 相關的自定義接口都有哪些:
查詢結果表示,只有一個自定義接口,接口名就是方法名,並且查詢結果還給出了接口調用的示例。咱們來嘗試調用一下本身定義的查詢接口:
開發者能夠根據實際狀況,在 BookRepository 中定義任意多個查詢方法,查詢方法的定義規則和 Jpa 中如出一轍(不懂 Jpa 的小夥伴,能夠參考乾貨|一文讀懂 Spring Data Jpa!,或者在鬆哥我的網站 www.javaboy.org 上搜索 JPA,有相關教程參考)。可是,這樣有一個缺陷,就是 Jpa 中方法名太長,所以,若是不想使用方法名做爲接口名,則能夠自定義接口名:
public interface BookRepository extends JpaRepository<Book, Long> { @RestResource(rel = "byauthor",path = "byauthor") List<Book> findBookByAuthorContaining(@Param("author") String author); }
@RestResource 註解中,兩個參數的含義:
這樣定義完成後,表示接口名爲 byauthor ,重啓項目,繼續查詢接口:
除了 rel
和 path
兩個屬性以外,@RestResource
中還有一個屬性,exported
表示是否暴露接口,默認爲 true
,表示暴露接口,即方法能夠在前端調用,若是僅僅只是想定義一個方法,不須要在前端調用這個方法,能夠設置 exported
屬性爲 false
。
若是不想暴露官方定義好的方法,例如根據 id
刪除數據,只須要在自定義接口中重寫該方法,而後在該方法上加 @RestResource
註解而且配置相關屬性便可。
public interface BookRepository extends JpaRepository<Book, Long> { @RestResource(rel = "byauthor",path = "byauthor") List<Book> findBookByAuthorContaining(@Param("author") String author); @Override @RestResource(exported = false) void deleteById(Long aLong); }
另外生成的 JSON 字符串中的集合名和單個 item
的名字都是能夠自定義的:
@RepositoryRestResource(collectionResourceRel = "bs",itemResourceRel = "b",path = "bs") public interface BookRepository extends JpaRepository<Book, Long> { @RestResource(rel = "byauthor",path = "byauthor") List<Book> findBookByAuthorContaining(@Param("author") String author); @Override @RestResource(exported = false) void deleteById(Long aLong); }
path
屬性表示請求路徑,請求路徑默認是類名首字母小寫+s,能夠在這裏本身從新定義。
最後,也能夠在 application.properties 中配置 REST 基本參數:
spring.data.rest.base-path=/api spring.data.rest.sort-param-name=sort spring.data.rest.page-param-name=page spring.data.rest.limit-param-name=size spring.data.rest.max-page-size=20 spring.data.rest.default-page-size=0 spring.data.rest.return-body-on-update=true spring.data.rest.return-body-on-create=true
配置含義,從上往下,依次是:
本文主要向你們介紹了 Spring Boot 中快速實現一個 RESTful 風格的增刪改查應用的方案,總體來講仍是比較簡單的,並不難。相關案例我已上傳到 GitHub 上了,小夥伴能夠自行下載:https://github.com/lenve/javaboy-code-samples。
關於本文,有問題歡迎留言討論。
關注公衆號牧碼小子,專一於 Spring Boot+微服務,按期視頻教程分享,關注後回覆 Java ,領取鬆哥爲你精心準備的 Java 乾貨!