spring整合mongodb实例 spring整合mongodb

spring整合mongodb

 

使用spring整合mongodb

maven 依赖

复制代码
 <dependency>
         <groupId>org.mongodb</groupId>
         <artifactId>mongo-java-driver</artifactId>
         <version>2.13.0-rc0</version>
     </dependency>

     <dependency>
         <groupId>org.springframework.data</groupId>
         <artifactId>spring-data-mongodb</artifactId>
         <version>1.7.1.RELEASE</version>
     </dependency>
     <dependency>
         <groupId>org.springframework.data</groupId>
         <artifactId>spring-data-mongodb-cross-store</artifactId>
         <version>1.7.1.RELEASE</version>
     </dependency>
     <dependency>
         <groupId>org.springframework.data</groupId>
         <artifactId>spring-data-mongodb-log4j</artifactId>
         <version>1.7.1.RELEASE</version>
     </dependency>
复制代码

mongodb.properties

复制代码
mongo.host=dev.iwhere.com
mongo.port=27017
mongo.connectionsPerHost=8
mongo.threadsAllowedToBlockForConnectionMultiplier=4
mongo.connectTimeout=1000
mongo.maxWaitTime=1500
mongo.autoConnectRetry=true
mongo.socketKeepAlive=true
mongo.socketTimeout=1500
mongo.slaveOk=true
mongo.writeNumber=1
mongo.riteTimeout=0
mongo.writeFsync=true
复制代码

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:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
    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-3.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-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/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    
    <context:component-scan base-package="com.mongo" />
    <!-- 获取配置资源 -->
    <context:property-placeholder location="classpath:mongodb-context-config.properties" />
    
    
    <mongo:mongo id="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>
    <!-- 设置使用的数据库 名-->
    <mongo:db-factory dbname="test" mongo-ref="mongo"/>
    <!-- mongodb的模板 -->
    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
       <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
    </bean>
</beans>

复制代码

使用 mongotemplate的常用操作

复制代码
package com.iwhere.test2;

import static org.springframework.data.mongodb.core.query.Criteria.where;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.mongodb.core.FindAndModifyOptions;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

public class MongoSpringTest {

  @Autowried private MongoTemplate mongoTemplate;
  // 使用spring整合的话, 就直接注入就可以了, 这是测试uanjing
@Before public void testBefore() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-mvc-servlet.xml"); mongoTemplate = (MongoTemplate) context.getBean("mongoTemplate"); } /** * 插入用户信息 */ @Test public void testAddUser() { User zhanggc = new User(); zhanggc.setName1("zhangguochen"); zhanggc.setAge(29); List<String> interests = new ArrayList<String>(); interests.add("stuty"); interests.add("hadoop"); zhanggc.setInterest(interests); Home home = new Home("henan"); zhanggc.setHome(home); // 插入数据 mongoTemplate.insert(zhanggc); } /** * 查询用户信息 */ @Test public void testQueryUser() { // 查询主要用到Query和Criteria两个对象 Query query = new Query(); Criteria criteria = where("age").gt(22); // 大于 // criteria.and("name").is("cuichongfei");等于 // List<String> interests = new ArrayList<String>(); // interests.add("study"); // interests.add("linux"); // criteria.and("interest").in(interests); in查询 // criteria.and("home.address").is("henan"); 内嵌文档查询 // criteria.and("").exists(false); 列存在 // criteria.and("").lte(); 小于等于 // criteria.and("").regex(""); 正则表达式 // criteria.and("").ne(""); 不等于 // 多条件查询 // criteria.orOperator(Criteria.where("key1").is("0"),Criteria.where("key1").is(null)); query.addCriteria(criteria); List<User> userList1 = mongoTemplate.find(query, User.class); printList(userList1); // 排序查询sort方法,按照age降序排列 // query.sort().on("age", Order.DESCENDING); // List<User> userList2 = mongoTemplate.find(query, User.class); // printList(userList2);

     // 排序 

      Query query = new Query();
      query.with(new Sort(Direction.ASC, "priority").and(new Sort(Direction.ASC, "create_time")));


// 指定字段查询,只查询age和name两个字段 // query.fields().include("age").include("name"); // List<User> userList3 = mongoTemplate.find(query, User.class); // printList(userList3); // 分页查询 // query.skip(2).limit(3); // List<User> userList4 = mongoTemplate.find(query, User.class); // printList(userList4); // 查询所有 // printList(mongoTemplate.findAll(User.class)); // 统计数据量 // System.out.println(mongoTemplate.count(query, User.class)); } /** * 更新用户数据 */ @Test public void testUpdateUser() { // update(query,update,class) // Query query:需要更新哪些用户,查询参数 // Update update:操作符,需要对数据做什么更新 // Class class:实体类 // 更新age大于24的用户信息 Query query = new Query(); query.addCriteria(where("age").gt(24)); Update update = new Update(); // age值加2 update.inc("age", 2); // update.set("name", "zhangsan"); 直接赋值 // update.unset("name"); 删去字段 // update.push("interest", "java"); 把java追加到interest里面,interest一定得是数组 // update.pushAll("interest", new String[]{".net","mq"}) // 用法同push,只是pushAll一定可以追加多个值到一个数组字段内 // update.pull("interest", "study"); 作用和push相反,从interest字段中删除一个等于value的值 // update.pullAll("interest", new String[]{"sing","dota"})作用和pushAll相反 // update.addToSet("interest", "study") 把一个值添加到数组字段中,而且只有当这个值不在数组内的时候才增加 // update.rename("oldName", "newName") 字段重命名 // 只更新第一条记录,age加2,name值更新为zhangsan mongoTemplate.updateFirst(query, new Update().inc("age", 2).set("name", "zhangsan"), User.class); // 批量更新,更新所有查询到的数据 mongoTemplate.updateMulti(query, update, User.class); } /** * 测试删除数据 */ @Ignore @Test public void testRemoveUser() { Query query = new Query(); // query.addCriteria(where("age").gt(22)); Criteria criteria = where("age").gt(22); // 删除年龄大于22岁的用户 query.addCriteria(criteria); mongoTemplate.remove(query, User.class); } public void printList(List<User> userList) { for (User user : userList) { System.out.println(user); } } /** * 数组文档指定元素更新 */ @Test public void testUpdateDocument() { // 只更新一个内嵌文档 // Update update = new Update(); // update.set("sonModelList.$.state", 2); // mongoTemplate.updateMulti(new Query(Criteria.where("sonModelList.geoNum").is("532568248122605568")), update, CatchThirteenthModel.class); // 批量更新所有的内嵌文档 // update.set("sonModelList.$.state", 2); // mongoTemplate.updateMulti(new Query(Criteria.where("sessionId").is("cf23e870-2c5a-4d1f-9652-6fa1793dc8be")), // new Update().set("state", 2), CatchThirteenthModel.class); // mongoTemplate.updateMulti(new Query(Criteria.where("sonModelList.parentGeoNum").is("532568523000512512")), // new Update().set("state", 2), CatchFifteenthModel.class); List<CatchFifteenthModel> find = mongoTemplate.find(new Query(Criteria.where("sonModelList.parentGeoNum").is("532568523000512512")), CatchFifteenthModel.class); System.out.println(""); } /** * 测试findAndModify方法 */ @Test public void testFindAndModify() { Criteria criteria = new Criteria(); criteria.andOperator(Criteria.where("geoNum").is("526547322448904192"), Criteria.where("geoLevel").is(14)); CatchModel model = mongoTemplate.findAndModify(new Query(criteria), new Update().set("state", 2).set("endTime", new Date()), new FindAndModifyOptions().returnNew(true), CatchModel.class); System.out.println(model); } }
复制代码

附: Object/Document映射注解支持

复制代码

@Id          文档的唯一标识,在mongodb中为ObjectId,它是唯一的,通过时间戳+机器标识+进程ID+自增计数器(确保同一秒内产生的Id不会冲突)构成。

@Document       把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档。

@DBRef        声明类似于关系数据库的关联关系。ps:暂不支持级联的保存功能,当你在本实例中修改了DERef对象里面的值时,单独保存本实例并不能保存DERef引用的对象,它要另外保存,如下面例子的Person和Account。

@Indexed       声明该字段需要索引,建索引可以大大的提高查询效率。

@CompoundIndex    复合索引的声明,建复合索引可以有效地提高多字段的查询效率。

@GeoSpatialIndexed 声明该字段为地理信息的索引。

@Transient      映射忽略的字段,该字段不会保存到mongodb。

@PersistenceConstructor   声明构造函数,作用是把从数据库取出的数据实例化为对象。该构造函数传入的值为从DBObject中取出的数据。

复制代码

 内嵌文档查询

复制代码
@Test  
    public void testFind3(){  
        final BasicDBObject test = new BasicDBObject("score", new BasicDBObject("$elemMatch", new BasicDBObject("$gt", 90).append("$lt", 100)));  
        final BasicDBObject keys = new BasicDBObject("score", 1);  
        DBCursor cursor = getCollection().find(test, keys);  
        while (cursor.hasNext()) {  
            DBObject object = cursor.next();  
            System.out.println(object);  
        }  
        cursor.close();  
    }  
复制代码

template 操作

复制代码
@Test  
public void testFind3() {  
    Criteria cri = Criteria.where("$gt").is(90).and("$lt").is(100);  
    Query query = new Query(Criteria.where("score").elemMatch(cri));  
    query.fields().include("score");  
    List<Users> users = mongoTemplate.find(query, Users.class);  
    for(Users users2 : users) {  
        System.out.println(users2.toString());  
    }  
}  
复制代码

参考: 

http://blog.csdn.net/congcong68/article/details/47183209

使用spring整合mongodb

maven 依赖

复制代码
 <dependency>
         <groupId>org.mongodb</groupId>
         <artifactId>mongo-java-driver</artifactId>
         <version>2.13.0-rc0</version>
     </dependency>

     <dependency>
         <groupId>org.springframework.data</groupId>
         <artifactId>spring-data-mongodb</artifactId>
         <version>1.7.1.RELEASE</version>
     </dependency>
     <dependency>
         <groupId>org.springframework.data</groupId>
         <artifactId>spring-data-mongodb-cross-store</artifactId>
         <version>1.7.1.RELEASE</version>
     </dependency>
     <dependency>
         <groupId>org.springframework.data</groupId>
         <artifactId>spring-data-mongodb-log4j</artifactId>
         <version>1.7.1.RELEASE</version>
     </dependency>
复制代码

mongodb.properties

复制代码
mongo.host=dev.iwhere.com
mongo.port=27017
mongo.connectionsPerHost=8
mongo.threadsAllowedToBlockForConnectionMultiplier=4
mongo.connectTimeout=1000
mongo.maxWaitTime=1500
mongo.autoConnectRetry=true
mongo.socketKeepAlive=true
mongo.socketTimeout=1500
mongo.slaveOk=true
mongo.writeNumber=1
mongo.riteTimeout=0
mongo.writeFsync=true
复制代码

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:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
    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-3.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-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/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    
    <context:component-scan base-package="com.mongo" />
    <!-- 获取配置资源 -->
    <context:property-placeholder location="classpath:mongodb-context-config.properties" />
    
    
    <mongo:mongo id="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>
    <!-- 设置使用的数据库 名-->
    <mongo:db-factory dbname="test" mongo-ref="mongo"/>
    <!-- mongodb的模板 -->
    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
       <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
    </bean>
</beans>

复制代码

使用 mongotemplate的常用操作

复制代码
package com.iwhere.test2;

import static org.springframework.data.mongodb.core.query.Criteria.where;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.mongodb.core.FindAndModifyOptions;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

public class MongoSpringTest {

  @Autowried private MongoTemplate mongoTemplate;
  // 使用spring整合的话, 就直接注入就可以了, 这是测试uanjing
@Before public void testBefore() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-mvc-servlet.xml"); mongoTemplate = (MongoTemplate) context.getBean("mongoTemplate"); } /** * 插入用户信息 */ @Test public void testAddUser() { User zhanggc = new User(); zhanggc.setName1("zhangguochen"); zhanggc.setAge(29); List<String> interests = new ArrayList<String>(); interests.add("stuty"); interests.add("hadoop"); zhanggc.setInterest(interests); Home home = new Home("henan"); zhanggc.setHome(home); // 插入数据 mongoTemplate.insert(zhanggc); } /** * 查询用户信息 */ @Test public void testQueryUser() { // 查询主要用到Query和Criteria两个对象 Query query = new Query(); Criteria criteria = where("age").gt(22); // 大于 // criteria.and("name").is("cuichongfei");等于 // List<String> interests = new ArrayList<String>(); // interests.add("study"); // interests.add("linux"); // criteria.and("interest").in(interests); in查询 // criteria.and("home.address").is("henan"); 内嵌文档查询 // criteria.and("").exists(false); 列存在 // criteria.and("").lte(); 小于等于 // criteria.and("").regex(""); 正则表达式 // criteria.and("").ne(""); 不等于 // 多条件查询 // criteria.orOperator(Criteria.where("key1").is("0"),Criteria.where("key1").is(null)); query.addCriteria(criteria); List<User> userList1 = mongoTemplate.find(query, User.class); printList(userList1); // 排序查询sort方法,按照age降序排列 // query.sort().on("age", Order.DESCENDING); // List<User> userList2 = mongoTemplate.find(query, User.class); // printList(userList2);

     // 排序 

      Query query = new Query();
      query.with(new Sort(Direction.ASC, "priority").and(new Sort(Direction.ASC, "create_time")));


// 指定字段查询,只查询age和name两个字段 // query.fields().include("age").include("name"); // List<User> userList3 = mongoTemplate.find(query, User.class); // printList(userList3); // 分页查询 // query.skip(2).limit(3); // List<User> userList4 = mongoTemplate.find(query, User.class); // printList(userList4); // 查询所有 // printList(mongoTemplate.findAll(User.class)); // 统计数据量 // System.out.println(mongoTemplate.count(query, User.class)); } /** * 更新用户数据 */ @Test public void testUpdateUser() { // update(query,update,class) // Query query:需要更新哪些用户,查询参数 // Update update:操作符,需要对数据做什么更新 // Class class:实体类 // 更新age大于24的用户信息 Query query = new Query(); query.addCriteria(where("age").gt(24)); Update update = new Update(); // age值加2 update.inc("age", 2); // update.set("name", "zhangsan"); 直接赋值 // update.unset("name"); 删去字段 // update.push("interest", "java"); 把java追加到interest里面,interest一定得是数组 // update.pushAll("interest", new String[]{".net","mq"}) // 用法同push,只是pushAll一定可以追加多个值到一个数组字段内 // update.pull("interest", "study"); 作用和push相反,从interest字段中删除一个等于value的值 // update.pullAll("interest", new String[]{"sing","dota"})作用和pushAll相反 // update.addToSet("interest", "study") 把一个值添加到数组字段中,而且只有当这个值不在数组内的时候才增加 // update.rename("oldName", "newName") 字段重命名 // 只更新第一条记录,age加2,name值更新为zhangsan mongoTemplate.updateFirst(query, new Update().inc("age", 2).set("name", "zhangsan"), User.class); // 批量更新,更新所有查询到的数据 mongoTemplate.updateMulti(query, update, User.class); } /** * 测试删除数据 */ @Ignore @Test public void testRemoveUser() { Query query = new Query(); // query.addCriteria(where("age").gt(22)); Criteria criteria = where("age").gt(22); // 删除年龄大于22岁的用户 query.addCriteria(criteria); mongoTemplate.remove(query, User.class); } public void printList(List<User> userList) { for (User user : userList) { System.out.println(user); } } /** * 数组文档指定元素更新 */ @Test public void testUpdateDocument() { // 只更新一个内嵌文档 // Update update = new Update(); // update.set("sonModelList.$.state", 2); // mongoTemplate.updateMulti(new Query(Criteria.where("sonModelList.geoNum").is("532568248122605568")), update, CatchThirteenthModel.class); // 批量更新所有的内嵌文档 // update.set("sonModelList.$.state", 2); // mongoTemplate.updateMulti(new Query(Criteria.where("sessionId").is("cf23e870-2c5a-4d1f-9652-6fa1793dc8be")), // new Update().set("state", 2), CatchThirteenthModel.class); // mongoTemplate.updateMulti(new Query(Criteria.where("sonModelList.parentGeoNum").is("532568523000512512")), // new Update().set("state", 2), CatchFifteenthModel.class); List<CatchFifteenthModel> find = mongoTemplate.find(new Query(Criteria.where("sonModelList.parentGeoNum").is("532568523000512512")), CatchFifteenthModel.class); System.out.println(""); } /** * 测试findAndModify方法 */ @Test public void testFindAndModify() { Criteria criteria = new Criteria(); criteria.andOperator(Criteria.where("geoNum").is("526547322448904192"), Criteria.where("geoLevel").is(14)); CatchModel model = mongoTemplate.findAndModify(new Query(criteria), new Update().set("state", 2).set("endTime", new Date()), new FindAndModifyOptions().returnNew(true), CatchModel.class); System.out.println(model); } }
复制代码

附: Object/Document映射注解支持

复制代码

@Id          文档的唯一标识,在mongodb中为ObjectId,它是唯一的,通过时间戳+机器标识+进程ID+自增计数器(确保同一秒内产生的Id不会冲突)构成。

@Document       把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档。

@DBRef        声明类似于关系数据库的关联关系。ps:暂不支持级联的保存功能,当你在本实例中修改了DERef对象里面的值时,单独保存本实例并不能保存DERef引用的对象,它要另外保存,如下面例子的Person和Account。

@Indexed       声明该字段需要索引,建索引可以大大的提高查询效率。

@CompoundIndex    复合索引的声明,建复合索引可以有效地提高多字段的查询效率。

@GeoSpatialIndexed 声明该字段为地理信息的索引。

@Transient      映射忽略的字段,该字段不会保存到mongodb。

@PersistenceConstructor   声明构造函数,作用是把从数据库取出的数据实例化为对象。该构造函数传入的值为从DBObject中取出的数据。

复制代码

 内嵌文档查询

复制代码
@Test  
    public void testFind3(){  
        final BasicDBObject test = new BasicDBObject("score", new BasicDBObject("$elemMatch", new BasicDBObject("$gt", 90).append("$lt", 100)));  
        final BasicDBObject keys = new BasicDBObject("score", 1);  
        DBCursor cursor = getCollection().find(test, keys);  
        while (cursor.hasNext()) {  
            DBObject object = cursor.next();  
            System.out.println(object);  
        }  
        cursor.close();  
    }  
复制代码

template 操作

复制代码
@Test  
public void testFind3() {  
    Criteria cri = Criteria.where("$gt").is(90).and("$lt").is(100);  
    Query query = new Query(Criteria.where("score").elemMatch(cri));  
    query.fields().include("score");  
    List<Users> users = mongoTemplate.find(query, Users.class);  
    for(Users users2 : users) {  
        System.out.println(users2.toString());  
    }  
}  
复制代码

参考: 

http://blog.csdn.net/congcong68/article/details/47183209

猜你喜欢

转载自www.cnblogs.com/johniehuang/p/10729644.html