spring Data for MongoDB是Spring Data的一个子模块。 目标是为mongodb提供一个相近的一致的基于Spring的编程模型。

Spring Data for MongoDB核心功能是映射POJO到Mongo的DBCollection中的文档,并且提供Repository 风格数据访问层。


特性:

1.可以通过@Configuration注解或者XML风格配置

2.MongoTemplate 辅助类 (类似JdbcTemplate),方便常用的CRUD操作

3.异常转换

4.丰富的对象映射

5.通过注解指定对象映射

6.持久化和映射声明周期事件

7.通过MongoReader/MongoWriter 定义底层的映射

8.基于Java的Query, Criteria, Update DSL

9.自动实现Repository,可以提供定制的查找

10.QueryDSL 支持类型安全的查询

11.跨数据库平台的持久化 - 支持JPA with Mongo

12.GeoSpatial 支持

13.Map-Reduce 支持

14.JMX管理和监控

15.CDI 支持

16.GridFS 支持


Spring Data for MongoDB提供了两种编程风格来应用MongoDB:

1.Spring Data Repository 风格

Spring Data提供了repository 抽象方式,可以极大的减少数据访问层千篇一律的类似的重复的代码。 基本DAO都会实现,find,findAll, findById, save, delete,update等方法,而且代码逻辑基本一致。Spring Data提供了简化方法,通过接口定义 Spring Data通过Proxy自动提供具体的实现。

2.MongoTemplate方式

Spring Data for MongoDB还提供了另外一种方式, 类似JdbcTemplate的方式。 这种方式你可以自己定义你的repository的编程方式。 这种方式让你感觉更灵活, 不被上面的各种约定束缚住。你可以通过XML或者JavaConfig方式配置MongoTemplate.


官网:http://projects.spring.io/spring-data-mongodb/

下面我们实例说明spring-data-mongodb的使用。

1.添加依赖jar包



[html]  view plain  copy


 print

?



  1. <dependency>  
  2. <groupId>org.mongodb</groupId>  
  3. <artifactId>mongo-java-driver</artifactId>  
  4. <version>2.13.0</version>  
  5. </dependency>  
  6. <dependency>  
  7. <groupId>org.springframework.data</groupId>  
  8. <artifactId>spring-data-mongodb</artifactId>  
  9. <version>1.6.2.RELEASE</version>  
  10. </dependency>  


2.定义实体

spring-data-mongodb中的实体映射是通过MongoMappingConverter这个类实现的。它可以通过注释把Java类转换为mongodb的文档。
它有以下几种注释:
@Id - 文档的唯一标识,在mongodb中为ObjectId,它是唯一的,通过时间戳+机器标识+进程ID+自增计数器(确保同一秒内产生的Id不会冲突)构成。
@Document - 把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档。
@DBRef - 声明类似于关系数据库的关联关系。ps:暂不支持级联的保存功能,当你在本实例中修改了DERef对象里面的值时,单独保存本实例并不能保存DERef引用的对象,它要另外保存,如下面例子的Person和Account。
@Indexed - 声明该字段需要索引,建索引可以大大的提高查询效率。
@CompoundIndex - 复合索引的声明,建复合索引可以有效地提高多字段的查询效率。
@GeoSpatialIndexed - 声明该字段为地理信息的索引。
@Transient - 映射忽略的字段,该字段不会保存到mongodb。
@PersistenceConstructor - 声明构造函数,作用是把从数据库取出的数据实例化为对象。该构造函数传入的值为从DBObject中取出的数据。



[java]  view plain  copy


 print

?


1. package cn.slimsmart.mongodb.demo.spring;  
2.   
3. import java.util.Date;  
4.   
5. import org.springframework.data.annotation.Id;  
6. import org.springframework.data.mongodb.core.index.CompoundIndex;  
7. import org.springframework.data.mongodb.core.index.CompoundIndexes;  
8. import org.springframework.data.mongodb.core.index.Indexed;  
9. import org.springframework.data.mongodb.core.mapping.Document;  
10.   
11. @Document(collection = "user")   
12. @CompoundIndexes({    
13. @CompoundIndex(name = "birthday_idx", def = "{'name': 1, 'birthday': -1}")    
14. })    
15. public class User {  
16.       
17. @Id  
18. @Indexed(unique = true)  
19. private String id;  
20. @Indexed  
21. private String name;  
22. private Date birthday;  
23. public String getId() {  
24. return id;  
25.     }  
26. public void setId(String 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 Date getBirthday() {  
36. return birthday;  
37.     }  
38. public void setBirthday(Date birthday) {  
39. this.birthday = birthday;  
40.     }  
41. @Override  
42. public String toString() {  
43. return "User[id="+id+",name="+name+",birthday="+birthday+"]";  
44.     }  
45.       
46. }


3.CRUD实现



[java]  view plain  copy


 print

?


1. package cn.slimsmart.mongodb.demo.spring;  
2.   
3. import java.util.List;  
4. import java.util.Set;  
5.   
6. import org.springframework.beans.factory.annotation.Autowired;  
7. import org.springframework.data.domain.Sort;  
8. import org.springframework.data.domain.Sort.Direction;  
9. import org.springframework.data.domain.Sort.Order;  
10. import org.springframework.data.mongodb.core.MongoTemplate;  
11. import org.springframework.data.mongodb.core.query.Criteria;  
12. import org.springframework.data.mongodb.core.query.Query;  
13. import org.springframework.data.mongodb.core.query.Update;  
14. import org.springframework.stereotype.Repository;  
15.   
16. import com.mongodb.DB;  
17.   
18. @Repository  
19. public class UserRepository {  
20.   
21. @Autowired  
22. private MongoTemplate mongoTemplate;  
23.   
24. public void test() {  
25. this.mongoTemplate.getCollectionNames();  
26. for (String coll : colls) {  
27. "CollectionName=" + coll);  
28.         }  
29. this.mongoTemplate.getDb();  
30. "db=" + db.toString());  
31.     }  
32.   
33. public void createCollection() {  
34. if (!this.mongoTemplate.collectionExists(User.class)) {  
35. this.mongoTemplate.createCollection(User.class);  
36.         }  
37.     }  
38.   
39. public List<User> findList(int skip, int limit) {  
40. new Query();  
41. new Sort(new Order(Direction.ASC, "id")));  
42.         query.skip(skip).limit(limit);  
43. return this.mongoTemplate.find(query, User.class);  
44.     }  
45.   
46. public List<User> findListByName(String name) {  
47. new Query();  
48. new Criteria("name").is(name));  
49. return this.mongoTemplate.find(query, User.class);  
50.     }  
51.   
52. public User findOne(String id) {  
53. new Query();  
54. new Criteria("_id").is(id));  
55. return this.mongoTemplate.findOne(query, User.class);  
56.     }  
57.   
58. public void insert(User entity) {  
59. this.mongoTemplate.insert(entity);  
60.   
61.     }  
62.   
63. public void update(User entity) {  
64. new Query();  
65. new Criteria("_id").is(entity.getId()));  
66. new Update();  
67. "birthday", entity.getBirthday());  
68. "name", entity.getName());  
69. this.mongoTemplate.updateFirst(query, update, User.class);  
70.     }  
71. }

4.spring配置

mongodb.properties



[plain]  view plain  copy


 print

? 
   
 
1. monngo.host=192.168.36.61  
2. monngo.port=23000

application-context.xml


[html]  view plain  copy


 print

?

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" xmlns:context="http://www.springframework.org/schema/context"  
4. xmlns:mongo="http://www.springframework.org/schema/data/mongo"  
5. xsi:schemaLocation="  
6.     http://www.springframework.org/schema/data/mongo   
7.     http://www.springframework.org/schema/data/mongo/spring-mongo.xsd  
8.     http://www.springframework.org/schema/beans   
9.     http://www.springframework.org/schema/beans/spring-beans.xsd  
10.     http://www.springframework.org/schema/context    
11. >  
12.   
13. <context:component-scan base-package="cn.slimsmart.mongodb.demo.spring" />  
14. <context:property-placeholder location="classpath*:mongodb.properties" />  
15.   
16. <mongo:mongo id="mongo" host="${monngo.host}" port="${monngo.port}">  
17. <mongo:options connections-per-host="8"  
18. threads-allowed-to-block-for-connection-multiplier="4"  
19. connect-timeout="1000" max-wait-time="1500" auto-connect-retry="true"  
20. socket-keep-alive="true" socket-timeout="1500" slave-ok="true"  
21. write-number="1" write-timeout="0" write-fsync="true" />  
22. </mongo:mongo>  
23. <!-- mongo的工厂,通过它来取得mongo实例,dbname为mongodb的数据库名,没有的话会自动创建 -->  
24. <mongo:db-factory id="mongoDbFactory" dbname="User"  
25. mongo-ref="mongo" />  
26.   
27. <!-- mongodb的主要操作对象,所有对mongodb的增删改查的操作都是通过它完成 -->  
28. <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">  
29. <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />  
30. </bean>  
31.   
32. <!-- 映射转换器,扫描back-package目录下的文件,根据注释,把它们作为mongodb的一个collection的映射 User -->  
33. <mongo:mapping-converter base-package="cn.slimsmart.mongodb.demo.spring" />  
34.   
35. <!-- mongodb bean的仓库目录,会自动扫描扩展了MongoRepository接口的接口进行注入 -->  
36. <mongo:repositories base-package="cn.slimsmart.mongodb.demo.spring" />  
37. <!-- To translate any MongoExceptions thrown in @Repository annotated classes -->   
38. <context:annotation-config />  
39.   
40. </beans>


部署几个Mongos,使用同一个配置库,问题解决,具体配置如下:


<mongo:mongo  id="mongo"replica-set="${mongodb.replica-set}"> 
             <mongo:options connections-per-host="${mongodb.connectionsPerHost}" 
                 threads-allowed-to-block-for-connection-multiplier="${mongodb.threads-allowed-to-block-for-connection-multiplier}" 
                 connect-timeout="${mongodb.connect-timeout}"max-wait-time="${mongodb.max-wait-time}"auto-connect-retry="${mongodb.auto-connect-retry}" 
                 socket-keep-alive="${mongodb.socket-keep-alive}"socket-timeout="${mongodb.socket-timeout}"slave-ok="${mongodb.slave-ok}" 
                 write-number="${mongodb.write-number}"write-timeout="${mongodb.write-timeout}"write-fsync="${mongodb.write-fsync}"/> 
         </mongo:mongo>

其中,replica-set格式:ip1:port,ip2:port,...


5.测试


Test.java



[java]  view plain  copy


 print

?

1. package cn.slimsmart.mongodb.demo.spring;  
2.   
3. import java.util.Date;  
4. import java.util.UUID;  
5.   
6. import org.springframework.context.ConfigurableApplicationContext;  
7. import org.springframework.context.support.ClassPathXmlApplicationContext;  
8.   
9. public class Test {  
10.   
11. public static void main(String[] args) {  
12. @SuppressWarnings("resource")  
13. new ClassPathXmlApplicationContext("application-context.xml");    
14. class);  
15.         userRepository.test();  
16.         userRepository.createCollection();  
17. new User();  
18.         user.setId(UUID.randomUUID().toString());  
19. "jack");  
20. new Date());  
21.         userRepository.insert(user);  
22. "jack"));;  
23.     }  
24. }


参考文档:

1.Spring Data for Mongo 介绍


2.详解Spring整合MongoDB 3.Spring Mongodb集成

4.使用Spring Data来操作MongoDB