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
下面给出我工程的图片

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

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

首先新建application.xml配置文件

  1. <spanstyle="font-size:18px;color:#3366ff;"><?xmlversion="1.0"encoding="UTF-8"?>
  2. <beansxmlns="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. <mongo:mongohost="192.168.0.138"port="27017"/>
  13. <beanid="mongoTemplate"class="org.springframework.data.document.mongodb.MongoTemplate">
  14. <constructor-argref="mongo"/>
  15. <constructor-argname="databaseName"value="db"/>
  16. <constructor-argname="defaultCollectionName"value="person"/>
  17. </bean>
  18. <beanid="personRepository"class="com.mongo.dao.impl.PersonRepository">
  19. <propertyname="mongoTemplate"ref="mongoTemplate"></property>
  20. </bean>
  21. <context:annotation-config/>
  22. </beans>
  23. </span>


然后编写操作mongodb的接口

  1. <spanstyle="font-size:18px;color:#3366ff;">/**
  2. *AbstractRepository.java
  3. *版权所有(C)2012
  4. *创建:cuiran2012-12-1211:40:40
  5. */
  6. packagecom.mongo.dao;
  7. importjava.util.List;
  8. importcom.mongo.bean.Person;
  9. /**
  10. *TODO
  11. *@authorcuiran
  12. *@versionTODO
  13. */
  14. publicinterfaceAbstractRepository{
  15. /**
  16. *
  17. *<b>function:</b>添加对象
  18. *@authorcuiran
  19. *@createDate2012-12-1211:41:30
  20. */
  21. publicvoidinsert(Personperson);
  22. /**
  23. *
  24. *<b>function:</b>根据ID查找对象
  25. *@authorcuiran
  26. *@createDate2012-12-1211:41:41
  27. */
  28. publicPersonfindOne(Stringid);
  29. /**
  30. *
  31. *<b>function:</b>查询所有
  32. *@authorcuiran
  33. *@createDate2012-12-1216:26:06
  34. */
  35. publicList<Person>findAll();
  36. publicList<Person>findByRegex(Stringregex);
  37. /**
  38. *
  39. *<b>function:</b>删除指定的ID对象
  40. *@authorcuiran
  41. *@createDate2012-12-1216:26:16
  42. */
  43. publicvoidremoveOne(Stringid);
  44. /**
  45. *
  46. *<b>function:</b>删除所有
  47. *@authorcuiran
  48. *@createDate2012-12-1216:25:40
  49. */
  50. publicvoidremoveAll();
  51. /**
  52. *通过ID找到并修改
  53. *<b>function:</b>
  54. *@authorcuiran
  55. *@createDate2012-12-1216:25:51
  56. */
  57. publicvoidfindAndModify(Stringid);
  58. }
  59. </span>


再写对应接口的实现类:

  1. <spanstyle="font-size:18px;color:#3366ff;">/**
  2. *PersonRepository.java
  3. *版权所有(C)2012
  4. *创建:cuiran2012-12-1211:42:51
  5. */
  6. packagecom.mongo.dao.impl;
  7. importjava.util.List;
  8. importjava.util.regex.Pattern;
  9. importorg.springframework.data.document.mongodb.MongoTemplate;
  10. importorg.springframework.data.document.mongodb.query.Criteria;
  11. importorg.springframework.data.document.mongodb.query.Query;
  12. importorg.springframework.data.document.mongodb.query.Update;
  13. importcom.mongo.bean.Person;
  14. importcom.mongo.dao.AbstractRepository;
  15. /**
  16. *TODO
  17. *@authorcuiran
  18. *@versionTODO
  19. */
  20. publicclassPersonRepositoryimplementsAbstractRepository{
  21. privateMongoTemplatemongoTemplate;
  22. /*(non-Javadoc)
  23. *@seecom.mongo.dao.AbstractRepository#findAll()
  24. */
  25. @Override
  26. publicList<Person>findAll(){
  27. //TODOAuto-generatedmethodstub
  28. returngetMongoTemplate().find(newQuery(),Person.class);
  29. }
  30. /*(non-Javadoc)
  31. *@seecom.mongo.dao.AbstractRepository#findAndModify(java.lang.String)
  32. */
  33. @Override
  34. publicvoidfindAndModify(Stringid){
  35. //TODOAuto-generatedmethodstub
  36. //newQuery(Criteria.where("id").is(id)),newUpdate().inc("age",3)
  37. getMongoTemplate().updateFirst(newQuery(Criteria.where("id").is(id)),newUpdate().inc("age",3));
  38. }
  39. /*(non-Javadoc)
  40. *@seecom.mongo.dao.AbstractRepository#findByRegex(java.lang.String)
  41. */
  42. @Override
  43. publicList<Person>findByRegex(Stringregex){
  44. //TODOAuto-generatedmethodstub
  45. Patternpattern=Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
  46. Criteriacriteria=newCriteria("name").regex(pattern.toString());
  47. returngetMongoTemplate().find(newQuery(criteria),Person.class);
  48. }
  49. /*(non-Javadoc)
  50. *@seecom.mongo.dao.AbstractRepository#findOne(java.lang.String)
  51. */
  52. @Override
  53. publicPersonfindOne(Stringid){
  54. //TODOAuto-generatedmethodstub
  55. returngetMongoTemplate().findOne(newQuery(Criteria.where("id").is(id)),Person.class);
  56. }
  57. /*(non-Javadoc)
  58. *@seecom.mongo.dao.AbstractRepository#insert(com.mongo.bean.Person)
  59. */
  60. @Override
  61. publicvoidinsert(Personperson){
  62. //TODOAuto-generatedmethodstub
  63. getMongoTemplate().insert(person);
  64. }
  65. /*(non-Javadoc)
  66. *@seecom.mongo.dao.AbstractRepository#removeAll()
  67. */
  68. @Override
  69. publicvoidremoveAll(){
  70. //TODOAuto-generatedmethodstub
  71. List<Person>list=this.findAll();
  72. if(list!=null){
  73. for(Personperson:list){
  74. getMongoTemplate().remove(person);
  75. }
  76. }
  77. }
  78. /*(non-Javadoc)
  79. *@seecom.mongo.dao.AbstractRepository#removeOne(java.lang.String)
  80. */
  81. @Override
  82. publicvoidremoveOne(Stringid){
  83. //TODOAuto-generatedmethodstub
  84. Criteriacriteria=Criteria.where("id").in(id);
  85. if(criteria==null){
  86. Queryquery=newQuery(criteria);
  87. if(query!=null&&getMongoTemplate().findOne(query,Person.class)!=null)
  88. getMongoTemplate().remove(getMongoTemplate().findOne(query,Person.class));
  89. }
  90. }
  91. /**
  92. *@returnthemongoTemplate
  93. */
  94. publicMongoTemplategetMongoTemplate(){
  95. returnmongoTemplate;
  96. }
  97. /**
  98. *@parammongoTemplatethemongoTemplatetoset
  99. */
  100. publicvoidsetMongoTemplate(MongoTemplatemongoTemplate){
  101. this.mongoTemplate=mongoTemplate;
  102. }
  103. }
  104. </span>

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

  1. <spanstyle="font-size:18px;color:#3366ff;">/**
  2. *Person.java
  3. *版权所有(C)2012
  4. *创建:cuiran2012-12-1211:37:16
  5. */
  6. packagecom.mongo.bean;
  7. importjava.io.Serializable;
  8. /**
  9. *TODO
  10. *@authorcuiran
  11. *@versionTODO
  12. */
  13. publicclassPersonimplementsSerializable{
  14. /**
  15. *
  16. */
  17. privatestaticfinallongserialVersionUID=3617931430808763429L;
  18. privateStringid;
  19. privateStringname;
  20. privateintage;
  21. publicPerson(){
  22. super();
  23. }
  24. publicPerson(Stringid,Stringname,intage){
  25. super();
  26. this.id=id;
  27. this.name=name;
  28. this.age=age;
  29. }
  30. /**
  31. *@returntheid
  32. */
  33. publicStringgetId(){
  34. returnid;
  35. }
  36. /**
  37. *@paramidtheidtoset
  38. */
  39. publicvoidsetId(Stringid){
  40. this.id=id;
  41. }
  42. /**
  43. *@returnthename
  44. */
  45. publicStringgetName(){
  46. returnname;
  47. }
  48. /**
  49. *@paramnamethenametoset
  50. */
  51. publicvoidsetName(Stringname){
  52. this.name=name;
  53. }
  54. /**
  55. *@returntheage
  56. */
  57. publicintgetAge(){
  58. returnage;
  59. }
  60. /**
  61. *@paramagetheagetoset
  62. */
  63. publicvoidsetAge(intage){
  64. this.age=age;
  65. }
  66. /**
  67. *
  68. *@paramname
  69. *@paramage
  70. */
  71. publicPerson(Stringname,intage){
  72. super();
  73. this.name=name;
  74. this.age=age;
  75. }
  76. publicStringtoString(){
  77. return"Person[id="+id+",name="+name+",age="+age+"]";
  78. }
  79. }
  80. </span>

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

  1. <spanstyle="font-size:18px;color:#3366ff;">/**
  2. *MongoTest.java
  3. *版权所有(C)2012
  4. *创建:cuiran2012-12-1211:54:30
  5. */
  6. packagecom.mongo.test;
  7. importjava.util.List;
  8. importorg.apache.commons.logging.Log;
  9. importorg.apache.commons.logging.LogFactory;
  10. importorg.springframework.context.ApplicationContext;
  11. importorg.springframework.context.support.ClassPathXmlApplicationContext;
  12. importcom.mongo.bean.Person;
  13. importcom.mongo.dao.AbstractRepository;
  14. importcom.mongo.dao.impl.PersonRepository;
  15. /**
  16. *TODO
  17. *@authorcuiran
  18. *@versionTODO
  19. */
  20. publicclassMongoTest{
  21. privatestaticLoglog=LogFactory.getLog(MongoTest.class.getName());
  22. privateAbstractRepositorypr=null;
  23. /**
  24. *
  25. *<b>function:</b>
  26. *@authorcuiran
  27. *@createDate2012-12-1216:08:02
  28. */
  29. publicvoidinit(){
  30. log.debug("开始启动");
  31. ApplicationContextctx=newClassPathXmlApplicationContext("applicationContext.xml");
  32. pr=(PersonRepository)ctx.getBean("personRepository");
  33. }
  34. /**
  35. *
  36. *<b>function:</b>添加
  37. *@authorcuiran
  38. *@createDate2012-12-1216:11:01
  39. */
  40. publicvoidinsert(){
  41. Personp=newPerson("cuiran",27);
  42. pr.insert(p);
  43. log.debug("添加成功");
  44. }
  45. /**
  46. *
  47. *<b>function:</b>根据输入的ID查找对象
  48. *@authorcuiran
  49. *@createDate2012-12-1216:24:10
  50. */
  51. publicvoidfindOne(){
  52. Stringid="50c83cb552c2ceb0463177d6";
  53. Personp=pr.findOne(id);
  54. log.debug(p);
  55. }
  56. /**
  57. *
  58. *<b>function:</b>查询所有
  59. *@authorcuiran
  60. *@createDate2012-12-1216:08:54
  61. */
  62. publicvoidlistAll(){
  63. List<Person>list=pr.findAll();
  64. log.debug("查询结果如下:");
  65. for(Personp:list){
  66. log.debug(p.toString());
  67. }
  68. }
  69. /**
  70. *
  71. *<b>function:</b>测试方法
  72. *@authorcuiran
  73. *@createDate2012-12-1216:11:37
  74. */
  75. publicvoidstart(){
  76. init();
  77. //insert();
  78. //listAll();
  79. findOne();
  80. }
  81. /**
  82. *<b>function:</b>main函数
  83. *@authorcuiran
  84. *@createDate2012-12-1211:54:30
  85. */
  86. publicstaticvoidmain(String[]args){
  87. //TODOAuto-generatedmethodstub
  88. MongoTestt=newMongoTest();
  89. t.start();
  90. }
  91. }
  92. </span>


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

  1. <spanstyle="font-size:18px;color:#3366ff;">2012-12-1216:23:59:DEBUGcom.mongo.test.MongoTest-开始启动
  2. 2012-12-1216:23:59:INFOorg.springframework.context.support.ClassPathXmlApplicationContext-Refreshingorg.springframework.context.support.ClassPathXmlApplicationContext@253498:startupdate[WedDec1216:23:59CST2012];rootofcontexthierarchy
  3. 2012-12-1216:23:59:INFOorg.springframework.beans.factory.xml.XmlBeanDefinitionReader-LoadingXMLbeandefinitionsfromclasspathresource[applicationContext.xml]
  4. 2012-12-1216:24:00:INFOorg.springframework.beans.factory.support.DefaultListableBeanFactory-Pre-instantiatingsingletonsinorg.springframework.beans.factory.support.DefaultListableBeanFactory@12a0f6c:definingbeans[mongo,mongoTemplate,personRepository,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor];rootoffactoryhierarchy
  5. 2012-12-1216:24:00:DEBUGcom.mongo.test.MongoTest-Person[id=50c83cb552c2ceb0463177d6,name=cuiran,age=27]
  6. </span>


由于这些程序只是作为测试使用,对出现的问题, 欢迎留言咨询。谢谢大家。

在此附上demo源码欢迎朋友下载学习

百度网盘:http://pan.baidu.com/s/188Lnr