<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mongo="http://www.springframework.org/schema/data/mongo" xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <context:property-placeholder location="classpath*:META-INF/mongodb/mongodb.properties"/> <!-- 定义mongo对象,对应的是mongodb官方jar包中的Mongo,replica-set设置集群副本的ip地址和端口 --> <mongo:mongo id="mongo" replica-set="localhost:27017"> <!-- 一些连接属性的设置 --> <mongo:options connections-per-host="${mongo.connectionsPerHost}" threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}" connect-timeout="${mongo.connectTimeout}" max-wait-time="${mongo.maxWaitTime}" auto-connect-retry="${mongo.autoConnectRetry}" socket-keep-alive="${mongo.socketKeepAlive}" socket-timeout="${mongo.socketTimeout}" slave-ok="${mongo.slaveOk}" write-number="1" write-timeout="0" write-fsync="true"/> </mongo:mongo> <!-- mongo的工厂,通过它来取得mongo实例,dbname为mongodb的数据库名,没有的话会自动创建 --> <mongo:db-factory dbname="test" mongo-ref="mongo"/> <!-- mongodb的主要操作对象,所有对mongodb的增删改查的操作都是通过它完成 --> <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/> </bean> <!-- 映射转换器,扫描back-package目录下的文件,根据注释,把它们作为mongodb的一个collection的映射 --> <mongo:mapping-converter base-package="com.xxx.xxx.domain" /> <!-- mongodb bean的仓库目录,会自动扫描扩展了MongoRepository接口的接口进行注入 --> <mongo:repositories base-package="com.xxx.xxx.persist.mongodb"/> <!-- To translate any MongoExceptions thrown in @Repository annotated classes --> <context:annotation-config /> </beans>
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中取出的数据。
以下引用一个官方文档的例子:
Person类
@Document(collection="person") @CompoundIndexes({ @CompoundIndex(name = "age_idx", def = "{'lastName': 1, 'age': -1}") }) public class Person<T extends Address> { @Id private String id; @Indexed(unique = true) private Integer ssn; private String firstName; @Indexed private String lastName; private Integer age; @Transient private Integer accountTotal; @DBRef private List<Account> accounts; private T address; public Person(Integer ssn) { this.ssn = ssn; } @PersistenceConstructor public Person(Integer ssn, String firstName, String lastName, Integer age, T address) { this.ssn = ssn; this.firstName = firstName; this.lastName = lastName; this.age = age; this.address = address; }
Account类
@Document public class Account { @Id private ObjectId id; private Float total; }
与HibernateRepository类似,通过继承MongoRepository接口,我们可以非常方便地实现对一个对象的增删改查,要使用Repository的功能,先继承MongoRepository<T, TD>接口,其中T为仓库保存的bean类,TD为该bean的唯一标识的类型,一般为ObjectId。之后在service中注入该接口就可以使用,无需实现里面的方法,spring会根据定义的规则自动生成。
例:
public interface PersonRepository extends MongoRepository<Person, ObjectId>{ //这里可以添加额外的查询方法 }
但是MongoRepository实现了的只是最基本的增删改查的功能,要想增加额外的查询方法,可以按照以下规则定义接口的方法。自定义查询方法,格式为“findBy+字段名+方法后缀”,方法传进的参数即字段的值,此外还支持分页查询,通过传进一个Pageable对象,返回Page集合。
例:
public interface PersonRepository extends MongoRepository<Person, ObjectId>{ //查询大于age的数据 public Page<Product> findByAgeGreaterThan(int age,Pageable page) ; }
下面是支持的查询类型,每三条数据分别对应:(方法后缀,方法例子,mongodb原生查询语句)
GreaterThan(大于)
findByAgeGreaterThan(int age)
{"age" : {"$gt" : age}}
LessThan(小于)
findByAgeLessThan(int age)
{"age" : {"$lt" : age}}
Between(在...之间)
findByAgeBetween(int from, int to)
{"age" : {"$gt" : from, "$lt" : to}}
IsNotNull, NotNull(是否非空)
findByFirstnameNotNull()
{"age" : {"$ne" : null}}
IsNull, Null(是否为空)
findByFirstnameNull()
{"age" : null}
Like(模糊查询)
findByFirstnameLike(String name)
{"age" : age} ( age as regex)
(No keyword) findByFirstname(String name)
{"age" : name}
Not(不包含)
findByFirstnameNot(String name)
{"age" : {"$ne" : name}}
Near(查询地理位置相近的)
findByLocationNear(Point point)
{"location" : {"$near" : [x,y]}}
Within(在地理位置范围内的)
findByLocationWithin(Circle circle)
{"location" : {"$within" : {"$center" : [ [x, y], distance]}}}
Within(在地理位置范围内的)
findByLocationWithin(Box box)
{"location" : {"$within" : {"$box" : [ [x1, y1], x2, y2]}}}
尽管以上查询功能已经很丰富,但如果还不能满足使用情况的话可以用一下方法---基于mongodb原本查询语句的查询方式。
例:在原接口中加入
@Query("{ 'name':{'$regex':?2,'$options':'i'}, sales': {'$gte':?1,'$lte':?2}}") public Page<Product> findByNameAndAgeRange(String name,double ageFrom,double ageTo,Pageable page);
注释Query里面的就是mongodb原来的查询语法,我们可以定义传进来的查询参数,通过坐标定义方法的参数。
还可以在后面指定要返回的数据字段,如上面的例子修改如下,则只通过person表里面的name和age字段构建person对象。
@Query(value="{ 'name':{'$regex':?2,'$options':'i'}, sales':{'$gte':?1,'$lte':?2}}",fields="{ 'name' : 1, 'age' : 1}") public Page<Product> findByNameAndAgeRange(String name,double ageFrom,double ageTo,Pageable page);
相关推荐
这个版本可能包含了性能优化、新的特性和修复的bug,确保了与MongoDB 3.2的无缝集成。 **3. MongoDB 3.2特性** MongoDB 3.2引入了许多重要的改进,包括: - **新查询语言:** 引入了聚合框架的改进,如`$lookup`...
在本篇“MongoDB初探(二)----使用spring-data配置mongodb”中,我们将深入探讨如何利用Spring Data框架来集成和操作MongoDB数据库。Spring Data是Spring生态系统的一个重要组成部分,它提供了与各种数据存储系统...
4. **Spring Data MongoDB**: 这是Spring Data的一个模块,专门用于与MongoDB集成。它提供了MongoTemplate和MongoOperations接口,用于执行数据库操作,还提供了一套Repository接口,允许开发者以声明式的方式定义...
这个框架支持快速开发且易于理解,它与 Spring 框架的其它部分能够很好地集成。 文档的标题为 "spring-data-mongodb-parent-reference",意味着这份PDF文档是关于如何使用Spring Data MongoDB的参考资料。文档的...
- **设置 Spring Data MongoDB**:配置 Spring 应用程序上下文以使用 MongoDB。 **4.2 示例 Repository** - **ExamplesRepository**:通过示例代码演示如何使用 Spring Data MongoDB 进行数据访问。 **4.3 连接到...
1. **添加依赖**:首先,我们需要在 `pom.xml` 或 `build.gradle` 文件中引入 Spring Boot 对 MongoDB 的支持。对于 Maven,可以添加如下依赖: ```xml <groupId>org.springframework.boot <artifactId>spring-...
- 这些特性极大地丰富了与 MongoDB 交互的方式,使得 **Spring Data MongoDB** 成为了与 MongoDB 集成的理想选择。 总之,**Spring Data MongoDB** 是一个强大的工具,它不仅简化了与 MongoDB 数据库的交互,还提供...
Spring Data MongoDB 1.2.0.RELEASE 为开发者提供了强大的工具,简化了 MongoDB 与 Spring 应用的集成。通过使用该版本,开发者可以更专注于业务逻辑,而不是繁琐的数据访问代码。理解并熟练掌握其核心概念和功能,...
SpringBoot 集成 MyBatis 主要通过 `mybatis-spring-boot-starter` 依赖,配置 MyBatis 的核心配置文件和 mapper 映射文件,可以实现 SQL 语句与 Java 代码的解耦。 MySQL 是一个广泛使用的开源关系型数据库管理...
Spring Data MongoDB提供了与MongoDB Java驱动程序的集成,包括连接池管理、会话管理以及异常转换。它封装了MongoDB的复杂性,让开发者能够专注于业务逻辑,而不是底层数据库操作。 **4. 使用示例** 在实际开发中,...
Spring Data MongoDB可以与MongoDB的分片和复制集集成,以实现水平扩展和高可用性。 10. **版本控制与审计**: Spring Data MongoDB可以通过`@Version`注解实现乐观锁,以处理并发更新。同时,它还支持日志记录和...
在本文中,我们将深入探讨如何在Spring Boot应用中配置MongoDB连接池,同时也会涉及到Spring Boot与MyBatis以及MySQL数据库的整合。Spring Boot以其简洁的配置和强大的自动化配置功能,已经成为Java开发者构建微服务...
1. **依赖注入(Dependency Injection,DI)**:这是Spring框架的核心特性,它允许开发者通过外部配置来管理对象及其依赖关系,从而降低了代码的耦合度,提高了可测试性和可维护性。 2. **AOP(面向切面编程)**:...
3. **数据访问**:"spring-boot-sample-data-jpa"和"spring-boot-sample-data-mongodb"分别演示了如何与关系型数据库(如MySQL、PostgreSQL)和非关系型数据库(如MongoDB)集成,使用JPA和Spring Data进行数据操作...
本案例主要介绍了如何在 Spring 4.1.3.RELEASE 版本下集成 MongoDB,并通过 Spring Data MongoDB 1.8.0 进行简单的数据操作。 #### 二、环境准备 - **Spring版本**:4.1.3.RELEASE - **Spring Data MongoDB版本**...
总结来说,Spring Data MongoDB通过`MongoDBTemplate`简化了MongoDB的集成和操作,使得开发者能够专注于业务逻辑而不是底层数据库交互。对于初学者,这是一个很好的起点,可以快速上手MongoDB和Spring Data的使用。
Spring Data Commons是一个核心模块,提供了与各种数据存储交互的一般机制,而`spring-data-mongo`则是专门针对MongoDB的数据访问层。这个组合使得Java开发者能够以一种声明式的方式处理MongoDB的数据操作,减少了...
在IT行业中,Spring框架与MongoDB的集成是常见的开发需求,尤其在4.2版本时,Spring提供了对MongoDB的强大支持。本知识点将详细介绍Spring 4.2与MongoDB的集成,以及涉及到的相关jar包。 首先,Spring 4.2是Spring...
标题“spring-mongodb-jars”表明我们关注的是Spring框架与MongoDB数据库的集成应用。Spring是Java领域的一个广泛应用框架,而MongoDB则是一种流行的NoSQL数据库系统,以其灵活性和高性能著称。它们的结合使得开发者...
主要模块有Core Container(核心容器)、Data Access/Integration(数据访问与集成)、Web、AOP(面向切面编程)和Messaging(消息处理)。核心容器包括Bean工厂(BeanFactory)和ApplicationContext,它们是Spring...