mongodb的java驱动与spring的整合

8 篇文章 0 订阅
8 篇文章 0 订阅

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

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


原文:http://hi.baidu.com/cesul/item/99be4f31dc75a9f7a9842872

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值