见蛮多人搜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。
比如上边的字段查询操作,利用了正则表达式的模式,在有些条件下还是不算理想。有待参考更多模式,继续改进。