springmvc mongodb_SpringMVC+MongoDB开发及SpringMVC+ Mongodb的CRUD + 分页实现

更新时间:2019-10-07    来源:MongoDB    手机版     字体:

【www.bbyears.com--MongoDB】

系统环境:

操作系统:  windows xp

数 据 库:  mongodb2.0.6

驱 动 包: Spring3.1.2 + mongodb2.7.3 + spring-data-mongodb1.0.1

说明: 对于xp系统用户,在执行mongod.exe安装mongodb时 出现,无法定位程序输入点 InterlockedCompareExchange64 于动态链接库KERNEL32.dll上,这是因为最新的开发分支已经不再支持xp.也就是说你的mongodb安装包不支持xp系统.V2.0.6是最新也是最后一个新版本支持xp.所以笔者使用数据库为2.0.6

项目结构:

SpringMVC+MongoDB开发及SpringMVC+ Mongodb的CRUD + 分页实现

配置说明:

Web.xml文件配置spring相关与springmvc相关.


    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
   
     
   
        contextConfigLocation
        /WEB-INF/context/spring-context.xml
   


   
        org.springframework.web.context.ContextLoaderListener
   


   
     
        springmvc 
        org.springframework.web.servlet.DispatcherServlet
       
            contextConfigLocation              
            /WEB-INF/context/servlet-context.xml 
       

        4
         
   
 
     
        springmvc 
        / 
   

   
 
    index.jsp
 



 Springmvc的配置文件servlet-context.xml


    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.1.xsd">

   
   
   
   

   
   
   
     
   
       
       
   
 
   
   
   
       
       
   

   
   


spring配置文件Spring-context.xml


    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.1.xsd">
   
  
  
      
  
  
  
      


mongodb的配置文件mongodb-context.xml

 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mongo="http://www.springframework.org/schema/data/mongo" 
    xsi:schemaLocation="http://www.springframework.org/schema/context  
          http://www.springframework.org/schema/context/spring-context-3.0.xsd  
          http://www.springframework.org/schema/data/mongo  
          http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd  
          http://www.springframework.org/schema/beans  
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 
         
   
   
   
   
   
           
                     connections-per-host="${mongo.connectionsPerHost}"
             threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
             connect-timeout="${mongo.connectTimeout}"
             max-wait-time="${mongo.maxWaitTime}"
             auto-connect-retry="${mongo.autoConnectRetry}"
             socket-keep-alive="${mongo.socketKeepAlive}"
             socket-timeout="${mongo.socketTimeout}"
             slave-ok="${mongo.slaveOk}"
             write-number="1"
             write-timeout="0"
             write-fsync="true"/>       
   

   
   
   
       
       
   




mongodb的属性配置文件mongodb.properties

mongo.hostport=127.0.0.1:27017
mongo.connectionsPerHost=8
mongo.threadsAllowedToBlockForConnectionMultiplier=4
#连接超时时间
mongo.connectTimeout=1000
#等待时间
mongo.maxWaitTime=1500
mongo.autoConnectRetry=true
mongo.socketKeepAlive=true
#Socket超时时间
mongo.socketTimeout=1500
mongo.slaveOk=true

编写Controller、Service、Dao相关.这里我们测试以下Spring-data-mong中对Collection的实现机制. 我们创建不同的实体类型Member、Article

然后编写对应的Service、Dao实现.这里我们侧重点持久层实现

持久层的操作实现

ArticleDao

package com.pudp.dao;

import org.springframework.stereotype.Repository;

import com.pudp.base.MongoGenDao;
import com.pudp.model.Article;

/**
 * description:
 *
 * @author Cn.??若年 (En.dennisit) Copy Right since 2013-10-16
 *
 * com.pudp.dao.ArticleDao.java
 *
 */

@Repository
public class ArticleDao extends MongoGenDao{
   
    /**
     * 实现钩子方法,返回反射的类型
     * @author Cn.苏若年(En.dennisit) Copy Right since 2013-10-13
     *               
     * @return
     */
    @Override
    protected Class getEntityClass() {
        return Article.class;
    }

}

MemberDao

package com.pudp.dao;

import org.springframework.stereotype.Repository;

import com.pudp.base.MongoGenDao;
import com.pudp.model.Member;

/**
 * description:
 *
 * @author Cn.苏若年 (En.dennisit) Copy Right since 2013-10-13
 *
 * com.pudp.dao.MemberDao.java
 *
 */
@Repository
public class MemberDao extends MongoGenDao{

    /**
     * 实现钩子方法,返回反射的类型
     * @author Cn.苏若年(En.dennisit) Copy Right since 2013-10-13
     *               
     * @return
     */
    @Override
    protected Class getEntityClass() {
        return Member.class;
    }
}

MongoGenDao中我们实现了对库中添加数据

package com.pudp.base;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;

/**
 * description:
 *
 * @author Cn.苏若年 (En.dennisit) Copy Right since 2013-10-13
 *
 * com.pudp.base.MongoGenDao.java
 *
 */

public abstract class MongoGenDao {

    @Autowired
    protected MongoTemplate mongoTemplate;

   
    /**
     * 保存一个对象
     *
     * @author Cn.苏若年(En.dennisit) Copy Right since 2013-10-13 下午03:37:28
     *               
     * @param t
     * @return
     */
    public void save(T t){
        this.mongoTemplate.save(t);
    }   
   
    /**
     * 为属性自动注入bean服务
     *
     * @author Cn.pudp(En.dennisit) Copy Right since 2013-10-13 下午03:21:23
     *               
     * @param mongoTemplate
     */
    public void setMongoTemplate(MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }
   
}

这里需要说明的是MongoTemplate对库的管理。

MongoTemplate对库Collection的管理


SpringMVC+MongoDB开发及SpringMVC+ Mongodb的CRUD + 分页实现

我们使用MongoTemplate操作持久层.这里如果我们没有指定CollectionName的话,会依实体类型的类名作为库中的集合名,当我们执行数据入库操作之后,从数据库中查看到如下信息.

SpringMVC+MongoDB开发及SpringMVC+ Mongodb的CRUD + 分页实现

当然,如果我们想自己定义数据库的Collection名的化,可以在持久层Dao中指定.


SpringMVC整合MongoDB开发 高级操作 SpringMVC+ Mongodb 的CRUD + 分页实现



开发环境:

操作系统:windows xp
Mongodb:2.0.6
依 赖 包:Spring3.2.2 + spring-data-mongodb-1.3.0 + Spring-data-1.5 + mongodb2.7.3
说    明:Springmvc整合Mongodb的时候建议选择稳定版的Spring-data-mongdb。Mongodb1.0.1中存在数据映射bug.所以使用1.3.0.

项目结构图:

SpringMVC+MongoDB开发及SpringMVC+ Mongodb的CRUD + 分页实现

说明:
持久层操作使用MongoTemplate类操作.实现将对象与Mongodb库中的数据交互操作.

SpringMVC+MongoDB开发及SpringMVC+ Mongodb的CRUD + 分页实现

这里需要说明的是我的实体对象中的id属性对应的是库中记录中的_id属性.

Mongodb与SpringMVC整合参见文档: http://www.linuxidc.com/Linux/2015-02/114229.htm

Mongodb的高级操作:
添加对象到数据库

/**
     * 保存一个对象
     *
     * @author Cn.苏若年(En.dennisit) Copy Right since 2013-10-13 下午03:37:28
     *               
     * @param t
     * @return
     */
    public void save(T t){
        log.info("[Mongo Dao ]save:" + t);
        this.mongoTemplate.save(t);
    }

根据Id从库中查询对象

   
    /**
     * 根据Id从Collection中查询对象
     *
     * @author Cn.苏若年(En.dennisit) Copy Right since 2013-10-17 下午01:59:55
     *               
     * @param id
     *                 实体对象的Id,对应Collection中记录的_id字段.
     *                


     *                     需要说明的是,Mongdo自身没有主键自增机制.解决方法
     *                    


         *                         实体入库的时候,程序中为实体赋主键值.
         *                         实体入库的时候,在mongodb中自定义函数实现主键自增机制.定义方法同js代码类似
         *                    

     *                


     * @return
     */
    public T queryById(String id) {
        Query query = new Query();
        Criteria criteria = Criteria.where("_id").is(id);
        query.addCriteria(criteria);
        log.info("[Mongo Dao ]queryById:" + query);
        return this.mongoTemplate.findOne(query, this.getEntityClass());
    }

根据条件从库中查询

    /**
     * 根据条件查询集合
     *
     * @author Cn.苏若年(En.dennisit) Copy Right since 2013-10-13 下午03:32:54
     *               
     * @param query       
     *                     查询条件
     * @return
     *                     满足条件的集合
     */
    public List queryList(Query query){
        log.info("[Mongo Dao ]queryList:" + query);
        return this.mongoTemplate.find(query, this.getEntityClass());
    }

根据条件查询单个记录

/**
     * 通过条件查询单个实体
     *
     * @author Cn.苏若年(En.dennisit) Copy Right since 2013-10-13 下午03:33:12
     *               
     * @param query
     * @return
     */
    public T queryOne(Query query){
        log.info("[Mongo Dao ]queryOne:" + query);
        return this.mongoTemplate.findOne(query, this.getEntityClass());
    }

说明:查询单个用的是mongoTemplate.findOne方法,查询多条的用的是mongoTemplate.find.

分页查询操作

    /**
     * 通过条件进行分页查询
     *
     * @author Cn.苏若年(En.dennisit) Copy Right since 2013-10-13 下午03:33:30
     *               
     * @param query
     *                     查询条件
     * @param start
     *                     查询起始值
     *                     类似mysql查询中的 limit start, size 中的 start
     * @param size
     *                     查询大小
     *                     类似mysql查询中的 limit start, size 中的 size
     * @return
     *                     满足条件的集合
     */
    public List getPage(Query query, int start, int size){
        query.skip(start);
        query.limit(size);
        log.info("[Mongo Dao ]queryPage:" + query + "(" + start +"," + size +")");
        List lists = this.mongoTemplate.find(query, this.getEntityClass());
        return lists;
    }
   
    /**
     * 根据条件查询库中符合记录的总数,为分页查询服务
     *
     * @author Cn.苏若年(En.dennisit) Copy Right since 2013-10-13 下午03:35:44
     *               
     * @param query
     *                     查询条件
     * @return
     *                     满足条件的记录总数
     */
    public Long getPageCount(Query query){
        log.info("[Mongo Dao ]queryPageCount:" + query);
        return this.mongoTemplate.count(query, this.getEntityClass());
    }
   

根据Id删除操作

    /**
     * 根据Id删除用户
     *
     * @author Cn.苏若年(En.dennisit) Copy Right since 2013-10-13 下午04:09:20
     *               
     * @param id
     */
    public void deleteById(String id) {
        Criteria criteria = Criteria.where("_id").in(id);
        if(null!=criteria){
            Query query = new Query(criteria);
            log.info("[Mongo Dao ]deleteById:" + query);
            if(null!=query && this.queryOne(query)!=null){
                this.delete(query);
            }
        }
    }

删除对象操作

   
    /**
     * 删除对象
     *
     * @author Cn.苏若年(En.dennisit) Copy Right since 2013-10-13 下午03:45:33
     *               
     * @param t
     */
    public void delete(T t){
        log.info("[Mongo Dao ]delete:" + t);
        this.mongoTemplate.remove(t);
    }

修改操作:

说明:Mongodb的修改操作大致有3中.

mongoTemplate.updateFirst操作、mongoTemplate.updateMulti操作、this.mongoTemplate.upsert操作.

分别表示修改第一条、修改符合条件的所有、修改时如果不存在则添加.

修改满足条件的第一条记录

    /**
     * 更新满足条件的第一个记录
     *
     * @author Cn.苏若年(En.dennisit) Copy Right since 2013-10-13 下午03:47:10
     *               
     * @param query
     * @param update
     */
    public void updateFirst(Query query,Update update){
        log.info("[Mongo Dao ]updateFirst:query(" + query + "),update(" + update + ")");
        this.mongoTemplate.updateFirst(query, update, this.getEntityClass());
    }

修改满足条件的多条记录

    /**
     * 更新满足条件的所有记录
     *
     * @author Cn.苏若年(En.dennisit) Copy Right since 2013-10-13 下午03:48:02
     *               
     * @param query
     * @param update
     */
    public void updateMulti(Query query, Update update){
        log.info("[Mongo Dao ]updateMulti:query(" + query + "),update(" + update + ")");
        this.mongoTemplate.updateMulti(query, update, this.getEntityClass());
    }

修改,如果要修改的对象不存在则添加

    /**
     * 查找更新,如果没有找到符合的记录,则将更新的记录插入库中
     *
     * @author Cn.苏若年(En.dennisit) Copy Right since 2013-10-13 下午03:48:58
     *               
     * @param query
     * @param update
     */
    public void updateInser(Query query, Update update){
        log.info("[Mongo Dao ]updateInser:query(" + query + "),update(" + update + ")");
        this.mongoTemplate.upsert(query, update, this.getEntityClass());
    }

上面的操作是Mongodb的基础操作封装,利用泛型实现的抽象类MongoGenDao.java,泛型中定义钩子方法,然后Dao类继承抽象类,实现该钩子方法,返回反射的类型.钩子方法的定义如下:

    /**
     * 钩子方法,由子类实现返回反射对象的类型
     *
     * @author Cn.pudp(En.dennisit) Copy Right since 2013-10-13 下午03:21:48
     *               
     * @return
     */
    protected abstract Class getEntityClass();

Mongodb基础操作封装大致就这么多

 

接下来介绍如何在数据Dao中根据需要复写我们的持久层基础操作.实例是会员管理的基础实现.

package com.pudp.dao;

import java.util.List;

import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Repository;

import com.pudp.base.MongoGenDao;
import com.pudp.model.Member;
import com.pudp.util.StringUtil;

/**
 * description:
 *
 * @author Cn.苏若年 (En.dennisit) Copy Right since 2013-10-13
 *
 * com.pudp.dao.MemberDao.java
 *
 */
@Repository
public class MemberDao extends MongoGenDao{

    /**
     * 分页查询   对应mongodb操作中的  db.member.find().skip(10).limit(10);
     *
     * @author Cn.苏若年(En.dennisit) Copy Right since 2013-10-13 下午04:09:58
     *               
     * @param member
     *                     查询的条件
     * @param start   
     *                     用户分页查询的起始值
     * @param size
     *                     查询的数据数目
     *
     * @return
     *                     返回查询到的数据集合
     */
    public List queryPage(Member member, Integer start, Integer size) {
        Query query = new Query();
        //此处可以增加分页查询条件Criteria.然后query.addCriteria(criteria);
        return this.getPage(query,(start-1)*size,size);
    }

    /**
     * 查询满足分页的记录总数
     *
     * @author Cn.苏若年(En.dennisit) Copy Right since 2013-10-16 上午10:20:12
     *               
     * @param member
     *                     查询的条件
     * @return
     *                     返回满足条件的记录总数
     */
    public Long queryPageCount(Member member){
        Query query = new Query();
        //此处可以增加分页查询条件Criteria.然后query.addCriteria(criteria);
        return this.getPageCount(query);
    }
   
    /**
     * 更新操作
     *
     * @author Cn.苏若年(En.dennisit) Copy Right since 2013-10-17 下午02:21:26
     *               
     * @param member
     *                         要更新的数据
     * @throws Exception
     *                         更新异常
     */
    public void updateFirst(Member member) throws Exception {
        Update update = new Update();
        if(null==member.getId()||"".equals(member.getId().trim())){
            //如果主键为空,则不进行修改
            throw new Exception("Update data Id is Null");
        }
        if(StringUtil.isNotNullValue(member.getUsername())){
            update.set("username", member.getUsername());
        }
        if(StringUtil.isNotNullValue(member.getPassword())){
            update.set("password", member.getPassword());
        }
        if(StringUtil.isNotNullValue(member.getSex())){
            update.set("sex", member.getSex());
        }
        if(StringUtil.isNotNullValue(member.getEmail())){
            update.set("email", member.getEmail());
        }
        this.updateFirst(Query.query(Criteria.where("_id").is(member.getId())),update);
    }
   
    /**
     * 更新库中所有数据
     *
     * @author Cn.苏若年(En.dennisit) Copy Right since 2013-10-17 下午02:22:07
     *               
     * @param member
     *                         更新的数据
     * @throws Exception
     *                         更新异常
     */
    public void updateMulti(Member member) throws Exception {
        Update update = new Update();
        if(null==member.getId()||"".equals(member.getId().trim())){
            //如果主键为空,则不进行修改
            throw new Exception("Update data Id is Null");
        }
        if(StringUtil.isNotNullValue(member.getUsername())){
            update.set("username", member.getUsername());
        }
        if(StringUtil.isNotNullValue(member.getPassword())){
            update.set("password", member.getPassword());
        }
        if(StringUtil.isNotNullValue(member.getSex())){
            update.set("sex", member.getSex());
        }
        if(StringUtil.isNotNullValue(member.getEmail())){
            update.set("email", member.getEmail());
        }
        this.updateMulti(Query.query(Criteria.where("_id").is(member.getId())),update);
    }
   

    /**
     * 实现钩子方法,返回反射的类型
     * @author Cn.苏若年(En.dennisit) Copy Right since 2013-10-17
     *               
     * @return       
     *                 反射类型
     */
    @Override
    protected Class getEntityClass() {
        return Member.class;
    }
   
}

业务层调用Dao进行业务数据的交互.这里列出实例中的Service层中对持久层分页操作的实现

    /**
     * 分页查询
     * @author Cn.苏若年(En.dennisit) Copy Right since 2013-10-17
     *               
     * @param member
     *                     查询的条件
     * @param start
     *                      对应Page工具类的属性当前页:pageNum
     * @param size
     *                      对应Page工具类的属性每页显示多少条记录:pageSize
     * @return
     */
    public Page queryPage(Member member, int start, int size) {
        Page page = new Page();
        try {
            List list = this.memberDao.queryPage(member, start, size);
            Long recordTotal = this.memberDao.queryPageCount(member);
            page= new Page(list, recordTotal, (long)start, size);
            log.info(page);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return page;
    }

至此,SpringMVC整合mongodb的高级操作实例完毕,实例中使用jquery.Pager插件分页. 这个属于分页插件的应用,就不介绍了.

运行效果图:


SpringMVC+MongoDB开发及SpringMVC+ Mongodb的CRUD + 分页实现

本文来源:http://www.bbyears.com/shujuku/71834.html

热门标签

更多>>

本类排行