项目作者: wonderomg

项目描述 :
🐱 idea 搭建 springdata+mongodb+maven+springmvc 工程。
高级语言: Java
项目地址: git://github.com/wonderomg/SpringData-mongdb.git
创建时间: 2017-06-09T06:22:26Z
项目社区:https://github.com/wonderomg/SpringData-mongdb

开源协议:

下载


idea搭建springdata+mongodb+maven+springmvc

今天我们来学习一下SpringData操作MongoDB。
项目环境:IntelliJ IDEA2017+maven3.5.0+MongoDB 3.2+JDK1.7+spring4.3.8

推荐网站(适合学习各种知识的基础):http://www.runoob.com/

mongo安装请参考:http://www.runoob.com/mongodb/mongodb-window-install.html

1. 创建maven工程

首相创建maven工程,New project:
创建maven工程

自行填写

这里不使用idea自带maven插件,改用下载好的3.5.0版maven;

由于最近osChina的maven仓库挂掉,推荐大家使用阿里的镜像,速度快的飞起
maven配置:D:\apache-maven-3.5.0\conf\setting.xml中找到mirrors:

  1. <mirrors>
  2. <mirror>
  3. <id>alimaven</id>
  4. <name>aliyun maven</name>
  5. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  6. <mirrorOf>central</mirrorOf>
  7. </mirror>
  8. </mirrors>

选择下好的本地maven3.5.0

next

项目结构如下图,手动创建相关文件夹及文件,并设置文件夹的对应属性:

工程目录

目录结构

至此,maven工程创建完毕。

2. 访问mongodb数据方式

这里daomongoDao分别为mongoDB的两种查询方式:

(1) daoJPA的查询方式(请参考springdataJPA);

(2) mongoDao使用mongoTemplate,类似于关系型数据库使用的jdbcTemplate

3. 详细代码

先看配置文件
spring-context.xml为最基本的spring配置:

  1. <?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. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context.xsd">
  9. <!-- 开启注解 -->
  10. <context:annotation-config></context:annotation-config>
  11. <!--扫描service包嗲所有使用注解的类型-->
  12. <context:component-scan base-package="com.lewis.mongo">
  13. <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:include-filter>
  14. </context:component-scan>
  15. <!-- 导入mongodb的配置文件 -->
  16. <import resource="spring-mongo.xml"></import>
  17. </beans>

spring-web.xml为springmvc的基本配置:

  1. <?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:mvc="http://www.springframework.org/schema/mvc"
  5. xmlns:context="http://www.springframework.org/schema/context"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/mvc
  9. http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
  10. http://www.springframework.org/schema/context
  11. http://www.springframework.org/schema/context/spring-context-4.0.xsd">
  12. <!--配置springmvc-->
  13. <!--1.开启springmvc注解模式-->
  14. <context:annotation-config></context:annotation-config>
  15. <!--简化配置:
  16. (1)主动注册DefaultAnnotationHandlerMapping,AnnotationMethodHandlerAdapter
  17. (2)提供一系列功能:数据绑定,数字和日期的format @NumberFormt @DataTimeFormat,xml json默认的读写支持-->
  18. <mvc:annotation-driven></mvc:annotation-driven>
  19. <!--servlet-mapping-->
  20. <!--2静态资源默认的servlet配置,
  21. (1)允许对静态资源的处理:js,gif
  22. (2)允许使用“/”做整体映射-->
  23. <!-- 容器默认的DefaultServletHandler处理 所有静态内容与无RequestMapping处理的URL-->
  24. <mvc:default-servlet-handler></mvc:default-servlet-handler>
  25. <!--3:配置jsp 显示viewResolver-->
  26. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  27. <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
  28. <property name="prefix" value="/WEB-INF/views/"></property>
  29. <property name="suffix" value=".jsp"></property>
  30. </bean>
  31. <!-- 4自动扫描且只扫描@Controller -->
  32. <context:component-scan base-package="com.lewis.mongo.controller"></context:component-scan>
  33. <!-- 定义无需Controller的url<->view直接映射 -->
  34. <mvc:view-controller path="/" view-name="redirect:/hi/hello"></mvc:view-controller>
  35. </beans>

spring-mongo.xml为mongo配置:

  1. <?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/beans
  7. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context.xsd
  10. http://www.springframework.org/schema/data/mongo
  11. http://www.springframework.org/schema/data/mongo/spring-mongo.xsd">
  12. <!-- 加载mongodb的属性配置文件 -->
  13. <context:property-placeholder location="classpath*:mongo.properties"></context:property-placeholder>
  14. <!-- spring连接mongodb数据库的配置 -->
  15. <mongo:mongo-client replica-set="${mongo.hostport}" id="mongo">
  16. <mongo:client-options connections-per-host="${mongo.connectionsPerHost}"
  17. threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
  18. connect-timeout="${mongo.connectTimeout}" max-wait-time="${mongo.maxWaitTime}"
  19. socket-timeout="${mongo.socketTimeout}"></mongo:client-options>
  20. </mongo:mongo-client>
  21. <!-- mongo的工厂,通过它来取得mongo实例,dbname为mongodb的数据库名,没有的话会自动创建 -->
  22. <mongo:db-factory id="mongoDbFactory" dbname="mongoLewis" mongo-ref="mongo"></mongo:db-factory>
  23. <!-- 只要使用这个调用相应的方法操作 -->
  24. <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
  25. <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"></constructor-arg>
  26. </bean>
  27. <!-- mongodb bean的仓库目录,会自动扫描扩展了MongoRepository接口的接口进行注入 -->
  28. <mongo:repositories base-package="com.lewis.mongo"></mongo:repositories>
  29. </beans>

mongo.properties:

  1. mongo.hostport=10.10.16.234:27017
  2. mongo.connectionsPerHost=8
  3. mongo.threadsAllowedToBlockForConnectionMultiplier=4
  4. #连接超时时间
  5. mongo.connectTimeout=1000
  6. #等待时间
  7. mongo.maxWaitTime=1500
  8. mongo.autoConnectRetry=true
  9. mongo.socketKeepAlive=true
  10. #Socket超时时间
  11. mongo.socketTimeout=1500
  12. mongo.slaveOk=true

pom.xml,这里要注意的是junit版本需要4.12以上,不然idea会报错;spring-data-mongodb版本要1.10.1以上;

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <properties>
  7. <!-- spring-framework-bom 版本号-->
  8. <spring.version>4.3.8.RELEASE</spring.version>
  9. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  10. </properties>
  11. <groupId>com.liu</groupId>
  12. <artifactId>mongo</artifactId>
  13. <version>1.0-SNAPSHOT</version>
  14. <packaging>war</packaging>
  15. <name>mongo Maven Webapp</name>
  16. <url>http://maven.apache.org</url>
  17. <dependencies>
  18. <!--使用junit4,注解的方式测试-->
  19. <!--<dependency>
  20. <groupId>junit</groupId>
  21. <artifactId>junit</artifactId>
  22. <version>4.11</version>
  23. <scope>test</scope>
  24. </dependency>-->
  25. <!-- https://mvnrepository.com/artifact/junit/junit -->
  26. <dependency>
  27. <groupId>junit</groupId>
  28. <artifactId>junit</artifactId>
  29. <version>4.12</version>
  30. <scope>test</scope>
  31. </dependency>
  32. <!--日志-->
  33. <!--日志 slf4j,log4j,logback,common-logging-->
  34. <!--slf4j是规范/接口-->
  35. <!--log4j,logback,common-logging是日志实现 本项目使用slf4j + logback -->
  36. <dependency>
  37. <groupId>org.slf4j</groupId>
  38. <artifactId>slf4j-api</artifactId>
  39. <version>1.7.12</version>
  40. </dependency>
  41. <!--实现slf4j并整合-->
  42. <dependency>
  43. <groupId>ch.qos.logback</groupId>
  44. <artifactId>logback-core</artifactId>
  45. <version>1.1.1</version>
  46. </dependency>
  47. <dependency>
  48. <groupId>ch.qos.logback</groupId>
  49. <artifactId>logback-classic</artifactId>
  50. <version>1.1.1</version>
  51. </dependency>
  52. <!--数据库相关-->
  53. <dependency>
  54. <groupId>mysql</groupId>
  55. <artifactId>mysql-connector-java</artifactId>
  56. <version>5.1.22</version>
  57. <!--maven工作范围 驱动在真正工作的时候使用,故生命周期改为runtime-->
  58. <scope>runtime</scope>
  59. </dependency>
  60. <!--servlet web相关 jstl1.2以上版本就不需要standard这个包了,
  61. 不然会报错: TLD skipped. URI: http://java.sun.com/jstl/core_rt is already defined-->
  62. <!--<dependency>
  63. <groupId>taglibs</groupId>
  64. <artifactId>standard</artifactId>
  65. <version>1.1.2</version>
  66. </dependency>-->
  67. <dependency>
  68. <groupId>jstl</groupId>
  69. <artifactId>jstl</artifactId>
  70. <version>1.2</version>
  71. </dependency>
  72. <dependency>
  73. <groupId>com.fasterxml.jackson.core</groupId>
  74. <artifactId>jackson-databind</artifactId>
  75. <version>2.5.4</version>
  76. </dependency>
  77. <!--spring-->
  78. <!--spring核心-->
  79. <dependency>
  80. <groupId>org.springframework</groupId>
  81. <artifactId>spring-core</artifactId>
  82. <version>4.3.8.RELEASE</version>
  83. </dependency>
  84. <!-- https://mvnrepository.com/artifact/org.springframework/spring-asm -->
  85. <dependency>
  86. <groupId>org.springframework</groupId>
  87. <artifactId>spring-asm</artifactId>
  88. <version>3.1.4.RELEASE</version>
  89. </dependency>
  90. <dependency>
  91. <groupId>org.springframework</groupId>
  92. <artifactId>spring-beans</artifactId>
  93. <version>4.3.8.RELEASE</version>
  94. </dependency>
  95. <dependency>
  96. <groupId>org.springframework</groupId>
  97. <artifactId>spring-context</artifactId>
  98. <version>4.3.8.RELEASE</version>
  99. </dependency>
  100. <!--spring dao-->
  101. <!--<dependency>
  102. <groupId>org.springframework.data</groupId>
  103. <artifactId>spring-data-mongodb</artifactId>
  104. <version>1.8.0.RELEASE</version>
  105. </dependency>-->
  106. <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-mongodb -->
  107. <dependency>
  108. <groupId>org.springframework.data</groupId>
  109. <artifactId>spring-data-mongodb</artifactId>
  110. <version>1.10.1.RELEASE</version>
  111. </dependency>
  112. <dependency>
  113. <groupId>org.mongodb</groupId>
  114. <artifactId>mongo-java-driver</artifactId>
  115. <version>3.2.2</version>
  116. </dependency>
  117. <dependency>
  118. <groupId>org.springframework</groupId>
  119. <artifactId>spring-tx</artifactId>
  120. <version>${spring.version}</version>
  121. </dependency>
  122. <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
  123. <dependency>
  124. <groupId>org.springframework</groupId>
  125. <artifactId>spring-aop</artifactId>
  126. <version>4.3.8.RELEASE</version>
  127. </dependency>
  128. <!--spring web-->
  129. <dependency>
  130. <groupId>org.springframework</groupId>
  131. <artifactId>spring-web</artifactId>
  132. <version>4.3.8.RELEASE</version>
  133. </dependency>
  134. <dependency>
  135. <groupId>org.springframework</groupId>
  136. <artifactId>spring-webmvc</artifactId>
  137. <version>4.3.8.RELEASE</version>
  138. </dependency>
  139. <!--spring test-->
  140. <dependency>
  141. <groupId>org.springframework</groupId>
  142. <artifactId>spring-test</artifactId>
  143. <version>4.3.8.RELEASE</version>
  144. </dependency>
  145. <dependency>
  146. <groupId>commons-collections</groupId>
  147. <artifactId>commons-collections</artifactId>
  148. <version>3.2.2</version>
  149. </dependency>
  150. <dependency>
  151. <groupId>commons-fileupload</groupId>
  152. <artifactId>commons-fileupload</artifactId>
  153. <version>1.3.2</version>
  154. </dependency>
  155. <dependency>
  156. <groupId>commons-codec</groupId>
  157. <artifactId>commons-codec</artifactId>
  158. <version>1.10</version>
  159. </dependency>
  160. <!-- https://mvnrepository.com/artifact/javax/javaee-api -->
  161. <dependency>
  162. <groupId>javax</groupId>
  163. <artifactId>javaee-api</artifactId>
  164. <version>7.0</version>
  165. <scope>provided</scope>
  166. </dependency>
  167. </dependencies>
  168. <dependencyManagement>
  169. <dependencies>
  170. <dependency>
  171. <groupId>org.springframework</groupId>
  172. <artifactId>spring-framework-bom</artifactId>
  173. <version>${spring.version}</version>
  174. <type>pom</type>
  175. <scope>import</scope>
  176. </dependency>
  177. <dependency>
  178. <groupId>net.sf.ehcache</groupId>
  179. <artifactId>ehcache-core</artifactId>
  180. <version>2.6.9</version>
  181. </dependency>
  182. </dependencies>
  183. </dependencyManagement>
  184. <build>
  185. <finalName>mongo</finalName>
  186. <plugins>
  187. <plugin>
  188. <groupId>org.apache.maven.plugins</groupId>
  189. <artifactId>maven-compiler-plugin</artifactId>
  190. <version>3.3</version>
  191. <configuration>
  192. <source>1.6</source>
  193. <target>1.6</target>
  194. </configuration>
  195. </plugin>
  196. </plugins>
  197. </build>
  198. </project>

两个实体类:

Address.java:

  1. package com.lewis.mongo.entity;
  2. /**
  3. * Created by liu on 2017/6/7.
  4. */
  5. public class Address {
  6. private String city;
  7. private String street;
  8. private int num;
  9. public Address() {
  10. }
  11. public Address(String city, String street, int num) {
  12. this.city = city;
  13. this.street = street;
  14. this.num = num;
  15. }
  16. public String getCity() {
  17. return city;
  18. }
  19. public void setCity(String city) {
  20. this.city = city;
  21. }
  22. public String getStreet() {
  23. return street;
  24. }
  25. public void setStreet(String street) {
  26. this.street = street;
  27. }
  28. public int getNum() {
  29. return num;
  30. }
  31. public void setNum(int num) {
  32. this.num = num;
  33. }
  34. @Override
  35. public String toString() {
  36. return "Address{" +
  37. "city='" + city + '\'' +
  38. ", street='" + street + '\'' +
  39. ", num=" + num + '}';
  40. }
  41. }

Person.java:

  1. package com.lewis.mongo.entity;
  2. import java.io.Serializable;
  3. import org.bson.types.ObjectId;
  4. import org.springframework.data.annotation.Id;
  5. import org.springframework.data.mongodb.core.mapping.Document;
  6. /**
  7. * Created by liu on 2017/6/7.
  8. */
  9. @Document(collection = "person")
  10. public class Person implements Serializable {
  11. @Id
  12. private ObjectId id;
  13. private String name;
  14. private int age;
  15. private Address address;
  16. public Person() {
  17. }
  18. public Person(String name, int age, Address address) {
  19. this.name = name;
  20. this.age = age;
  21. this.address = address;
  22. }
  23. public ObjectId getId() {
  24. return id;
  25. }
  26. public void setId(ObjectId id) {
  27. this.id = id;
  28. }
  29. public String getName() {
  30. return name;
  31. }
  32. public void setName(String name) {
  33. this.name = name;
  34. }
  35. public int getAge() {
  36. return age;
  37. }
  38. public void setAge(int age) {
  39. this.age = age;
  40. }
  41. public Address getAddress() {
  42. return address;
  43. }
  44. public void setAddress(Address address) {
  45. this.address = address;
  46. }
  47. @Override
  48. public String toString() {
  49. return "Person{" + "id=" + id +
  50. ", name='" + name + '\'' +
  51. ", age=" + age +
  52. ", address=" + address + '}';
  53. }
  54. }

JPA的dao,注意这里只要继承MongoRepository不用写注解spring就能认识这是个Repository,MongoRepository提供了基本的增删改查,不用实现便可直接调用,例如testMongo的personDao.save(persons);

PersonDao.java:

  1. package com.lewis.mongo.dao;
  2. import com.lewis.mongo.entity.Person;
  3. import org.bson.types.ObjectId;
  4. import org.springframework.data.mongodb.repository.MongoRepository;
  5. import org.springframework.data.mongodb.repository.Query;
  6. import java.util.List;
  7. /**
  8. * Created by liu on 2017/6/7.
  9. */
  10. public interface PersonDao extends MongoRepository<Person, ObjectId> {
  11. @Query(value = "{'age' : {'$gte' : ?0, '$lte' : ?1}, 'name' : ?2}", fields = "{'name' : 1, 'age' : 1}")
  12. List<Person> findByAge(int age1, int age2, String name);
  13. }

mongoTemplate的dao,PersonMongoDao.java:

  1. package com.lewis.mongo.mongoDao;
  2. import com.lewis.mongo.entity.Person;
  3. import java.util.List;
  4. /**
  5. * Created by liu on 2017/6/7.
  6. */
  7. public interface PersonMongoDao {
  8. List<Person> findAll();
  9. void insertPerson(Person user);
  10. void removePerson(String userName);
  11. void updatePerson();
  12. List<Person> findForRequery(String userName);
  13. }

PersonMongoImpl.java:

  1. package com.lewis.mongo.mongoDao;
  2. import com.lewis.mongo.entity.Person;
  3. import org.springframework.data.mongodb.core.MongoTemplate;
  4. import org.springframework.data.mongodb.core.query.Query;
  5. import org.springframework.data.mongodb.core.query.Update;
  6. import org.springframework.data.mongodb.core.query.Criteria;
  7. import org.springframework.stereotype.Repository;
  8. import javax.annotation.Resource;
  9. import java.util.List;
  10. /**
  11. * Created by liu on 2017/6/7.
  12. */
  13. @Repository("personMongoImpl")
  14. public class PersonMongoImpl implements PersonMongoDao {
  15. @Resource
  16. private MongoTemplate mongoTemplate;
  17. @Override
  18. public List<Person> findAll() {
  19. return mongoTemplate.findAll(Person.class, "person");
  20. }
  21. @Override
  22. public void insertPerson(Person person) {
  23. mongoTemplate.insert(person, "person");
  24. }
  25. @Override
  26. public void removePerson(String userName) {
  27. mongoTemplate.remove(Query.query(Criteria.where("name").is(userName)), "person");
  28. }
  29. @Override
  30. public void updatePerson() {
  31. mongoTemplate.updateMulti(Query.query(Criteria.where("age").gt(3).lte(5)), Update.update("age", 3), "person");
  32. }
  33. @Override
  34. public List<Person> findForRequery(String userName) {
  35. return mongoTemplate.find(Query.query(Criteria.where("name").is(userName)), Person.class);
  36. }
  37. }

JPA查询的测试类,PersonDaoTest.java:

  1. import com.lewis.mongo.dao.PersonDao;
  2. import com.lewis.mongo.entity.Address;
  3. import com.lewis.mongo.entity.Person;
  4. import org.junit.Test;
  5. import org.junit.runner.RunWith;
  6. import org.springframework.test.context.ContextConfiguration;
  7. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  8. import javax.annotation.Resource;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11. /**
  12. * Created by liu on 2017/6/7.
  13. */
  14. @RunWith(SpringJUnit4ClassRunner.class)
  15. //告诉junit spring配置文件
  16. @ContextConfiguration({"classpath:spring/spring-context.xml", "classpath:spring/spring-mongo.xml"})
  17. public class PersonDaoTest {
  18. @Resource
  19. private PersonDao personDao;
  20. /*先往数据库中插入10个person*/
  21. @Test
  22. public void testMongo() {
  23. List<Person> persons = new ArrayList<Person>();
  24. for (int i = 0; i < 10; i++) {
  25. persons.add(new Person("name" + i, i, new Address("广州市", "天河区", i)));
  26. }
  27. personDao.save(persons);
  28. }
  29. @Test
  30. public void findMongo() {
  31. System.out.println(personDao.findByAge(2, 8, "name6"));
  32. }
  33. }

mongoTemplate查询的测试类,MongoTemplateTest.java:

  1. import com.lewis.mongo.entity.Address;
  2. import com.lewis.mongo.entity.Person;
  3. import com.lewis.mongo.mongoDao.PersonMongoImpl;
  4. import org.junit.Test;
  5. import org.junit.runner.RunWith;
  6. import org.springframework.test.context.ContextConfiguration;
  7. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  8. import javax.annotation.Resource;
  9. /**
  10. * Created by liu on 2017/6/7.
  11. */
  12. @RunWith(SpringJUnit4ClassRunner.class)
  13. //告诉junit spring配置文件
  14. @ContextConfiguration({"classpath:spring/spring-context.xml", "classpath:spring/spring-mongo.xml"})
  15. public class MongoTemplateTest {
  16. @Resource
  17. private PersonMongoImpl personMongo;
  18. @Test
  19. public void testMongoTemplate() {
  20. //personMongo.insertPerson(new Person("Lewis",24,new Address("广州","天河",20)));
  21. personMongo.removePerson("name3");
  22. personMongo.updatePerson();
  23. System.out.println(personMongo.findAll());
  24. System.out.println(personMongo.findForRequery("Lewis"));
  25. }
  26. }

注意测试前请先通过PersonDaoTest.java中的testMongo()方法向数据库中插入数据。