使用spring整合mongodb

maven 依赖

 <dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.13.-rc0</version>
</dependency> <dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.7..RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-cross-store</artifactId>
<version>1.7..RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-log4j</artifactId>
<version>1.7..RELEASE</version>
</dependency>

mongodb.properties

mongo.host=dev.iwhere.com
mongo.port=
mongo.connectionsPerHost=
mongo.threadsAllowedToBlockForConnectionMultiplier=
mongo.connectTimeout=
mongo.maxWaitTime=
mongo.autoConnectRetry=true
mongo.socketKeepAlive=true
mongo.socketTimeout=
mongo.slaveOk=true
mongo.writeNumber=
mongo.riteTimeout=
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=""
write-timeout="" 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();
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(); // 大于 // 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()); Update update = new Update();
// age值加2
update.inc("age", );
// 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", ).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岁的用户
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("")), CatchFifteenthModel.class);
System.out.println("");
} /**
* 测试findAndModify方法
*/
@Test
public void testFindAndModify() { Criteria criteria = new Criteria();
criteria.andOperator(Criteria.where("geoNum").is(""), Criteria.where("geoLevel").is());
CatchModel model = mongoTemplate.findAndModify(new Query(criteria), new Update().set("state", ).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", ).append("$lt", )));
final BasicDBObject keys = new BasicDBObject("score", );
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().and("$lt").is();
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的更多相关文章

  1. MongoDB系列:四、spring整合mongodb,带用户验证

    在前面的两篇博客 MongoDB常用操作练习.springboot整合mongoDB的简单demo中,我们基本上熟悉了mongodb,也把它与spring boot进行了整合并且简单使用.在本篇博客中 ...

  2. Spring整合MongoDB(转)

    1.认识Spring Data MongoDB 之前还的确不知道Spring连集成Nosql的东西都实现了,还以为自己又要手动封装一个操作MongoDB的API呢,结果就发现了Spring Data ...

  3. 像我这样优雅地进行Spring整合MongoDB

    本文重点是要将mongodb与spring整合到项目中去,在实践中发现问题,追踪问题,然后解决问题. 一.准备 Maven.Spring(spring-data-mongodb) spring Dat ...

  4. spring 整合mongodb报NoSuchMethodError错误

    刚开始通过网上查到相关的资料进行了一些配置,参考链接:http://www.open-open.com/lib/view/open1454374782167.html maven的dependenci ...

  5. spring MVC 整合mongodb

    Spring Mongodb 目录 1 SPRING整合MONGODB 1 1.1 环境准备 1 1.2 包依赖 1 1.3 配置 2 2 案列 5 2.1 SPRING MVC整合MONGODB代码 ...

  6. MongoDB安装与Spring整合

    MongoDB是面向文档的非关系型数据库,数据模型是一种类似于JSON的结构,在数据库中存的是各种各样的JSON.官网下载地址:https://www.mongodb.com/download-cen ...

  7. MongoDB 学习(三)MongoDB 和 Spring 整合(Maven)

    一.MongoDB 和 Spring 整合(Maven) 1.相关 jar 包准备 2.用 Maven 创建项目,pom.xml 文件 <project xmlns="http://m ...

  8. MongoDB和Java(6):Spring Data整合MongoDB副本集、分片集群

    最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装.客户端操作.安全认证.副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很 ...

  9. MongoDB和Java(5):Spring Data整合MongoDB(注解配置)

    最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装.客户端操作.安全认证.副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很 ...

随机推荐

  1. C++ 引用 指针 使用举例

    1. 请看下程序 inline void CScanLineFill::removeOldNodeAET(AET* &aetList, const float yCurrent) { AET* ...

  2. shell 文本处理——使用awk格式化时间戳

    date -d @时间戳 "+%Y-%m-%d %H:%M:%S" 也可以内置函数 awk '{print strftime("%Y-%m-%d %H:%M:%S&quo ...

  3. Android实现带下划线的EditText(BUG修正)

    之前写了一个关于实现EditText显示下划线的例子,发现仍然存在一些问题,在此继续探索,原文链接:http://www.cnblogs.com/ayqy/p/3599414.html (零)另一个b ...

  4. Cesium简介 [转]

    http://www.cnblogs.com/laixiangran/p/4984522.html 一.Cesium介绍 Cesium是国外一个基于JavaScript编写的使用WebGL的地图引擎. ...

  5. SQL学习笔记2

    2018.10.16:周二 --进阶   --别名 SELECT StuName,StuNum+','+StuClass+','+StuGender+','+StuPhone AS 信息 FROM S ...

  6. C#默认以管理员身份运行程序实现代码

    using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; names ...

  7. NGINX部署配置参考.

    请求动态页面 1. uwsgi.ini配置文件.(主从负载uwsgi1.) 2. uwsgi2 的配置文件 3.查看. 4.结构图 5.配置 NGINX服务器  定义上游有哪些服务器. 定义转交给up ...

  8. 768. Max Chunks To Make Sorted II

    This question is the same as "Max Chunks to Make Sorted" except the integers of the given ...

  9. udid iphone6 获取

    http://www.udidregistration.org/how-to-find-udid-of-iphone-6.html

  10. hdoj1175 连连看(dfs+剪枝)

    处理连连看问题. 要求拐弯方向不多于两次.剪枝很重要!!! 用dir记录当前方向.Orz,居然没想到. #include<iostream> #include<cstring> ...