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
- <dependency>
- <groupId>org.mongodb</groupId>
- <artifactId>mongo-java-driver</artifactId>
- <version>2.13.0</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.data</groupId>
- <artifactId>spring-data-mongodb</artifactId>
- <version>1.6.2.RELEASE</version>
- </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
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
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
?
1. monngo.host=192.168.36.61
2. monngo.port=23000
application-context.xml
[html] view plain copy
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,使用同一个配置库,问题解决,具体配置如下:
|
其中,replica-set格式:ip1:port,ip2:port,...
5.测试
Test.java
[java] view plain copy
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. }
参考文档:
2.详解Spring整合MongoDB 3.Spring Mongodb集成