在之前項(xiàng)目中我們想要讀取MongoDB
內(nèi)的內(nèi)容需要使用MongoDBTemplate
來完成數(shù)據(jù)的CRUD
齿诞,那如果我們想要通過RestController
的形式獲取MongoDB
內(nèi)的數(shù)據(jù)就更麻煩了麻裳,還需要自行去創(chuàng)建對(duì)應(yīng)的控制器,然后使用MongoDBTemplate
從MongoDB
內(nèi)讀取出數(shù)據(jù)后返回給前端涨椒。
在上一章節(jié)第五十一章:基于SpringBoot2 & MongoDB完成自動(dòng)化集成我們講到了SpringBoot2
與MongoDB
集成后怎么簡(jiǎn)單的操作數(shù)據(jù)摊鸡,當(dāng)然Spring Data Xxx
家族方式的設(shè)計(jì)與Spring Data JPA
一樣绽媒,Sring Data MongoDB
提供了一個(gè)MongoRepository<T,PK>
接口來為繼承該接口的子接口自動(dòng)提供代理類完成數(shù)據(jù)操作實(shí)現(xiàn)。
免費(fèi)教程專題
恒宇少年在博客整理三套免費(fèi)學(xué)習(xí)教程專題
免猾,由于文章偏多
特意添加了閱讀指南
是辕,新文章以及之前的文章都會(huì)在專題內(nèi)陸續(xù)填充
,希望可以幫助大家解惑更多知識(shí)點(diǎn)猎提。
本章目標(biāo)
使用Spring Data Rest
自動(dòng)映射讀取MongoDB
內(nèi)的數(shù)據(jù)获三,省去一系列繁瑣的操作步驟。
為你推薦
- 第五十一章:基于SpringBoot2 & MongoDB完成自動(dòng)化集成
- 第五十章:SpringBoot2.0新特性 - 豈止至今最簡(jiǎn)單redis緩存集成
- 第四十九章:SpringBoot2.0新特性 - 你get到WebMvcConfigurer兩種配置方式了嗎锨苏?
- 第四十八章:SpringBoot2.0新特性 - RabbitMQ信任package設(shè)置
- 第四十七章:SpringBoot2.0新特性 - Quartz自動(dòng)化配置集成
SpringBoot 企業(yè)級(jí)核心技術(shù)學(xué)習(xí)專題
專題 | 專題名稱 | 專題描述 |
---|---|---|
001 | Spring Boot 核心技術(shù) | 講解SpringBoot一些企業(yè)級(jí)層面的核心組件 |
002 | Spring Boot 核心技術(shù)章節(jié)源碼 | Spring Boot 核心技術(shù)簡(jiǎn)書每一篇文章碼云對(duì)應(yīng)源碼 |
003 | Spring Cloud 核心技術(shù) | 對(duì)Spring Cloud核心技術(shù)全面講解 |
004 | Spring Cloud 核心技術(shù)章節(jié)源碼 | Spring Cloud 核心技術(shù)簡(jiǎn)書每一篇文章對(duì)應(yīng)源碼 |
005 | QueryDSL 核心技術(shù) | 全面講解QueryDSL核心技術(shù)以及基于SpringBoot整合SpringDataJPA |
006 | SpringDataJPA 核心技術(shù) | 全面講解SpringDataJPA核心技術(shù) |
007 | SpringBoot核心技術(shù)學(xué)習(xí)目錄 | SpringBoot系統(tǒng)的學(xué)習(xí)目錄疙教,敬請(qǐng)關(guān)注點(diǎn)贊!伞租!! |
構(gòu)建項(xiàng)目
使用Idea
開發(fā)工具創(chuàng)建一個(gè)SpringBoot
的項(xiàng)目贞谓,添加相應(yīng)的依賴,pom.xml配置文件依賴內(nèi)容如下所示:
<dependencies>
<!--mongodb依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!--data rest依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--Lombok依賴-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
我們本章節(jié)的依賴比上一章多了一個(gè)spring-boot-starter-data-rest
葵诈,通過這個(gè)依賴我們可以自動(dòng)完成RestController
的依賴配置裸弦,不需要再手動(dòng)去創(chuàng)建控制器,因?yàn)槲覀兺ㄟ^一些簡(jiǎn)單的注解配置以及固定格式名稱規(guī)則的方法就可以完成控制器的實(shí)現(xiàn)作喘。
因?yàn)楸菊碌膬?nèi)容需要在上一章的基礎(chǔ)上編寫烁兰,所以我們直接把之前章節(jié)的相關(guān)的配置以及類都復(fù)制到本項(xiàng)目?jī)?nèi),復(fù)制的內(nèi)容有:
application.yml
徊都、Customer
沪斟、CustomerRepository
。(源碼位置:第五十一章源碼)
改造CustomerRepository
spring-boot-starter-data-rest
會(huì)自動(dòng)掃描添加@RepositoryRestResource
注解的接口暇矫,自動(dòng)將該接口映射為一系列
可通過rest
訪問的請(qǐng)求路徑主之,這里說到一系列,我們?cè)跍y(cè)試的時(shí)候會(huì)講到為什么說是一系列@罡2坜取!
房轿。
既然需要添加注解粤攒,那么我們就打開CustomerRepository
接口,對(duì)應(yīng)為它添加上如下注解內(nèi)容:
@RepositoryRestResource(collectionResourceRel = "customer", path = "customer")
public interface CustomerRepository extends MongoRepository<Customer, String> {
//....省略
}
注解內(nèi)需要提供兩個(gè)參數(shù)囱持,
collectionResourceRel
:該參數(shù)配置映射MongoDB
內(nèi)的Collection
名稱夯接。
path
:該參數(shù)配置映射完成rest
后訪問的路徑前綴。
運(yùn)行測(cè)試
我們先來簡(jiǎn)單的運(yùn)行測(cè)試下是否可以通過我們配置的path
路徑實(shí)現(xiàn)訪問內(nèi)容纷妆,啟動(dòng)項(xiàng)目時(shí)我們可以看到控制臺(tái)的輸出內(nèi)容:
Mapped "{[/{repository}/search],methods=[GET]
Mapped "{[/{repository}/search/{search}],methods=[GET]
Mapped "{[/{repository}/{id}/{property}],methods=[GET]
Mapped "{[/{repository}],methods=[GET]
....
我們配置一個(gè)@RepositoryRestResource
注解的接口就會(huì)根據(jù)rest
內(nèi)置的一系列的條件生成對(duì)應(yīng)的請(qǐng)求盔几,這也是我們?cè)谥罢f到的一系列
請(qǐng)求路徑的地方,我們先來訪問下映射/{repository}
的路徑掩幢。
測(cè)試 /{repository} 映射路徑
你如果使用
Windows
系統(tǒng)直接打開瀏覽器輸出地址就可以看到返回的內(nèi)容逊拍,如果你使用Linux
或者OS X
系統(tǒng)可以在Terminal
使用curl
命令查看返回內(nèi)容上鞠。
我們?cè)L問:http://localhost:8080/customer,路徑查看返回的內(nèi)容:
? ~ curl http://localhost:8080/customer
{
"_embedded" : {
"customer" : [ {
"firstName" : "恒宇",
"lastName" : "少年",
"_links" : {
"self" : {
"href" : "http://localhost:8080/customer/5adbec9ceb89f105acd90cec"
},
"customer" : {
"href" : "http://localhost:8080/customer/5adbec9ceb89f105acd90cec"
}
}
} ]
},
"_links" : {
"self" : {
"href" : "http://localhost:8080/customer{?page,size,sort}",
"templated" : true
},
"profile" : {
"href" : "http://localhost:8080/profile/customer"
}
},
"page" : {
"size" : 20,
"totalElements" : 1,
"totalPages" : 1,
"number" : 0
}
}
通過這個(gè)地址我們可以讀取出@RepositoryRestResource注解
配置的collectionResourceRel
對(duì)應(yīng)的 MongoDB.collection
集合內(nèi)的數(shù)據(jù)芯丧,我們發(fā)現(xiàn)不僅讀取出來了數(shù)據(jù)而且還為我們提供了分頁的信息
芍阎,這可是很貼心的地方啊,默認(rèn)讀取第1頁
缨恒,每頁20條
數(shù)據(jù)能曾。
測(cè)試 /{repository}/{id} 映射路徑
我們?cè)L問http://localhost:8080/customer/5adbec9ceb89f105acd90cec(注意:這里的id是你本地生成的,這個(gè)id是我本地生成肿轨,直接訪問會(huì)出現(xiàn)404)如下所示:
? ~ curl http://localhost:8080/customer/5adbec9ceb89f105acd90cec
{
"firstName" : "恒宇",
"lastName" : "少年",
"_links" : {
"self" : {
"href" : "http://localhost:8080/customer/5adbec9ceb89f105acd90cec"
},
"customer" : {
"href" : "http://localhost:8080/customer/5adbec9ceb89f105acd90cec"
}
}
}
根據(jù)返回的內(nèi)容看到是能夠訪問根據(jù)id
查詢的數(shù)據(jù)內(nèi)容的。
測(cè)試 /{repository}/search/{search} 映射路徑
這個(gè)映射的配置是專門為我們自定義方法準(zhǔn)備的蕊程,自定義方法的規(guī)則與SpringDataJPA
的方法名稱規(guī)則一樣椒袍,當(dāng)我們?cè)诮涌趧?chuàng)建findByXxx
方法時(shí)Idea
會(huì)自動(dòng)為我們提示相應(yīng)的內(nèi)容,下面我們就創(chuàng)建兩個(gè)不同的查詢方法藻茂,如下所示:
/**
* 更加名字查詢數(shù)據(jù)
*
* @param firstName 名字
* @return
*/
List<Customer> findByFirstName(@Param("firstName") String firstName);
/**
* 根據(jù)姓氏查詢出最靠前的一條數(shù)據(jù)
*
* @param lastName 姓氏
* @return
*/
Customer findTopByLastName(@Param("lastName") String lastName);
下面我們重啟下項(xiàng)目訪問路徑http://localhost:8080/customer/search/findByFirstName?firstName=恒宇可以看到返回內(nèi)容:
? ~ curl http://localhost:8080/customer/search/findByFirstName\?firstName\=%E6%81%92%E5%AE%87
{
"_embedded" : {
"customer" : [ {
"firstName" : "恒宇",
"lastName" : "少年",
"_links" : {
"self" : {
"href" : "http://localhost:8080/customer/5adbec9ceb89f105acd90cec"
},
"customer" : {
"href" : "http://localhost:8080/customer/5adbec9ceb89f105acd90cec"
}
}
} ]
},
"_links" : {
"self" : {
"href" : "http://localhost:8080/customer/search/findByFirstName?firstName=%E6%81%92%E5%AE%87"
}
}
}
自動(dòng)的根據(jù)我們的配置的方法查詢出了對(duì)應(yīng)的數(shù)據(jù)驹暑,自動(dòng)過濾了對(duì)應(yīng)的數(shù)據(jù),不過這個(gè)是沒有分頁的辨赐。
同樣另外一個(gè)自定義方法的請(qǐng)求http://localhost:8080/customer/search/findTopByLastName?lastName=少年优俘,也是一樣的可以對(duì)應(yīng)的獲取過濾后的數(shù)據(jù)。
注意:@Param注解內(nèi)的參數(shù)名稱要與
Customer
內(nèi)的屬性對(duì)應(yīng)掀序。
如果你想查看配置的全部自定義的方法帆焕,訪問:http://localhost:8080/customer/search,如下所示:
? ~ curl http://localhost:8080/customer/search
{
"_links" : {
"findByFirstName" : {
"href" : "http://localhost:8080/customer/search/findByFirstName{?firstName}",
"templated" : true
},
"findTopByLastName" : {
"href" : "http://localhost:8080/customer/search/findTopByLastName{?lastName}",
"templated" : true
},
"self" : {
"href" : "http://localhost:8080/customer/search"
}
}
}
總結(jié)
本章內(nèi)容主要是圍繞著spring-boot-starter-data-rest
這個(gè)依賴進(jìn)行的不恭,這個(gè)依賴幫助我們完成了日常編碼中一些重復(fù)的工作叶雹,而且很智能的提供了一些映射,更方便我們進(jìn)行查詢數(shù)據(jù)换吧。
本章源碼已經(jīng)上傳到碼云:
SpringBoot配套源碼地址:https://gitee.com/hengboy/spring-boot-chapter
SpringCloud配套源碼地址:https://gitee.com/hengboy/spring-cloud-chapter