SpringBoot框架(17):使用MongoDB數(shù)據(jù)庫

前段時間分享了關于Spring Boot中使用Redis的文章,除了Redis之后,我們在互聯(lián)網產品中還經常會用到另外一款著名的NoSQL數(shù)據(jù)庫MongoDB挽荠。

下面就來簡單介紹一下MongoDB,并且通過一個例子來介紹Spring Boot中對MongoDB訪問的配置和使用。

MongoDB簡介

MongoDB是一個基于分布式文件存儲的數(shù)據(jù)庫内狗,它是一個介于關系數(shù)據(jù)庫和非關系數(shù)據(jù)庫之間的產品,其主要目標是在鍵/值存儲方式(提供了高性能和高度伸縮性)和傳統(tǒng)的RDBMS系統(tǒng)(具有豐富的功能)之間架起一座橋梁义锥,它集兩者的優(yōu)勢于一身柳沙。

MongoDB支持的數(shù)據(jù)結構非常松散,是類似json的bson格式缨该,因此可以存儲比較復雜的數(shù)據(jù)類型偎行,也因為他的存儲格式也使得它所存儲的數(shù)據(jù)在Nodejs程序應用中使用非常流暢。

既然稱為NoSQL數(shù)據(jù)庫,Mongo的查詢語言非常強大蛤袒,其語法有點類似于面向對象的查詢語言熄云,幾乎可以實現(xiàn)類似關系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引妙真。

但是缴允,MongoDB也不是萬能的,同MySQL等關系型數(shù)據(jù)庫相比珍德,它們在針對不同的數(shù)據(jù)類型和事務要求上都存在自己獨特的優(yōu)勢练般。在數(shù)據(jù)存儲的選擇中,堅持多樣化原則锈候,選擇更好更經濟的方式薄料,而不是自上而下的統(tǒng)一化。

較常見的泵琳,我們可以直接用MongoDB來存儲鍵值對類型的數(shù)據(jù)摄职,如:驗證碼、Session等获列;由于MongoDB的橫向擴展能力谷市,也可以用來存儲數(shù)據(jù)規(guī)模會在未來變的非常巨大的數(shù)據(jù),如:日志击孩、評論等迫悠;由于MongoDB存儲數(shù)據(jù)的弱類型,也可以用來存儲一些多變json數(shù)據(jù)巩梢,如:與外系統(tǒng)交互時經常變化的JSON報文创泄。而對于一些對數(shù)據(jù)有復雜的高事務性要求的操作,如:賬戶交易等就不適合使用MongoDB來存儲且改。

MongoDB官網

訪問MongoDB

在Spring Boot中验烧,對如此受歡迎的MongoDB,同樣提供了自配置功能又跛。

引入依賴

Spring Boot中可以通過在pom.xml中加入spring-boot-starter-data-mongodb引入對mongodb的訪問支持依賴碍拆。它的實現(xiàn)依賴spring-data-mongodb。是的慨蓝,您沒有看錯感混,又是spring-data的子項目,之前介紹過spring-data-jpa礼烈、spring-data-redis弧满,對于mongodb的訪問,spring-data也提供了強大的支持此熬,下面就開始動手試試吧庭呜。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

快速開始使用Spring-data-mongodb

若MongoDB的安裝配置采用默認端口滑进,那么在自動配置的情況下,我們不需要做任何參數(shù)配置募谎,就能馬上連接上本地的MongoDB扶关。下面直接使用spring-data-mongodb來嘗試對mongodb的存取操作。(記得mongod啟動您的mongodb)

創(chuàng)建要存儲的User實體数冬,包含屬性:id节槐、username、age

public class User {

    @Id
    private Long id;

    private String username;
    private Integer age;

    public User(Long id, String username, Integer age) {
        this.id = id;
        this.username = username;
        this.age = age;
    }

    // 省略getter和setter

}
  • 實現(xiàn)User的數(shù)據(jù)訪問對象:UserRepository
public interface UserRepository extends MongoRepository<User, Long> {

    User findByUsername(String username);
}
  • 在單元測試中調用
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class ApplicationTests {

    @Autowired
    private UserRepository userRepository;

    @Before
    public void setUp() {
        userRepository.deleteAll();
    }

    @Test
    public void test() throws Exception {

        // 創(chuàng)建三個User拐纱,并驗證User總數(shù)
        userRepository.save(new User(1L, "didi", 30));
        userRepository.save(new User(2L, "mama", 40));
        userRepository.save(new User(3L, "kaka", 50));
        Assert.assertEquals(3, userRepository.findAll().size());

        // 刪除一個User铜异,再驗證User總數(shù)
        User u = userRepository.findOne(1L);
        userRepository.delete(u);
        Assert.assertEquals(2, userRepository.findAll().size());

        // 刪除一個User,再驗證User總數(shù)
        u = userRepository.findByUsername("mama");
        userRepository.delete(u);
        Assert.assertEquals(1, userRepository.findAll().size());

    }
}

參數(shù)配置

通過上面的例子秸架,我們可以輕而易舉的對MongoDB進行訪問揍庄,但是實戰(zhàn)中,應用服務器與MongoDB通常不會部署于同一臺設備之上咕宿,這樣就無法使用自動化的本地配置來進行使用币绩。這個時候,我們也可以方便的配置來完成支持府阀,只需要在application.properties中加入mongodb服務端的相關配置,具體示例如下:

spring.data.mongodb.uri=mongodb://name:pass@localhost:27017/test

在嘗試此配置時芽突,記得在mongo中對test庫創(chuàng)建具備讀寫權限的用戶(用戶名為name试浙,密碼為pass),不同版本的用戶創(chuàng)建語句不同寞蚌,注意查看文檔做好準備工作

若使用mongodb 2.x田巴,也可以通過如下參數(shù)配置,該方式不支持mongodb 3.x挟秤。

spring.data.mongodb.host=localhost spring.data.mongodb.port=27017
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末壹哺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子艘刚,更是在濱河造成了極大的恐慌管宵,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件攀甚,死亡現(xiàn)場離奇詭異箩朴,居然都是意外死亡,警方通過查閱死者的電腦和手機秋度,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門炸庞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荚斯,你說我怎么就攤上這事埠居〔榕疲” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵滥壕,是天一觀的道長僧免。 經常有香客問我,道長捏浊,這世上最難降的妖魔是什么懂衩? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮金踪,結果婚禮上浊洞,老公的妹妹穿的比我還像新娘。我一直安慰自己胡岔,他們只是感情好法希,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著靶瘸,像睡著了一般苫亦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上怨咪,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天屋剑,我揣著相機與錄音,去河邊找鬼诗眨。 笑死唉匾,一個胖子當著我的面吹牛,可吹牛的內容都是我干的匠楚。 我是一名探鬼主播巍膘,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼芋簿!你這毒婦竟也來了峡懈?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤与斤,失蹤者是張志新(化名)和其女友劉穎肪康,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幽告,經...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡梅鹦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了冗锁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片齐唆。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖冻河,靈堂內的尸體忽然破棺而出箍邮,到底是詐尸還是另有隱情茉帅,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布锭弊,位于F島的核電站堪澎,受9級特大地震影響,放射性物質發(fā)生泄漏味滞。R本人自食惡果不足惜樱蛤,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望剑鞍。 院中可真熱鬧昨凡,春花似錦、人聲如沸蚁署。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽光戈。三九已至哪痰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間久妆,已是汗流浹背晌杰。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留镇饺,地道東北人乎莉。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像奸笤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哼鬓,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內容