MongoDB初體驗-Spring整合MongoDB

上一篇分享了MongoDB的配置文件魁淳,現(xiàn)在準(zhǔn)備正式在已有項目中使用,完成那個公告配置的需求。

整合Spring和MongoDB需要兩個jar包:
1.mongodb官方j(luò)dbc驅(qū)動 mongo-java-driver
2.spring基于mongo-java-driver的連接池管理和ORM的中間件 spring-data-mongodb

因為公司項目的架構(gòu)所用的技術(shù)比較舊,spring還是3.1.2版本的屎鳍。看了下截止目前能夠支持的最高的spring-data-mongodb版本只有1.3.5了问裕,而我的mongodb是3.2版本的逮壁,所以能夠兼容的最高的mongo-java-driver只有2.14.2。

下面是maven的pom.xml引入的這兩個包的依賴:
spring-data-mongodb
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-mongodb</artifactId>
    <version>1.3.5.RELEASE</version>
</dependency>
mongo-java-driver
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>2.14.2</version>
</dependency>
Spring配置中添加對應(yīng)的依賴注入:
applicationContext.xml

xml標(biāo)簽引用

<beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:context="http://www.springframework.org/schema/context"
          xmlns:mongo="http://www.springframework.org/schema/data/mongo"
          xsi:schemaLocation=
          "http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-3.0.xsd
          http://www.springframework.org/schema/data/mongo
          http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
          http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

MonggoDb連接池依賴注入配置(相關(guān)配置具體含義請參考底部引用的官方文檔)

    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:mongo.properties</value>
            </list>
        </property>
    </bean>
    <!--連接池配置-->
    <mongo:mongo host="${mongo.host}" port="${mongo.port}">
        <mongo:options connections-per-host="${mongo.options.connections-per-host}"
                       threads-allowed-to-block-for-connection-multiplier="${mongo.options.threads-allowed-to-block-for-connection-multiplier}"
                       connect-timeout="${mongo.options.connect-timeout}"
                       max-wait-time="${mongo.options.max-wait-time}"
                       auto-connect-retry="${mongo.options.auto-connect-retry}"
                       socket-keep-alive="${mongo.options.socket-keep-alive}"
                       socket-timeout="${mongo.options.socket-timeout}"
                       slave-ok="${mongo.options.slave-ok}"
                       write-number="${mongo.options.write-number}"
                       write-timeout="${mongo.options.write-timeout}"
                       write-fsync="${mongo.options.write-fsync}"/>
    </mongo:mongo>
    <!--連接池工廠配置-->
    <mongo:db-factory dbname="${mongo.dbname}" username="${mongo.username}" password="${mongo.password}" mongo-ref="mongo"/>
    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
    </bean>
    <!--實體映射自動掃描注入的包-->
    <mongo:mapping-converter>
        <mongo:custom-converters base-package="com.shunova.core.entity.mongo" />
    </mongo:mapping-converter>
mongo.properties
mongo.host=localhost
mongo.port=27017
mongo.dbname=dbname
mongo.username=username
mongo.password=password
mongo.options.connections-per-host=20
mongo.options.threads-allowed-to-block-for-connection-multiplier=4
mongo.options.connect-timeout=1000
mongo.options.max-wait-time=1500
mongo.options.auto-connect-retry=false
mongo.options.socket-keep-alive=true
mongo.options.socket-timeout=1500
mongo.options.slave-ok=false
mongo.options.write-number=1
mongo.options.write-timeout=0
mongo.options.write-fsync=true
實體類:
項目需求中的公告實體類粮宛,Notice
package com.shunova.core.entity.mongo;

import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.PersistenceConstructor;
import org.springframework.data.mongodb.core.index.IndexDirection;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

import java.util.Date;

/**
 * Created by mhq on 16/10/28.
 */
@Document
public class Notice {

    public Notice(){}

    @PersistenceConstructor
    public Notice(String id, int siteId, String creator, String title, String content,
                  Date createTime, Date updateTime){
        this.id = id;
        this.siteId = siteId;
        this.creator = creator;
        this.title = title;
        this.content = content;
        this.createTime = createTime;
        this.updateTime = updateTime;
    }

    @Id
    private String id;

    @Indexed
    private int siteId;

    private String creator;

    private String title;

    private String content;

    @Indexed(direction = IndexDirection.DESCENDING)
    private Date createTime;

    private Date updateTime;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public int getSiteId() {
        return siteId;
    }

    public void setSiteId(int siteId) {
        this.siteId = siteId;
    }

    public String getCreator() {
        return creator;
    }

    public void setCreator(String creator) {
        this.creator = creator;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
}

相關(guān)實體類注解的解釋
@Id - 文檔的唯一標(biāo)識窥淆,在mongodb中為ObjectId,它是唯一的窟勃,通過時間戳+機器標(biāo)識+進(jìn)程ID+自增計數(shù)器(確保同一秒內(nèi)產(chǎn)生的Id不會沖突)構(gòu)成祖乳。

@Document - 把一個java類聲明為mongodb的文檔逗堵,可以通過collection參數(shù)指定這個類對應(yīng)的文檔秉氧。@Document(collection="mongodb") mongodb對應(yīng)表

@DBRef - 聲明類似于關(guān)系數(shù)據(jù)庫的關(guān)聯(lián)關(guān)系。ps:暫不支持級聯(lián)的保存功能蜒秤,當(dāng)你在本實例中修改了DERef對象里面的值時汁咏,單獨保存本實例并不能保存DERef引用的對象,它要另外保存作媚,如下面例子的Person和Account攘滩。

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

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

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

@Transient - 映射忽略的字段蚤假,該字段不會保存到mongodb。

@PersistenceConstructor - 聲明構(gòu)造函數(shù)吧兔,作用是把從數(shù)據(jù)庫取出的數(shù)據(jù)實例化為對象磷仰。該構(gòu)造函數(shù)傳入的值為從DBObject中取出的數(shù)據(jù)
基本的增刪改查
在dao中注入xml中配置的mongoTemplate

MongoOperations是MongoTemplate的父類

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
    @Autowired
    protected MongoOperations mongoOperations;
    
增刪改查
    public String save(int siteId, String creator, Notice notice){
        Date now = new Date();
        notice.setSiteId(siteId);
        notice.setCreator(creator);
        notice.setCreateTime(now);
        notice.setUpdateTime(now);
        mongoOperations.insert(notice);
        return notice.getId();
    }

    public int update(int siteId, String id, Notice notice){
        Query query = new Query();
        query.addCriteria(Criteria.where("id").is(id).and("siteId").is(siteId));
        Update update = new Update();
        update.set("title", notice.getTitle());
        update.set("content", notice.getContent());
        update.set("updateTime", new Date());
        WriteResult result = mongoOperations.updateFirst(query, update, Notice.class);
        return result.getN();
    }

    public Pager page(Pager pager, int siteId, NoticeSearchParams searchParams){
        Query query = new Query();
        query.addCriteria(Criteria.where("siteId").is(siteId));
        if(!StringTool.isNullOrEmpty(searchParams.getTitleKey())){
            query.addCriteria(Criteria.where("title").regex(searchParams.getTitleKey(), "i"));
        }
        if(searchParams.getSortMode() == NoticeSearchParams.SORT_MODE_CREATE_TIME_DESC){
            query.with(new Sort(new Sort.Order(Sort.Direction.DESC, "createTime")));
        }
        int skipCount = (pager.getPageNo() > 0 ? pager.getPageNo() - 1 : 0) * pager.getPageSize();
        query.skip(skipCount);
        query.limit(pager.getPageSize());
        List<Notice> notices = mongoOperations.find(query, Notice.class);
        pager.setResult(notices);
        return pager;
    }

    public Notice get(int siteId, String id){
        Notice notice = mongoOperations.findOne(
                Query.query(Criteria.where("id").is(id).and("siteId").is(siteId)), Notice.class);
        return notice;
    }

    public void remove(int siteId, String id){
        mongoOperations.remove(
                Query.query(Criteria.where("id").is(id).and("siteId").is(siteId)), Notice.class);
    }

至此就完成了基本Spring和MongoDB的整合,以上代碼都經(jīng)過實際測試通過境蔼。

本篇內(nèi)容參考自Spring官方文檔Spring Data MongoDB - Reference Documentation


歡迎來我的個人博客逛逛: https://blog.52xtg.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灶平,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子箍土,更是在濱河造成了極大的恐慌逢享,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吴藻,死亡現(xiàn)場離奇詭異拼苍,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門疮鲫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吆你,“玉大人,你說我怎么就攤上這事俊犯「径啵” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵燕侠,是天一觀的道長者祖。 經(jīng)常有香客問我,道長绢彤,這世上最難降的妖魔是什么七问? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮茫舶,結(jié)果婚禮上械巡,老公的妹妹穿的比我還像新娘。我一直安慰自己饶氏,他們只是感情好讥耗,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疹启,像睡著了一般古程。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喊崖,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天挣磨,我揣著相機與錄音,去河邊找鬼荤懂。 笑死茁裙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的势誊。 我是一名探鬼主播呜达,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼粟耻!你這毒婦竟也來了查近?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤挤忙,失蹤者是張志新(化名)和其女友劉穎霜威,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體册烈,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡戈泼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年婿禽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片大猛。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡扭倾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挽绩,到底是詐尸還是另有隱情膛壹,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布唉堪,位于F島的核電站模聋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏唠亚。R本人自食惡果不足惜链方,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望灶搜。 院中可真熱鬧祟蚀,春花似錦、人聲如沸占调。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽究珊。三九已至,卻和暖如春纵苛,著一層夾襖步出監(jiān)牢的瞬間剿涮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工攻人, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留取试,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓怀吻,卻偏偏與公主長得像瞬浓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蓬坡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,809評論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理猿棉,服務(wù)發(fā)現(xiàn),斷路器屑咳,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • application的配置屬性萨赁。 這些屬性是否生效取決于對應(yīng)的組件是否聲明為Spring應(yīng)用程序上下文里的Bea...
    新簽名閱讀 5,367評論 1 27
  • 這些屬性是否生效取決于對應(yīng)的組件是否聲明為 Spring 應(yīng)用程序上下文里的 Bean(基本是自動配置的),為一個...
    發(fā)光的魚閱讀 1,424評論 0 14
  • 最近在準(zhǔn)備畢業(yè)論文兆龙,論文中使用到了Spring框架杖爽,考慮到數(shù)據(jù)的格式并非有固定的字段格式,因此考慮到使用Mongo...
    _挑燈看劍_閱讀 15,997評論 2 44