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"&gt;

<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整合的話, 就直接注入就可以了, 這是測試uanjingbr/>@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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章