Spring Boot 中使用 MongoDB 增刪改查

本文快速入門,MongoDB 結(jié)合SpringBoot starter-data-mongodb 進(jìn)行增刪改查床蜘。

1粹胯、什么是MongoDB ?

MongoDB 是由C++語言編寫的,是一個(gè)基于分布式文件存儲(chǔ)的開源數(shù)據(jù)庫系統(tǒng)。
在高負(fù)載的情況下,添加更多的節(jié)點(diǎn),可以保證服務(wù)器性能福贞。
MongoDB 旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。
MongoDB 將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔停士,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對(duì)組成挖帘。
MongoDB 文檔類似于 JSON 對(duì)象。字段值可以包含其他文檔恋技,數(shù)組及文檔數(shù)組拇舀。

2、MongoDB 優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  • 文檔結(jié)構(gòu)的存儲(chǔ)方式猖任,能夠更便捷的獲取數(shù)據(jù)
  • 內(nèi)置GridFS你稚,支持大容量的存儲(chǔ)
  • 海量數(shù)據(jù)下,性能優(yōu)越
  • 動(dòng)態(tài)查詢
  • 全索引支持,擴(kuò)展到內(nèi)部對(duì)象和內(nèi)嵌數(shù)組
  • 查詢記錄分析
  • 快速,就地更新
  • 高效存儲(chǔ)二進(jìn)制大對(duì)象 (比如照片和視頻)
  • 復(fù)制(復(fù)制集)和支持自動(dòng)故障恢復(fù)
  • 內(nèi)置 Auto- Sharding 自動(dòng)分片支持云級(jí)擴(kuò)展性,分片簡單
  • MapReduce 支持復(fù)雜聚合
  • 商業(yè)支持,培訓(xùn)和咨詢

缺點(diǎn)

  • 不支持事務(wù)操作
  • MongoDB 占用空間過大 (不過這個(gè)確定對(duì)于目前快速下跌的硬盤價(jià)格來說刁赖,也不算什么缺點(diǎn)了)
  • MongoDB沒有如MySQL那樣成熟的維護(hù)工具
  • 無法進(jìn)行關(guān)聯(lián)表查詢搁痛,不適用于關(guān)系多的數(shù)據(jù)
  • 復(fù)雜聚合操作通過mapreduce創(chuàng)建,速度慢
  • 模式自由,自由靈活的文件存儲(chǔ)格式帶來的數(shù)據(jù)錯(cuò)
  • MongoDB 在你刪除記錄后不會(huì)在文件系統(tǒng)回收空間宇弛。除非你刪掉數(shù)據(jù)庫鸡典。但是空間沒有被浪費(fèi)

3、優(yōu)缺點(diǎn)詳細(xì)解釋

1.內(nèi)置GridFS枪芒,支持大容量的存儲(chǔ):

GridFS是一個(gè)出色的分布式文件系統(tǒng)彻况,可以支持海量的數(shù)據(jù)存儲(chǔ)。
內(nèi)置了GridFS了MongoDB舅踪,能夠滿足對(duì)大數(shù)據(jù)集的快速范圍查詢纽甘。

2.內(nèi)置 Auto- Sharding 自動(dòng)分片支持云級(jí)擴(kuò)展性,分片簡單
提供基于Range的Auto Sharding機(jī)制:
一個(gè)collection可按照記錄的范圍抽碌,分成若干個(gè)段悍赢,切分到不同的Shard上。
Shards可以和復(fù)制結(jié)合货徙,配合Replica sets能夠?qū)崿F(xiàn)Sharding+fail-over左权,不同的Shard之間可以負(fù)載均衡。
查詢是對(duì)客戶端是透明的痴颊∩统伲客戶端執(zhí)行查詢,統(tǒng)計(jì)蠢棱,MapReduce等操作锌杀,這些會(huì)被MongoDB自動(dòng)路由到后端的數(shù)據(jù)節(jié)點(diǎn)。
這讓我們關(guān)注于自己的業(yè)務(wù)裳扯,適當(dāng)?shù)?時(shí)候可以無痛的升級(jí)抛丽。MongoDB的Sharding設(shè)計(jì)能力最大可支持約20 petabytes谤职,足以支撐一般應(yīng)用饰豺。
這可以保證MongoDB運(yùn)行在便宜的PC服務(wù)器集群上。PC集群擴(kuò)充起來非常方便并且成本很低允蜈,避免了“sharding”操作的復(fù)雜性和成本冤吨。

3.海量數(shù)據(jù)下,性能優(yōu)越:

在使用場(chǎng)合下饶套,千萬級(jí)別的文檔對(duì)象漩蟆,近10G的數(shù)據(jù),對(duì)有索引的ID的查詢不會(huì)比mysql慢妓蛮,而對(duì)非索引字段的查詢怠李,則是全面勝出。 mysql實(shí)際無法勝任大數(shù)據(jù)量下任意字段的查詢,而mongodb的查詢性能實(shí)在讓我驚訝捺癞。寫入性能同樣很令人滿意夷蚊,同樣寫入百萬級(jí)別的數(shù) 據(jù),mongodb比我以前試用過的couchdb要快得多髓介,基本10分鐘以下可以解決惕鼓。補(bǔ)上一句,觀察過程中mongodb都遠(yuǎn)算不上是CPU殺手唐础。

4.全索引支持,擴(kuò)展到內(nèi)部對(duì)象和內(nèi)嵌數(shù)組

索引通常能夠極大的提高查詢的效率箱歧,如果沒有索引,MongoDB在讀取數(shù)據(jù)時(shí)必須掃描集合中的每個(gè)文件并選取那些符合查詢條件的記錄一膨。

這種掃描全集合的查詢效率是非常低的呀邢,特別在處理大量的數(shù)據(jù)時(shí),查詢可以要花費(fèi)幾十秒甚至幾分鐘豹绪,這對(duì)網(wǎng)站的性能是非常致命的驼鹅。

索引是特殊的數(shù)據(jù)結(jié)構(gòu),索引存儲(chǔ)在一個(gè)易于遍歷讀取的數(shù)據(jù)集合中森篷,索引是對(duì)數(shù)據(jù)庫表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)输钩。

5.MapReduce 支持復(fù)雜聚合
MongoDB中聚合(aggregate)主要用于處理數(shù)據(jù)(諸如統(tǒng)計(jì)平均值,求和等),并返回計(jì)算后的數(shù)據(jù)結(jié)果仲智。有點(diǎn)類似sql語句中的 count(*)买乃。

與關(guān)系型數(shù)據(jù)庫相比,MongoDB的缺點(diǎn):
mongodb不支持事務(wù)操作:
所以事務(wù)要求嚴(yán)格的系統(tǒng)(如果銀行系統(tǒng))肯定不能用它钓辆。
mongodb不支持事務(wù)操作:
所以事務(wù)要求嚴(yán)格的系統(tǒng)(如果銀行系統(tǒng))肯定不能用它剪验。
mongodb占用空間過大:
關(guān)于其原因,在官方的FAQ中前联,提到有如下幾個(gè)方面:
1功戚、空間的預(yù)分配:為避免形成過多的硬盤碎片,mongodb每次空間不足時(shí)都會(huì)申請(qǐng)生成一大塊的硬盤空間似嗤,而且申請(qǐng)的量從64M啸臀、128M、256M那 樣的指數(shù)遞增烁落,直到2G為單個(gè)文件的最大體積乘粒。隨著數(shù)據(jù)量的增加,你可以在其數(shù)據(jù)目錄里看到這些整塊生成容量不斷遞增的文件伤塌。
2灯萍、字段名所占用的空間:為了保持每個(gè)記錄內(nèi)的結(jié)構(gòu)信息用于查詢,mongodb需要把每個(gè)字段的key-value都以BSON的形式存儲(chǔ)每聪,如果 value域相對(duì)于key域并不大旦棉,比如存放數(shù)值型的數(shù)據(jù)齿风,則數(shù)據(jù)的overhead是最大的。一種減少空間占用的方法是把字段名盡量取短一些绑洛,這樣占用 空間就小了聂宾,但這就要求在易讀性與空間占用上作為權(quán)衡了。
3诊笤、刪除記錄不釋放空間:這很容易理解系谐,為避免記錄刪除后的數(shù)據(jù)的大規(guī)模挪動(dòng),原記錄空間不刪除讨跟,只標(biāo)記“已刪除”即可纪他,以后還可以重復(fù)利用。
4晾匠、可以定期運(yùn)行db.repairDatabase()來整理記錄茶袒,但這個(gè)過程會(huì)比較緩慢
MongoDB沒有如MySQL那樣成熟的維護(hù)工具,這對(duì)于開發(fā)和IT運(yùn)營都是個(gè)值得注意的地方凉馆。

4薪寓、環(huán)境需要

64位操作系統(tǒng),建議使用Linux / Unix /

  • CentOs 7.3
  • MongoDB 4.4.0

5澜共、環(huán)境安裝

https://www.runoob.com/mongodb/mongodb-linux-install.html

6向叉、啟動(dòng)和停止

cd /usr/local/mongodb4/bin/

mongodb數(shù)據(jù)庫啟動(dòng)后,默認(rèn)只能在本地使用嗦董,端口為27017母谎,是不能遠(yuǎn)程連接的,而且在linux安裝完你會(huì)發(fā)現(xiàn),它的目錄極其簡單,連個(gè)配置文件都沒有京革。
通過加--bind_ip=0.0.0.0允許Springboot遠(yuǎn)程訪問奇唤,如果使用云服務(wù)器要先開通端口27017的入方向安全組策略。

接下來啟動(dòng) Mongodb 服務(wù):
./mongod --bind_ip=0.0.0.0 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
如果要停止 mongodb 可以使用以下命令:
./mongod --bind_ip=0.0.0.0 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --shutdown

MongoDB是一個(gè)開源NoSQL文檔數(shù)據(jù)庫匹摇,它使用類似JSON的模式而不是傳統(tǒng)的基于表格的關(guān)系數(shù)據(jù)咬扇。Spring Boot為MongoDB提供了一些便利,包括 spring-boot-starter-data-mongodb 的“Starter”廊勃。

7懈贺、快速開始添加依賴

在POM 中添加如下依賴

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

或者使用IDEA創(chuàng)建Module時(shí)候使用Spring Data MongoDB。如下圖:

IDEA中新建項(xiàng)目

8供搀、配置文件

多個(gè)IP集群配置隅居,在配置文件 application.properties 添加如下配置

spring.application.name=spring-boot-mongodb
# mongodb
spring.data.mongodb.uri=mongodb://192.168.252.121:20000,192.168.252.122:20000,192.168.252.12:20000/demo

使用用戶名密碼:

spring.data.mongodb.uri=mongodb://user:secret@mongo1.example.com:12345,mongo2.example.com:23456/test

9钠至、DemoEntity

spring-data-mongodb中的實(shí)體映射是通過MongoMappingConverter這個(gè)類實(shí)現(xiàn)的葛虐。它可以通過注釋把java類轉(zhuǎn)換為mongodb的文檔。

它有以下幾種注釋:

@Id - 文檔的唯一標(biāo)識(shí)棉钧,在mongodb中為ObjectId屿脐,它是唯一的,通過時(shí)間戳+機(jī)器標(biāo)識(shí)+進(jìn)程ID+自增計(jì)數(shù)器(確保同一秒內(nèi)產(chǎn)生的Id不會(huì)沖突)構(gòu)成。

@Document - 把一個(gè)java類聲明為mongodb的文檔的诵,可以通過collection參數(shù)指定這個(gè)類對(duì)應(yīng)的文檔万栅。@Document(collection=“mongodb”) ,mongodb對(duì)應(yīng)表

@DBRef - 聲明類似于關(guān)系數(shù)據(jù)庫的關(guān)聯(lián)關(guān)系西疤。ps:暫不支持級(jí)聯(lián)的保存功能烦粒,當(dāng)你在本實(shí)例中修改了DERef對(duì)象里面的值時(shí),單獨(dú)保存本實(shí)例并不能保存DERef引用的對(duì)象代赁,它要另外保存扰她,如下面例子的Person和Account。

@Indexed - 聲明該字段需要索引芭碍,建索引可以大大的提高查詢效率徒役。

@CompoundIndex - 復(fù)合索引的聲明,建復(fù)合索引可以有效地提高多字段的查詢效率窖壕。

@GeoSpatialIndexed - 聲明該字段為地理信息的索引忧勿。

@Transient - 映射忽略的字段,該字段不會(huì)保存到mongodb瞻讽。

@PersistenceConstructor - 聲明構(gòu)造函數(shù)鸳吸,作用是把從數(shù)據(jù)庫取出的數(shù)據(jù)實(shí)例化為對(duì)象。該構(gòu)造函數(shù)傳入的值為從DBObject中取出的數(shù)據(jù)

package com.erbadagang.springboot.mongodb.entity;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import java.io.Serializable;

/**
 * @description 實(shí)體類對(duì)應(yīng)MongoDB的Document即對(duì)應(yīng)表速勇。
 * @ClassName: ErbadagangEntity
 * @author: 郭秀志 jbcode@126.com
 * @date: 2020/8/8 18:05
 * @Copyright:
 */
@Data
@Document(collection = "erbadagang_db")
public class ErbadagangEntity implements Serializable {

    @Id
    private Long id;

    private String title;

    private String description;

    private String by;

    private String url;

}

10层释、Demo DAO 接口

提供增刪改查 MongoDB 接口

package com.erbadagang.springboot.mongodb.dao;

import com.erbadagang.springboot.mongodb.entity.ErbadagangEntity;

/**
 * @description 操作數(shù)據(jù)庫的接口。
 * @ClassName: IErbadagangDao
 * @author: 郭秀志 jbcode@126.com
 * @date: 2020/8/8 17:02
 * @Copyright:
 */
public interface IErbadagangDao {

    void saveDemo(ErbadagangEntity erbadagangEntity);

    void removeDemo(Long id);

    void updateDemo(ErbadagangEntity erbadagangEntity);

    ErbadagangEntity findDemoById(Long id);
}

11快集、Demo DAO 實(shí)現(xiàn)

提供增刪改查 MongoDB 接口實(shí)現(xiàn)

Spring Data Mongo提供了一個(gè) MongoTemplate類似于Spring的設(shè)計(jì)的類JdbcTemplate贡羔。和JdbcTemplateSpring Boot一樣,自動(dòng)配置一個(gè)bean來簡單地注入:

package com.erbadagang.springboot.mongodb.dao.impl;

import com.erbadagang.springboot.mongodb.dao.IErbadagangDao;
import com.erbadagang.springboot.mongodb.entity.ErbadagangEntity;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;

/**
 * @description 操作數(shù)據(jù)庫的dao實(shí)現(xiàn)類个初。使用了MongoTemplate乖寒。
 * @ClassName: ErbadagangDaoImpl
 * @author: 郭秀志 jbcode@126.com
 * @date: 2020/8/8 17:06
 * @Copyright:
 */
@Repository
public class ErbadagangDaoImpl implements IErbadagangDao {

    @Resource
    private MongoTemplate mongoTemplate;

    @Override
    public void saveDemo(ErbadagangEntity erbadagangEntity) {
        mongoTemplate.save(erbadagangEntity);
    }

    @Override
    public void removeDemo(Long id) {
        mongoTemplate.remove(id);
    }

    @Override
    public void updateDemo(ErbadagangEntity erbadagangEntity) {
        Query query = new Query(Criteria.where("id").is(erbadagangEntity.getId()));

        Update update = new Update();
        update.set("title", erbadagangEntity.getTitle());
        update.set("description", erbadagangEntity.getDescription());
        update.set("by", erbadagangEntity.getBy());
        update.set("url", erbadagangEntity.getUrl());

        mongoTemplate.updateFirst(query, update, ErbadagangEntity.class);
    }

    @Override
    public ErbadagangEntity findDemoById(Long id) {
        Query query = new Query(Criteria.where("id").is(id));
        ErbadagangEntity erbadagangEntity = mongoTemplate.findOne(query, ErbadagangEntity.class);
        return erbadagangEntity;
    }

}

12、啟動(dòng)服務(wù)

運(yùn)行啟動(dòng)類

package com.erbadagang.springboot.mongodb;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @description 啟動(dòng)類院溺。
 * @ClassName: MongodbApplication
 * @author: 郭秀志 jbcode@126.com
 * @date: 2020/8/8 17:09
 * @Copyright:
 */
@SpringBootApplication
public class MongodbApplication {

    public static void main(String[] args) {
        SpringApplication.run(MongodbApplication.class, args);
    }

}

13楣嘁、單元測(cè)試

單元測(cè)試,提供mongodbdemo 庫的 demo_collection 集合的增刪改查

package com.erbadagang.springboot.mongodb;

import com.erbadagang.springboot.mongodb.dao.IErbadagangDao;
import com.erbadagang.springboot.mongodb.entity.ErbadagangEntity;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * @description 測(cè)試類珍逸。
 * @ClassName: MongodbApplicationTests
 * @author: 郭秀志 jbcode@126.com
 * @date: 2020/8/8 18:08
 * @Copyright:
 */
@SpringBootTest
class MongodbApplicationTests {

    @Autowired
    private IErbadagangDao demoDao;

    @Test
    public void saveDemoTest() {
        ErbadagangEntity erbadagangEntity = new ErbadagangEntity();
        erbadagangEntity.setId(1L);
        erbadagangEntity.setTitle("Spring Boot 中使用 MongoDB");
        erbadagangEntity.setDescription("關(guān)注公眾號(hào)逐虚,搜云庫,專注于開發(fā)技術(shù)的研究與知識(shí)分享");
        erbadagangEntity.setBy("souyunku");
        erbadagangEntity.setUrl("http://www.souyunku.com");

        demoDao.saveDemo(erbadagangEntity);

        erbadagangEntity = new ErbadagangEntity();
        erbadagangEntity.setId(2L);
        erbadagangEntity.setTitle("Spring Boot 中使用 MongoDB");
        erbadagangEntity.setDescription("關(guān)注公眾號(hào)谆膳,搜云庫叭爱,專注于開發(fā)技術(shù)的研究與知識(shí)分享");
        erbadagangEntity.setBy("souyunku");
        erbadagangEntity.setUrl("http://www.souyunku.com");

        demoDao.saveDemo(erbadagangEntity);
    }

    @Test
    public void removeDemoTest() {
        demoDao.removeDemo(2L);
    }

    @Test
    public void updateDemoTest() {

        ErbadagangEntity erbadagangEntity = new ErbadagangEntity();
        erbadagangEntity.setId(1L);
        erbadagangEntity.setTitle("Spring Boot 中使用 MongoDB 更新數(shù)據(jù)");
        erbadagangEntity.setDescription("關(guān)注公眾號(hào),搜云庫漱病,專注于開發(fā)技術(shù)的研究與知識(shí)分享");
        erbadagangEntity.setBy("souyunku");
        erbadagangEntity.setUrl("http://www.souyunku.com");

        demoDao.updateDemo(erbadagangEntity);
    }

    @Test
    public void findDemoByIdTest() {
        ErbadagangEntity erbadagangEntity = demoDao.findDemoById(1L);
        System.out.println(erbadagangEntity);
    }
}

可以運(yùn)行測(cè)試類买雾,查看效果把曼。

底線


本文源代碼使用 Apache License 2.0開源許可協(xié)議,這里是本文源碼Gitee地址漓穿,可通過命令git clone+地址下載代碼到本地嗤军,也可直接點(diǎn)擊鏈接通過瀏覽器方式查看源代碼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晃危,一起剝皮案震驚了整個(gè)濱河市叙赚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌僚饭,老刑警劉巖纠俭,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異浪慌,居然都是意外死亡冤荆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門权纤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钓简,“玉大人,你說我怎么就攤上這事汹想⊥獾耍” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵古掏,是天一觀的道長损话。 經(jīng)常有香客問我,道長槽唾,這世上最難降的妖魔是什么丧枪? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮庞萍,結(jié)果婚禮上拧烦,老公的妹妹穿的比我還像新娘。我一直安慰自己钝计,他們只是感情好恋博,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著私恬,像睡著了一般债沮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上本鸣,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天疫衩,我揣著相機(jī)與錄音,去河邊找鬼永高。 笑死隧土,一個(gè)胖子當(dāng)著我的面吹牛提针,可吹牛的內(nèi)容都是我干的命爬。 我是一名探鬼主播曹傀,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼饲宛!你這毒婦竟也來了皆愉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤艇抠,失蹤者是張志新(化名)和其女友劉穎幕庐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體家淤,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡异剥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了絮重。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冤寿。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖青伤,靈堂內(nèi)的尸體忽然破棺而出督怜,到底是詐尸還是另有隱情,我是刑警寧澤狠角,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布号杠,位于F島的核電站,受9級(jí)特大地震影響丰歌,放射性物質(zhì)發(fā)生泄漏姨蟋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一立帖、第九天 我趴在偏房一處隱蔽的房頂上張望芬探。 院中可真熱鬧,春花似錦厘惦、人聲如沸偷仿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酝静。三九已至,卻和暖如春羡玛,著一層夾襖步出監(jiān)牢的瞬間别智,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國打工稼稿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留薄榛,地道東北人讳窟。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像敞恋,于是被迫代替她去往敵國和親丽啡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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