您的位置:首页 > 编程语言 > Java开发

超越之MongDB系列教程(九)MongDB的java驱动与Spring的整合

2016-07-06 12:39 543 查看
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://blog.csdn.net/cyjch/article/details/51837895

作者:超越

超越的主页:http://blog.csdn.net/cyjch

================================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: