見蠻多人搜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。
比如上邊的欄位查詢操作,利用了正規表示式的模式,在有些條件下還是不算理想。有待參考更多模式,繼續改進。