MongoDB整合Spring 详细讲解(含代码)

MongoDB整合Spring 详细讲解(含代码)

写这篇文章也做了下思考,首先是本人技术欠佳。但就是喜欢研究一些东西。因为在此之前有很多的朋友已经写过类似的,很多我也看过,但是讲解的不够深入。对有些朋友提出的问题不能给出答案。在这里,我根据我目前的能力对其进行整理。并最终运行成功。

在测试过程中出现过一下问题:

1、org/springframework/data/mapping/context/MappingContextAware

2、src-resolve: Cannot resolve the name 'repository:repository' to a(n) 'type definition'

以上都是版本不匹配引起的。特别是第二个错误我看有些解决时候提到了jpa,但是我这里没有使用jpa后来我是把spring-data-commons的包替换了个版本就不出现了。

我先说下我的开发环境:

myeclipse 6.5

mongodb 2.0.8

spring 3.0.4 

最后就是下面2个(这两个版本不对就容易出现各种各样的,杂七杂八的问题) 这里我就给出我所采用的版本

spring-data-document

spring-data-commons

有所改变所有版本必须要对应好下面是jar下载地址 
http://www.springsource.org/spring-data/mongodb 
http://www.springsource.org/spring-data/commons

下载版本分别为:

spring-data-commons-dist-1.4.0.M1

spring-data-document-1.0.0.M2.zip
下面给出我工程的图片

 

然后就开始我们开发之旅吧!

首先新建application.xml配置文件

[html]  view plain copy
  1. <span style="font-size:18px;color:#3366ff;">xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"    
  3.           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
  4.           xmlns:context="http://www.springframework.org/schema/context"    
  5.           xmlns:mongo="http://www.springframework.org/schema/data/mongo"    
  6.           xsi:schemaLocation="http://www.springframework.org/schema/context     
  7.           http://www.springframework.org/schema/context/spring-context-3.0.xsd     
  8.           http://www.springframework.org/schema/data/mongo     
  9.           http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd     
  10.           http://www.springframework.org/schema/beans     
  11.           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">     
  12.       
  13.         <mongo:mongo host="192.168.0.138" port="27017"/>  
  14.           
  15.           
  16.       
  17.        <bean id="mongoTemplate" class="org.springframework.data.document.mongodb.MongoTemplate">     
  18.         <constructor-arg ref="mongo"/>     
  19.         <constructor-arg name="databaseName" value="db"/>     
  20.         <constructor-arg name="defaultCollectionName" value="person" />     
  21.       bean>     
  22.       
  23.      <bean id="personRepository" class="com.mongo.dao.impl.PersonRepository">     
  24.         <property name="mongoTemplate" ref="mongoTemplate">property>     
  25.     bean>     
  26.       
  27.      <context:annotation-config />  
  28.           
  29. beans>   
  30.     span>  


然后编写操作mongodb的接口

[java]  view plain copy
  1. "font-size:18px;color:#3366ff;">/** 
  2.  * AbstractRepository.java 
  3.  * 版权所有(C) 2012  
  4.  * 创建:cuiran 2012-12-12 11:40:40 
  5.  */  
  6. package com.mongo.dao;  
  7.   
  8. import java.util.List;  
  9.   
  10. import com.mongo.bean.Person;  
  11.   
  12. /** 
  13.  * TODO 
  14.  * @author cuiran 
  15.  * @version TODO 
  16.  */  
  17. public interface AbstractRepository {  
  18.       
  19.     /** 
  20.      *  
  21.      *function:添加对象 
  22.      * @author cuiran 
  23.      * @createDate 2012-12-12 11:41:30 
  24.      */  
  25.     public void insert(Person person);   
  26.       
  27.     /** 
  28.      *  
  29.      *function:根据ID查找对象 
  30.      * @author cuiran 
  31.      * @createDate 2012-12-12 11:41:41 
  32.      */  
  33.     public Person findOne(String id);     
  34.     /** 
  35.      *  
  36.      *function:查询所有 
  37.      * @author cuiran 
  38.      * @createDate 2012-12-12 16:26:06 
  39.      */  
  40.     public List findAll();     
  41.       
  42.     public List findByRegex(String regex);  
  43.     /** 
  44.      *  
  45.      *function:删除指定的ID对象 
  46.      * @author cuiran 
  47.      * @createDate 2012-12-12 16:26:16 
  48.      */  
  49.     public void removeOne(String id);     
  50.     /** 
  51.      *  
  52.      *function:删除所有 
  53.      * @author cuiran 
  54.      * @createDate 2012-12-12 16:25:40 
  55.      */  
  56.     public void removeAll();     
  57.     /** 
  58.      * 通过ID找到并修改 
  59.      *function: 
  60.      * @author cuiran 
  61.      * @createDate 2012-12-12 16:25:51 
  62.      */  
  63.     public void findAndModify(String id);     
  64.   
  65.       
  66. }  
  67.   


再写对应接口的实现类:

[java]  view plain copy
  1. "font-size:18px;color:#3366ff;">/** 
  2.  * PersonRepository.java 
  3.  * 版权所有(C) 2012  
  4.  * 创建:cuiran 2012-12-12 11:42:51 
  5.  */  
  6. package com.mongo.dao.impl;  
  7.   
  8. import java.util.List;  
  9. import java.util.regex.Pattern;  
  10.   
  11. import org.springframework.data.document.mongodb.MongoTemplate;  
  12. import org.springframework.data.document.mongodb.query.Criteria;  
  13. import org.springframework.data.document.mongodb.query.Query;  
  14. import org.springframework.data.document.mongodb.query.Update;  
  15. import com.mongo.bean.Person;  
  16. import com.mongo.dao.AbstractRepository;  
  17.   
  18. /** 
  19.  * TODO 
  20.  * @author cuiran 
  21.  * @version TODO 
  22.  */  
  23. public class PersonRepository implements AbstractRepository {  
  24.   
  25.       private MongoTemplate mongoTemplate;     
  26.   
  27.     /* (non-Javadoc) 
  28.      * @see com.mongo.dao.AbstractRepository#findAll() 
  29.      */  
  30.     @Override  
  31.     public List findAll() {  
  32.         // TODO Auto-generated method stub  
  33.         return getMongoTemplate().find(new Query(), Person.class);     
  34.   
  35.     }  
  36.   
  37.     /* (non-Javadoc) 
  38.      * @see com.mongo.dao.AbstractRepository#findAndModify(java.lang.String) 
  39.      */  
  40.     @Override  
  41.     public void findAndModify(String id) {  
  42.         // TODO Auto-generated method stub  
  43.         //new Query(Criteria.where("id").is(id)), new Update().inc("age", 3)  
  44.           
  45.         getMongoTemplate().updateFirst(new Query(Criteria.where("id").is(id)), new Update().inc("age"3));  
  46.   
  47.     }  
  48.   
  49.     /* (non-Javadoc) 
  50.      * @see com.mongo.dao.AbstractRepository#findByRegex(java.lang.String) 
  51.      */  
  52.     @Override  
  53.     public List findByRegex(String regex) {  
  54.         // TODO Auto-generated method stub  
  55.          Pattern pattern = Pattern.compile(regex,Pattern.CASE_INSENSITIVE);     
  56.           Criteria criteria = new Criteria("name").regex(pattern.toString());     
  57.             return getMongoTemplate().find(new Query(criteria), Person.class);     
  58.   
  59.     }  
  60.   
  61.     /* (non-Javadoc) 
  62.      * @see com.mongo.dao.AbstractRepository#findOne(java.lang.String) 
  63.      */  
  64.     @Override  
  65.     public Person findOne(String id) {  
  66.         // TODO Auto-generated method stub  
  67.          return getMongoTemplate().findOne(new Query(Criteria.where("id").is(id)), Person.class);     
  68.   
  69.     }  
  70.   
  71.     /* (non-Javadoc) 
  72.      * @see com.mongo.dao.AbstractRepository#insert(com.mongo.bean.Person) 
  73.      */  
  74.     @Override  
  75.     public void insert(Person person) {  
  76.         // TODO Auto-generated method stub  
  77.         getMongoTemplate().insert(person);     
  78.     }  
  79.   
  80.     /* (non-Javadoc) 
  81.      * @see com.mongo.dao.AbstractRepository#removeAll() 
  82.      */  
  83.     @Override  
  84.     public void removeAll() {  
  85.         // TODO Auto-generated method stub  
  86.         List list = this.findAll();     
  87.         if(list != null){     
  88.             for(Person person : list){     
  89.                 getMongoTemplate().remove(person);     
  90.             }     
  91.         }     
  92.   
  93.     }  
  94.   
  95.     /* (non-Javadoc) 
  96.      * @see com.mongo.dao.AbstractRepository#removeOne(java.lang.String) 
  97.      */  
  98.     @Override  
  99.     public void removeOne(String id) {  
  100.         // TODO Auto-generated method stub  
  101.         Criteria criteria = Criteria.where("id").in(id);     
  102.         if(criteria == null){     
  103.              Query query = new Query(criteria);     
  104.              if(query != null && getMongoTemplate().findOne(query, Person.class) != null)     
  105.                  getMongoTemplate().remove(getMongoTemplate().findOne(query, Person.class));     
  106.         }     
  107.   
  108.     }  
  109.   
  110.     /** 
  111.      * @return the mongoTemplate 
  112.      */  
  113.     public MongoTemplate getMongoTemplate() {  
  114.         return mongoTemplate;  
  115.     }  
  116.   
  117.     /** 
  118.      * @param mongoTemplate the mongoTemplate to set 
  119.      */  
  120.     public void setMongoTemplate(MongoTemplate mongoTemplate) {  
  121.         this.mongoTemplate = mongoTemplate;  
  122.     }  
  123.   
  124. }  
  125.   

这里也给出对应Person对象代码

[java]  view plain copy
  1. "font-size:18px;color:#3366ff;">/** 
  2.  * Person.java 
  3.  * 版权所有(C) 2012  
  4.  * 创建:cuiran 2012-12-12 11:37:16 
  5.  */  
  6. package com.mongo.bean;  
  7.   
  8. import java.io.Serializable;  
  9.   
  10. /** 
  11.  * TODO 
  12.  * @author cuiran 
  13.  * @version TODO 
  14.  */  
  15. public class Person implements Serializable {  
  16.   
  17.     /** 
  18.      *  
  19.      */  
  20.     private static final long serialVersionUID = 3617931430808763429L;  
  21.       
  22.     private String id;     
  23.     private String name;     
  24.     private int age;  
  25.     public Person() {  
  26.         super();  
  27.     }  
  28.     public Person(String id, String name, int age) {  
  29.         super();  
  30.         this.id = id;  
  31.         this.name = name;  
  32.         this.age = age;  
  33.     }  
  34.     /** 
  35.      * @return the id 
  36.      */  
  37.     public String getId() {  
  38.         return id;  
  39.     }  
  40.     /** 
  41.      * @param id the id to set 
  42.      */  
  43.     public void setId(String id) {  
  44.         this.id = id;  
  45.     }  
  46.     /** 
  47.      * @return the name 
  48.      */  
  49.     public String getName() {  
  50.         return name;  
  51.     }  
  52.     /** 
  53.      * @param name the name to set 
  54.      */  
  55.     public void setName(String name) {  
  56.         this.name = name;  
  57.     }  
  58.     /** 
  59.      * @return the age 
  60.      */  
  61.     public int getAge() {  
  62.         return age;  
  63.     }  
  64.     /** 
  65.      * @param age the age to set 
  66.      */  
  67.     public void setAge(int age) {  
  68.         this.age = age;  
  69.     }  
  70.     /** 
  71.      *  
  72.      * @param name 
  73.      * @param age 
  74.      */  
  75.     public Person(String name, int age) {  
  76.         super();  
  77.         this.name = name;  
  78.         this.age = age;  
  79.     }     
  80.   
  81.      public String toString() {     
  82.             return "Person[id="+id+",name="+name+",age="+age+"]";     
  83.         }     
  84.   
  85.   
  86. }  
  87.   

最后写出我们的测试类开始进行测试

[java]  view plain copy
  1. "font-size:18px;color:#3366ff;">/** 
  2.  * MongoTest.java 
  3.  * 版权所有(C) 2012  
  4.  * 创建:cuiran 2012-12-12 11:54:30 
  5.  */  
  6. package com.mongo.test;  
  7.   
  8. import java.util.List;  
  9.   
  10. import org.apache.commons.logging.Log;  
  11. import org.apache.commons.logging.LogFactory;  
  12. import org.springframework.context.ApplicationContext;  
  13. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  14.   
  15. import com.mongo.bean.Person;  
  16. import com.mongo.dao.AbstractRepository;  
  17. import com.mongo.dao.impl.PersonRepository;  
  18.   
  19.   
  20.   
  21. /** 
  22.  * TODO 
  23.  * @author cuiran 
  24.  * @version TODO 
  25.  */  
  26. public class MongoTest {  
  27.   
  28.     private static Log log = LogFactory.getLog(MongoTest.class.getName());  
  29.       
  30.     private  AbstractRepository pr=null;  
  31.       
  32.     /** 
  33.      *  
  34.      *function: 
  35.      * @author cuiran 
  36.      * @createDate 2012-12-12 16:08:02 
  37.      */  
  38.     public void init(){  
  39.          log.debug("开始启动");  
  40.          ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");  
  41.           pr= (PersonRepository)ctx.getBean("personRepository");  
  42.            
  43.           
  44.           
  45.     }  
  46.     /** 
  47.      *  
  48.      *function:添加 
  49.      * @author cuiran 
  50.      * @createDate 2012-12-12 16:11:01 
  51.      */  
  52.     public void insert(){  
  53.           
  54.         Person p=new Person("cuiran",27);  
  55.          pr.insert(p);  
  56.          log.debug("添加成功");  
  57.     }  
  58.     /** 
  59.      *  
  60.      *function:根据输入的ID查找对象 
  61.      * @author cuiran 
  62.      * @createDate 2012-12-12 16:24:10 
  63.      */  
  64.     public void findOne(){  
  65.         String id="50c83cb552c2ceb0463177d6";  
  66.         Person p= pr.findOne(id);  
  67.         log.debug(p);  
  68.     }  
  69.       
  70.       
  71.     /** 
  72.      *  
  73.      *function:查询所有 
  74.      * @author cuiran 
  75.      * @createDate 2012-12-12 16:08:54 
  76.      */  
  77.     public void listAll(){  
  78.           
  79.         List list=pr.findAll();  
  80.         log.debug("查询结果如下:");  
  81.         for (Person p:list){  
  82.             log.debug(p.toString());  
  83.         }  
  84.           
  85.           
  86.     }  
  87.       
  88.     /** 
  89.      *  
  90.      *function:测试方法 
  91.      * @author cuiran 
  92.      * @createDate 2012-12-12 16:11:37 
  93.      */  
  94.     public void start(){  
  95.         init();  
  96.           
  97.         //insert();  
  98.         //listAll();  
  99.           
  100.         findOne();  
  101.     }  
  102.       
  103.     /** 
  104.      *function:main函数 
  105.      * @author cuiran 
  106.      * @createDate 2012-12-12 11:54:30 
  107.      */  
  108.     public static void main(String[] args) {  
  109.         // TODO Auto-generated method stub  
  110.         MongoTest t=new MongoTest();  
  111.         t.start();  
  112.     }  
  113.   
  114. }  
  115.   


运行出现一下日志,就没什么问题。

[java]  view plain copy
  1. "font-size:18px;color:#3366ff;">2012-12-12 16:23:59:DEBUG com.mongo.test.MongoTest - 开始启动  
  2. 2012-12-12 16:23:59:INFO org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@253498: startup date [Wed Dec 12 16:23:59 CST 2012]; root of context hierarchy  
  3. 2012-12-12 16:23:59:INFO org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [applicationContext.xml]  
  4. 2012-12-12 16:24:00:INFO org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@12a0f6c: defining beans [mongo,mongoTemplate,personRepository,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor]; root of factory hierarchy  
  5. 2012-12-12 16:24:00:DEBUG com.mongo.test.MongoTest - Person[id=50c83cb552c2ceb0463177d6,name=cuiran,age=27]  
  6.   

MongoDB配置参数详解:
#对mongo实例来说,每个host允许链接的最大链接数,这些链接空闲时会放入池中,如果链接被耗尽,任何请求链接的操作会被阻塞等待链接可用,推荐配置10
connectionsPerHost=10


#当链接空闲时,空闲线程池中最大链接数
minPoolsSize=5


#此参数跟connectionsPerHost的乘机为一个线程变为可用的最大阻塞数,超过此乘机数之后的所有线程将及时获取一个异常.eg.connectionsPerHost=10 and threadsAllowedToBlockForConnectionMultiplier=5,最多50个线程等级一个链接,推荐配置为5
threadsAllowedToBlockForConnectionMultiplier=5


#一个线程等待链接可用的最大等待毫秒数,0表示不等待,负数表示等待时间不确定,推荐配置120000
maxWaitTime=120000
#链接超时的毫秒数,0表示不超时,此参数只用在新建一个新链接时,推荐配置10,000.
connectTimeout=10000


#此参数表示socket I/O读写超时时间,推荐为不超时,即 0    Socket.setSoTimeout(int)
socketTimeout=0


#该标志用于控制socket保持活动的功能,通过防火墙保持连接活着
socketKeepAlive=false


#true:假如链接不能建立时,驱动将重试相同的server,有最大的重试次数,默认为15次,这样可以避免一些server因为一些阻塞操作零时down而驱动抛出异常,这个对平滑过度到一个新的master,也是很有用的,注意:当集群为复制集时,驱动将在这段时间里,尝试链接到旧的master上,而不会马上链接到新master上


#false 当在进行socket读写时,不会阻止异常抛出,驱动已经有自动重建破坏链接和重试读操作. 推荐配置false
autoConnectRetry=false


#重新打开链接到相同server的最大毫秒数,推荐配置为0,如果 autoConnectRetry=true,表示时间为15s


#com.jd.mongodbclient2.mongo.JDClientMongo.maxAutoConnectRetryTime=false


#表示当没有手动关闭游标时,是否有一个自动释放游标对象的方法,如果你总是很小心的关闭游标,则可以将其设为false 推荐配置true


#com.jd.mongodbclient2.mongo.JDClientMongo.cursorFinalizerEnabled=true


#安全模式

com.jd.mongodbclient2.driver.MongoDBDriver.safe=true


#为true表示读写分离

com.jd.mongodbclient2.driver.MongoDBDriver.slaveOk=false


connectionsPerHost:每个主机的连接数 

threadsAllowedToBlockForConnectionMultiplier:线程队列数,它以上面connectionsPerHost值相乘的结果就是线程队列最大值。如果连接线程排满了队列就会抛出“Out of semaphores to get db”错误。
maxWaitTime:最大等待连接的线程阻塞时间 
connectTimeout:连接超时的毫秒。0是默认和无限 
socketTimeout:socket超时。0是默认和无限 
autoConnectRetry:这个控制是否在一个连接时,系统会自动重试 

你可能感兴趣的:(Spring,MongoDB)