mongodb的java驱动与spring的整合

本文分享了使用Java操作MongoDB的实践经验,包括如何与Spring框架整合,实现模型、DAO操作和增删改查等功能。强调了通过Spring提供的MongoDB支持框架简化操作,提高开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


见蛮多人搜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

publicvoidsetMongoOperation(MongoTemplate mongoTemplate) {

this.mongoTemplate= mongoTemplate;

}

其他的操作则为:

//像数据库中插入数据

publicvoidaddRecord(Object p){

mongoTemplate.insert(p);

}

//像数据库指定collection中插入数据,没有则新建

publicvoidaddRecord(String collection, Object p){

mongoTemplate.insert(collection, p);

}

//取到所有,返回游标对象以供遍历

publicDBCursorgetCollectionCursor(StringcollectionName){

returnmongoTemplate.getCollection(collectionName).find();

}

/**

*对productLib记录更新

*

* **/

publicvoidupdate(Stringwhere, String whereIs, String whereTo, Object newObjecct){

mongoTemplate.updateFirst("recordLib",

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

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

}

/**

*保存更新的一个对象

*

* **/

publicvoidsaveUpdate(String collectionName, Record p){

mongoTemplate.save(collectionName, p);

}

/**

*对title字段建立索引

*

* **/

publicvoidindex(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();

}

returnnull;

}


至此,已经能够完成与spring整合的Mongodb的增删改查。上层操作、调用这里从略。

还有更多的操作和改进,这就需要去查看更详细的api。

比如上边的字段查询操作,利用了正则表达式的模式,在有些条件下还是不算理想。有待参考更多模式,继续改进。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值