mongodb的java驅動與spring的整合

edagarli發表於2014-03-26


見蠻多人搜java和Mongodb,那就再寫點java操作Mongodb的專案心得。Mongodb的java驅動基本操作可看這裡

其實Mongodb的java驅動可以完成大部分的操作和需求。但是當你的document有N多的“欄位”需要不斷的put的時候 ,是否覺得程式碼太過瑣碎太過凌亂和不夠優雅?如果做的是web工程,而工程整合了spring,不妨把spring和mongodb做下整合。

原因是:spring提供了一個java pojo到Mongodb document對映的mongodb支援框架。看來spring還是相當“與時俱 進”的。更多的背景資訊可參考官網:http://www.springsource.org/node/3032。

把生成的java類物件當作一個document操作,好處是不言自明的,想想hibernate。

便於快速上手,這裡貼下關鍵步驟和程式碼,亦做總結只用:

現在假設你已經有了一個SSH整合的可以跑得通的web應用,且所有的xml檔案都正常。

 

第一步,applicationContext.xml里加入相關的bean宣告。即讓spring幫new出需要的資料庫連線和datasource。Mongo的bean裡將Mongodb伺服器的地址傳入。MongoTemplate利用模板模式,將Mongodb的資料物件操作做了封裝,這是核心類。幾個引數一個資料庫名一個預設collection名,比較好懂。

<beanid="mongo"class="org.springframework.data.document.mongodb.MongoFactoryBean">

     <propertyname="host"value="10.232.36.107"/>

</bean>

<beanid="mongoTemplate"class="org.springframework.data.document.mongodb.MongoTemplate">

       <constructor-argref="mongo"/>

       <constructor-argname="databaseName"value="zhishuDB"/>

       <constructor-argname="defaultCollectionName"value="recordLib"/>

</bean>

作為最簡應用,applicationContext.xml只設這兩個bean就夠了。

 

第二步:如果你的web.xml裡應對spring和hibernate整合時留下的openSessionInView,現在不需要了。

第三步:終於是我們的model了。Java類持久化物件不需要設任何annotation。就是一個很普通的java bean即可。如:

public class Record{

    privateLong auction_id;

    private String title;

    ////

    Getter()/Setter() 方法

    …. 

}

 特別注意: model裡不要設定id這樣的成員變數,它會覆蓋Mongodb給每一個記錄自動生成的_id欄位。覆蓋id的後果就是沒法插入第二條記錄。當然,如果你堅持一定要有id,那麼需要手動為id設一個唯一值,並且不能留空不設。這和用hibernate往mysql什麼的插資料不一樣。

第四步:現在是dao操作了。

前面說到MongoTemplate,一定會聯想到spring對hibernate做的一個template,我們也是用它來進行資料庫操作的。

對於RecordDao,首先需要獲取一個templat物件:

    @Resource

    public voidsetMongoOperation(MongoTemplate mongoTemplate) {

       this.mongoTemplate= mongoTemplate;

    }

其他的操作則為:

//像資料庫中插入資料

    public voidaddRecord(Object p){

       mongoTemplate.insert(p);

    }

    //像資料庫指定collection中插入資料,沒有則新建

    public voidaddRecord(String collection, Object p){

       mongoTemplate.insert(collection, p);

    }

    //取到所有,返回遊標物件以供遍歷

    publicDBCursorgetCollectionCursor(StringcollectionName){

       return mongoTemplate.getCollection(collectionName).find();

    }

    /**

     * 對productLib記錄更新

     *

     * **/

    public voidupdate(Stringwhere, String whereIs, String whereTo, Object newObjecct){

       mongoTemplate.updateFirst("recordLib",

             newQuery(Criteria.where(where).is(whereIs)),

             newUpdate().set(whereTo, newObjecct));

    }

    /**

     * 儲存更新的一個物件

     * 

     * **/

    public voidsaveUpdate(String collectionName, Record p){

       mongoTemplate.save(collectionName, p);

    }

    /**

     * 對title欄位建立索引

     * 

     * **/

    public voidindex(String collectionName) {

       mongoTemplate.ensureIndex(collectionName, newIndex().on("title", Order.ASCENDING));

    }

    /**

     *  根據關鍵詞查詢欄位,返回商品例項

     * 

     * **/

    publicList<Record>searchRecordByKeyword(StringcollectionName, String keyword, intlimit) {

       List<Record> pl;

       try{

           pl = mongoTemplate.find(collectionName, 

                  newQuery(where("title").regex(".*?"+ keyword +".*+")), Record.class);

           returnpl;

       } catch(Exception e) {

           e.printStackTrace();

       }

       return null;

    }


至此,已經能夠完成與spring整合的Mongodb的增刪改查。上層操作、呼叫這裡從略。

還有更多的操作和改進,這就需要去檢視更詳細的api。

比如上邊的欄位查詢操作,利用了正規表示式的模式,在有些條件下還是不算理想。有待參考更多模式,繼續改進。

相關文章