第五十二章:基于SpringBoot2使用Rest訪問MongoDB數(shù)據(jù)

在之前項(xiàng)目中我們想要讀取MongoDB內(nèi)的內(nèi)容需要使用MongoDBTemplate來完成數(shù)據(jù)的CRUD齿诞,那如果我們想要通過RestController的形式獲取MongoDB內(nèi)的數(shù)據(jù)就更麻煩了麻裳,還需要自行去創(chuàng)建對(duì)應(yīng)的控制器,然后使用MongoDBTemplateMongoDB內(nèi)讀取出數(shù)據(jù)后返回給前端涨椒。

在上一章節(jié)第五十一章:基于SpringBoot2 & MongoDB完成自動(dòng)化集成我們講到了SpringBoot2MongoDB集成后怎么簡(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ù)获三,省去一系列繁瑣的操作步驟。

為你推薦

  1. 第五十一章:基于SpringBoot2 & MongoDB完成自動(dòng)化集成
  2. 第五十章:SpringBoot2.0新特性 - 豈止至今最簡(jiǎn)單redis緩存集成
  3. 第四十九章:SpringBoot2.0新特性 - 你get到WebMvcConfigurer兩種配置方式了嗎锨苏?
  4. 第四十八章:SpringBoot2.0新特性 - RabbitMQ信任package設(shè)置
  5. 第四十七章: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

作者個(gè)人 博客
使用開源框架 ApiBoot 助你成為Api接口服務(wù)架構(gòu)師

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末折晦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子沾瓦,更是在濱河造成了極大的恐慌满着,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贯莺,死亡現(xiàn)場(chǎng)離奇詭異风喇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)缕探,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門响驴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人撕蔼,你說我怎么就攤上這事豁鲤』嗵埽” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵琳骡,是天一觀的道長锅论。 經(jīng)常有香客問我,道長楣号,這世上最難降的妖魔是什么最易? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮炫狱,結(jié)果婚禮上藻懒,老公的妹妹穿的比我還像新娘。我一直安慰自己视译,他們只是感情好嬉荆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著酷含,像睡著了一般鄙早。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上椅亚,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天限番,我揣著相機(jī)與錄音,去河邊找鬼呀舔。 笑死弥虐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的媚赖。 我是一名探鬼主播躯舔,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼省古!你這毒婦竟也來了粥庄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤豺妓,失蹤者是張志新(化名)和其女友劉穎惜互,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琳拭,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡训堆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了白嘁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坑鱼。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鲁沥,到底是詐尸還是另有隱情呼股,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布画恰,位于F島的核電站彭谁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏允扇。R本人自食惡果不足惜缠局,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望考润。 院中可真熱鬧狭园,春花似錦、人聲如沸糊治。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俊戳。三九已至,卻和暖如春馆匿,著一層夾襖步出監(jiān)牢的瞬間抑胎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國打工渐北, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阿逃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓赃蛛,卻偏偏與公主長得像恃锉,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子呕臂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理破托,服務(wù)發(fā)現(xiàn),斷路器歧蒋,智...
    卡卡羅2017閱讀 134,638評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,778評(píng)論 6 342
  • spring官方文檔:http://docs.spring.io/spring/docs/current/spri...
    牛馬風(fēng)情閱讀 1,653評(píng)論 0 3
  • 馬蘭: 見字如面谜洽。 丫頭萝映,這個(gè)深夜,我又一次拿起筆阐虚,開始笨拙地給你寫第二封信了序臂。 告訴你一個(gè)好消息先,不過实束,你可不...
    孤鄰閱讀 215評(píng)論 0 0