这两天自己配置了一个通过Spring Data来连接Mongodb的测试项目,并采用dsl来进行查询和分页,首先是pom
然后是spring的配置文件
Document的映射
Repository
测试代码如下:
这里有一个问题,在eclipse里面,似乎不会自动生成QCustomer这些查询类,需要按Ctrl+F11打开Maven的任务列表运行Generate source,才会在target目录下生成QCustomer,还需要复制到src/main/java下才可以,对maven插件不熟,不知道有什么插件可以自动将那个目录加为src目录
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.nbrc</groupId>
<artifactId>sample</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>sample mongodb</name>
<properties>
<spring.version>3.2.1.RELEASE</spring.version>
<spring.data.mongo.version>1.1.1.RELEASE</spring.data.mongo.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- Spring 3 dependencies -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>${spring.data.mongo.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<!-- MongoDB Java Driver -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.7.1</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-mongodb</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.0.6</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor</processor>
<logOnlyOnError>true</logOnlyOnError>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-maven-release</id>
<name>Spring Maven Release Repository</name>
<url>http://maven.springframework.org/release</url>
</repository>
<repository>
<id>querydsl-releases</id>
<name>Query DSL</name>
<url>http://source.mysema.com/maven2/releases</url>
</repository>
</repositories>
</project>
然后是spring的配置文件
<?xml version="1.0"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
">
<!-- Connection to MongoDB server -->
<mongo:db-factory host="localhost" port="27017"
dbname="mytest" />
<!-- MongoDB Template -->
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
</bean>
<!-- Package w/ automagic repositories -->
<mongo:repositories base-package="com.nbrc.sample.repository" />
<context:annotation-config />
<context:component-scan base-package="com.nbrc">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
</beans>
Document的映射
package com.nbrc.sample.mapping;
import java.util.HashSet;
import java.util.Set;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
@Document
public class Customer extends AbstractDocument {
private String firstname, lastname;
@Field("email")
private EmailAddress emailAddress;
private Set<Address> addresses = new HashSet<Address>();
public Customer(String firstname, String lastname) {
this.firstname = firstname;
this.lastname = lastname;
}
//getter and setter
}
Repository
package com.nbrc.sample.repository;
import org.bson.types.ObjectId;
import org.springframework.data.querydsl.QueryDslPredicateExecutor;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import com.nbrc.sample.mapping.Customer;
@Repository
public interface CustomerRepository
extends CrudRepository<Customer, ObjectId> ,QueryDslPredicateExecutor<Customer>{
}
测试代码如下:
package com.nbrc.sample;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import com.nbrc.sample.mapping.Customer;
import com.nbrc.sample.mapping.EmailAddress;
import com.nbrc.sample.mapping.QCustomer;
import com.nbrc.sample.repository.CustomerRepository;
@ContextConfiguration(locations={"classpath:mongodb/mongotest-context.xml"})
public class TestMongo extends AbstractJUnit4SpringContextTests {
@Autowired
CustomerRepository repo;
@Before
public void setup(){
for(int i=0;i<=10;i++){
Customer c = new Customer("fox" + i , "red" + i);
//c.setEmailAddress(new EmailAddress("zjnb" + i + "@163.com"));
repo.save(c);
}
}
@Test
public void testpage(){
QCustomer query = QCustomer.customer;
PageRequest pr = new PageRequest(1, 3);
Page<Customer> pg = repo.findAll(query.firstname.like("%f%"), pr);
Assert.assertNotNull(pg);
Assert.assertTrue(pg.getSize()==3);
Customer c = pg.getContent().get(0);
System.out.println(c.getId());
Assert.assertEquals("fox3", c.getFirstname());
}
@After
public void clear(){
repo.deleteAll();
}
}
这里有一个问题,在eclipse里面,似乎不会自动生成QCustomer这些查询类,需要按Ctrl+F11打开Maven的任务列表运行Generate source,才会在target目录下生成QCustomer,还需要复制到src/main/java下才可以,对maven插件不熟,不知道有什么插件可以自动将那个目录加为src目录