Mongo Java Driver結(jié)合Morphia的使用

導(dǎo)入依賴

在pom文件中添加以下依賴织盼,其中mongo-java-driver提供了java操作mongoDB的基本API吆豹,而morphia則是在其之上封裝了Java對(duì)象和BSON對(duì)象的映射關(guān)系惋增。

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.2.1</version>
</dependency>

<dependency>
    <groupId>org.mongodb.morphia</groupId>
    <artifactId>morphia</artifactId>
    <version>1.0.1</version>
</dependency>

構(gòu)建Datastore對(duì)象

// mongo客戶端用于連接服務(wù)端的地址串
String mongoClientURIString = 
    "mongodb://192.168.0.100,192.168.14.101/?replicaSet=test&readPreference=nearest";
MongoClientURI mongoClientURI = new MongoClientURI(mongoClientURIString);
// 構(gòu)建出mongo客戶端對(duì)象
MongoClient mongoClient = new MongoClient(mongoClientURI);
Morphia morphia = new Morphia();
// 告訴morphia到哪個(gè)包下面去找實(shí)體類
morphia.mapPackage("com.elong.web.gcCollection.model");
// 構(gòu)建Datastore對(duì)象古胆,其中`gcLog`是數(shù)據(jù)庫(kù)名稱
Datastore datastore = morphia.createDatastore(mongoClient, "gcLog");
// 確保索引生效
datastore.ensureIndexes();

為實(shí)體加上注解

通常一個(gè)實(shí)體映射為mongo中的一個(gè)collection雹洗,我們通過(guò)注解的方式告訴morphia這個(gè)映射關(guān)系渐北。@Entity("gcLogItem")表示這個(gè)類對(duì)應(yīng)mongo中的名為gcLogItem的collection阿逃;@Id表示這個(gè)屬性對(duì)應(yīng)主鍵字段。

注解的其它用法參見這里

@Entity("gcLogItem")
public class BaseGcItem {
    @Id
    private String id;

    private String host;

    /**
     * other fields go here ...
     */

    /**
     * getters and setters methods go here ...
     */
}

通過(guò)Datastore對(duì)象操作mongoDB

構(gòu)建完Datastore對(duì)象以后就可以利用這個(gè)對(duì)象提供的API來(lái)操作mongoDB了恃锉。詳細(xì)用法搀菩,請(qǐng)看這里

下面這些例子展示了一些用法:

@Repository
public class GcLogItemDaoImpl implements GcLogItemDao {

    @Autowired
    private DbClient dbClient;

    @Override
    public String insert(BaseGcItem gcItem) {
        Datastore datastore = dbClient.getDatastore();
        return (String)datastore.save(gcItem).getId();
    }

    @Override
    public Iterator<Key<BaseGcItem>> insert(List<BaseGcItem> gcItemList) {
        Datastore datastore = dbClient.getDatastore();
        return datastore.save(gcItemList).iterator();
    }

    @Override
    public List<BaseGcItem> getAll() {
        Query<BaseGcItem> query = dbClient.getDatastore()
            .createQuery(BaseGcItem.class);
        return query.asList();
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<String> getDistinctHost() {
        DBCollection dbCollection = dbClient.getDatastore()
            .getCollection(BaseGcItem.class);
        return (List<String>)dbCollection.distinct("host");
    }

    @Override
    public List<BaseGcItem> getByHost(String host) {
        Query<BaseGcItem> query = dbClient.getDatastore()
            .createQuery(BaseGcItem.class)
            .field("host").equal(host)
            .order("-timestampOfGc");
        return query.asList();
    }


    @Override
    public List<BaseGcItem> getByGcItemType(GcItemType gcItemType) {
        Query<BaseGcItem> query = dbClient.getDatastore()
            .createQuery(BaseGcItem.class)
            .field("gcItemType").equal(gcItemType)
            .order("-timestampOfGc");
        return query.asList();
    }

    @Override
    public int removeByDateRange(Date startDate, Date endDate) {
        Datastore datastore = dbClient.getDatastore();
        Query<BaseGcItem> query = datastore
            .createQuery(BaseGcItem.class)
            .field("timestampOfGc").greaterThanOrEq(startDate)
            .field("timestampOfGc").lessThan(endDate);
        return datastore.delete(query).getN();
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末破托,一起剝皮案震驚了整個(gè)濱河市肪跋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌土砂,老刑警劉巖州既,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異萝映,居然都是意外死亡易桃,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門锌俱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)晤郑,“玉大人,你說(shuō)我怎么就攤上這事贸宏≡烨蓿” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵吭练,是天一觀的道長(zhǎng)诫龙。 經(jīng)常有香客問(wèn)我,道長(zhǎng)鲫咽,這世上最難降的妖魔是什么签赃? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮分尸,結(jié)果婚禮上锦聊,老公的妹妹穿的比我還像新娘。我一直安慰自己箩绍,他們只是感情好孔庭,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著材蛛,像睡著了一般圆到。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卑吭,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天芽淡,我揣著相機(jī)與錄音,去河邊找鬼豆赏。 笑死挣菲,一個(gè)胖子當(dāng)著我的面吹牛富稻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播己单,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼耙饰!你這毒婦竟也來(lái)了纹笼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤苟跪,失蹤者是張志新(化名)和其女友劉穎廷痘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體件已,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笋额,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了篷扩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兄猩。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鉴未,靈堂內(nèi)的尸體忽然破棺而出枢冤,到底是詐尸還是另有隱情,我是刑警寧澤铜秆,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布淹真,位于F島的核電站,受9級(jí)特大地震影響连茧,放射性物質(zhì)發(fā)生泄漏核蘸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一啸驯、第九天 我趴在偏房一處隱蔽的房頂上張望客扎。 院中可真熱鬧,春花似錦罚斗、人聲如沸虐唠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疆偿。三九已至,卻和暖如春搓幌,著一層夾襖步出監(jiān)牢的瞬間杆故,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工溉愁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留处铛,地道東北人饲趋。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像撤蟆,于是被迫代替她去往敵國(guó)和親奕塑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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