Loading...
Spring Framework项目集成Spring Data MongoDB

mongoDB笔记 2015/12/18 Spring Framework , MongoDB

以下简要记录Spring Framework项目集成Spring Data MongoDB的过程步骤

#首先引入依赖的类库,Spring Framework项目使用的是Gradle构建工具,所以依赖引入如下:

    //Spring data mongodb begin
    compile 'org.springframework.data:spring-data-mongodb:1.8.0.RELEASE'
    compile 'com.mysema.querydsl:querydsl-apt:3.6.7'
    compile 'com.mysema.querydsl:querydsl-mongodb:3.6.7'
    //Spring data mongodb end
    
    //mongodb driver begin
    compile 'org.mongodb:mongo-java-driver:2.12.3'
    //mongodb driver end
    
   //需要引入测试依赖包
   testCompile 'org.springframework:spring-test:4.2.1.RELEASE'
   //引入junit依赖包
   testCompile group: 'junit', name: 'junit', version: '4.+'


#添加mongodb配置文件applicationContext-mongodb.xml,配置文件内容如下:

<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.8.xsd" 
default-lazy-init="false">
<description>applicationContext</description>

<mongo:mongo host="${mongo.host}" port="${mongo.port}">
<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>

<!-- Factory bean that creates the Mongo instance -->
<mongo:db-factory dbname="${mongo.databaseName}" mongo-ref="mongo" username="${mongo.username}" password="${mongo.password}" />

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
</bean>

<mongo:repositories base-package="cn.imethan" mongo-template-ref="mongoTemplate"
base-class="cn.imethan.common.mongodb.BaseRepositoryImpl" />

<!-- Use this post processor to translate any MongoExceptions thrown in @Repository annotated classes -->
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
<!-- Enabling Spring Data web support in XML -->
<bean class="org.springframework.data.web.config.SpringDataWebConfiguration" />
</beans>


#添加属性配置文件mongo.properties,配置文件内容如下:

#local mongo db 
mongo.host=127.0.0.1
mongo.port=27017
mongo.username=
mongo.password=
mongo.databaseName=test

mongo.connectionsPerHost=8
mongo.threadsAllowedToBlockForConnectionMultiplier=4
mongo.connectTimeout=1000
mongo.maxWaitTime=1500
mongo.autoConnectRetry=true
mongo.socketKeepAlive=true
mongo.socketTimeout=1500
mongo.slaveOk=true


#增加通用基础Repository接口BaseRepository和Repository接口实现类BaseRepositoryImpl

/**
 * BaseRepository.java
 *
 * @author Ethan Wong
 * @since JDK 1.7
 * @datetime 2015年9月30日下午6:06:15
 */
@NoRepositoryBean
public interface BaseRepository<T, ID extends Serializable> extends MongoRepository<T, ID> {
/**
* Get {@link MongoOperations}.
* @return
*
* @author Ethan Wong
* @datetime 2015年10月1日上午5:38:14
*/
public MongoOperations getMongoOperations();
/**
* Get {@link MongoEntityInformation}.
* @return
*
* @author Ethan Wong
* @datetime 2015年10月1日上午5:39:49
*/
public MongoEntityInformation<T, ID> getMongoEntityInformation();
}
/**
 * BaseRepositoryImpl.java
 *
 * @author Ethan Wong
 * @since JDK 1.7
 * @datetime 2015年9月30日下午6:08:09
 */
public class BaseRepositoryImpl<T, ID extends Serializable> extends SimpleMongoRepository<T, ID>implements BaseRepository<T, ID> {

private MongoOperations mongoOperations;
private MongoEntityInformation<T, ID> metadata;

public BaseRepositoryImpl(MongoEntityInformation<T, ID> metadata, MongoOperations mongoOperations) {
super(metadata, mongoOperations);
this.mongoOperations = mongoOperations;
this.metadata = metadata;
}

@Override
public MongoOperations getMongoOperations() {
return mongoOperations;
}

@Override
public MongoEntityInformation<T, ID> getMongoEntityInformation() {
return metadata;
}
}


#以上基础配置完成,以下开始测试

#添加自定义Repository接口

/**
 * ChannelRepository.java
 *
 * @author Ethan Wong
 * @time 2014年3月2日下午4:44:45
 */
@Repository
public interface ChannelRepository extends MongoRepository<Channel, String>,
ChannelRepositoryCustom<Channel, String>, BaseRepository<Channel, String> {
/**
* @see http://docs.spring.io/spring-data/data-mongo/docs/1.8.0.RELEASE/reference/html/
*
* @author Ethan Wong
* @datetime 2015年10月1日上午5:21:48
*/
Long countByTitle(String title);
Long deleteByTitle(String title);

List<Channel> removeByTitle(String title);
List<Channel> findByTitle(String title);
List<Channel> findByTitle(String title, Sort sort);

Page<Channel> findByTitle(String title, Pageable pageable);
//Slice<Channel> findByTitle(String title, Pageable pageable);
//List<Channel> findByTitle(String title, Pageable pageable);
List<Channel> findTop3ByTitle(String title, Pageable pageable);
List<Channel> findFirst10ByTitle(String title, Sort sort);


List<Channel> readAllByTitleNotNull();
}


# Channel类:

/**
 * Channel.java
 *
 * @author Ethan Wong
 * @time 2014年3月2日下午4:44:32
 */
@Document
public class Channel extends BaseDocument implements Serializable{

private static final long serialVersionUID = -3919470868083141326L;
private String title;//标题
private String describe;//描述

public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescribe() {
return describe;
}
public void setDescribe(String describe) {
this.describe = describe;
}
}


#添加单元测试类ChannelRepositoryTest,其中applicationContext.xml为Spring Framework的配置文件

/**
 * ChannelRepositoryTest.java
 *
 * @author Ethan Wong
 * @time 2014年3月12日下午2:39:27
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/main/applicationContext.xml",
"classpath*:/mongodb/applicationContext-mongodb.xml"
})
public class ChannelRepositoryTest {
@Autowired
private ChannelRepository channelRepository;

     @Test
public void testQuery(){
String name = channelRepository.getDbName();
System.out.println("name:"+name);
Pageable  pageable  = new PageRequest(0,10,Direction.DESC,"createTime");
String title = "标题1";
long count = channelRepository.countByTitle(title);
System.out.println("count:"+count);
List<Channel> list = channelRepository.findByTitle(title);
System.out.println("list:"+list);
List<Channel> list1 = channelRepository.findTop3ByTitle(title, pageable);
System.out.println("list1:"+list1);
List<Channel> list2 = channelRepository.readAllByTitleNotNull();
System.out.println("list2:"+list2);
MongoTemplate mongoTemplate = (MongoTemplate) channelRepository.getMongoOperations();
List<Channel> list3 = mongoTemplate.findAll(channelRepository.getMongoEntityInformation().getJavaType());
System.out.println("list3:"+list3);
Query query = new Query(Criteria.where("title").is(title));
Update update = new Update().set("describe", "随便更新点什么");
Channel channel = mongoTemplate.findAndModify(query, update, Channel.class);
System.out.println("channel:"+channel);
}
}



#参考文档

http://docs.spring.io/spring-data/data-mongo/docs/1.8.0.RELEASE/reference/html/

http://docs.spring.io/spring/docs/4.1.7.RELEASE/spring-framework-reference/htmlsingle/




Comments