spring-data-mongodb MongoDB 整合 Spring

本文介绍如何使用 Spring Data MongoDB 进行 MongoDB 的整合,包括依赖配置、实体定义、CRUD 操作及 Spring 配置等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.         Set<String> colls = this.mongoTemplate.getCollectionNames();  
  26.         for (String coll : colls) {  
  27.             System.out.println("CollectionName=" + coll);  
  28.         }  
  29.         DB db = this.mongoTemplate.getDb();  
  30.         System.out.println("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.         Query query = new Query();  
  41.         query.with(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.         Query query = new Query();  
  48.         query.addCriteria(new Criteria("name").is(name));  
  49.         return this.mongoTemplate.find(query, User.class);  
  50.     }  
  51.   
  52.     public User findOne(String id) {  
  53.         Query query = new Query();  
  54.         query.addCriteria(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.         Query query = new Query();  
  65.         query.addCriteria(new Criteria("_id").is(entity.getId()));  
  66.         Update update = new Update();  
  67.         update.set("birthday", entity.getBirthday());  
  68.         update.set("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.     http://www.springframework.org/schema/context/spring-context.xsd">  
  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.         ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");    
  14.         UserRepository userRepository = context.getBean(UserRepository.class);  
  15.         userRepository.test();  
  16.         userRepository.createCollection();  
  17.         User user = new User();  
  18.         user.setId(UUID.randomUUID().toString());  
  19.         user.setName("jack");  
  20.         user.setBirthday(new Date());  
  21.         userRepository.insert(user);  
  22.         System.out.println(userRepository.findListByName("jack"));;  
  23.     }  
  24. }  

参考文档:

1.Spring Data for Mongo 介绍

2.详解Spring整合MongoDB
3.Spring Mongodb集成
4.使用Spring Data来操作MongoDB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值