使用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