mongodb的java驅動與spring的整合

來源:互聯網
上載者:User

見蠻多人搜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。

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.