mongodb与spring mvc 整合
1.pom文件添加对mongodb的倚赖
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.2.2</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>${data.mongodb}</version>
</dependency> <dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-cross-store</artifactId>
<version>${data.mongodb}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-log4j</artifactId>
<version>${data.mongodb}</version>
</dependency>
2.applicationContext.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 扫描 -->
<context:component-scan base-package="cn.com.xxx.mongodb"/> <!-- 引入mongodb的相关配置 -->
<import resource="classpath:spring-mongodb.xml"/> </beans>
4.mongodb.properties
#数据库名称
mongo.dbname = test
#用户名
mongo.username = root
mongo.credentials=root:000000@test
#密码
mongo.password = 000000
#主机
mongo.host = 127.0.0.1
#端口号
mongo.port= 27017
#一个线程变为可用的最大阻塞数
mongo.connectionsPerHost= 8
#线程队列数,它以上面connectionsPerHost值相乘的结果就是线程队列最大值
mongo.threadsAllowedToBlockForConnectionMultiplier= 4
#连接超时时间(毫秒)
mongo.connectTimeout= 1500
#最大等待时间
mongo.maxWaitTime= 1500
#自动重连
mongo.autoConnectRetry= true
#scoket保持活动
mongo.socketKeepAlive= true
#scoket超时时间
mongo.socketTimeout=1500
#读写分离
mongo.slaveOk=true
3.spring-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:context="http://www.springframework.org/schema/context"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- 加载mongodb的属性配置文件 -->
<context:property-placeholder location="classpath:mongodb.properties" /> <!-- 定义mongo对象,对应的是mongodb官方jar包中的Mongo,replica-set设置集群副本的ip地址和端口 -->
<!--
<mongo:mongo id="mongo" host="${mongo.host}" port="${mongo.port}" > <mongo:client-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>
-->
<!-- 我们使用的mongodb的版本是3.X,所以在构造这段话的时候要根据 Mongo 类的构造函数来构造,不同版本可能会造成构造函数的不同-->
<mongo:mongo-client id="mongo" host="${mongo.host}" port="${mongo.port}" credentials="${mongo.credentials}"> <mongo:client-options
connections-per-host="${mongo.connectionsPerHost}"
threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
connect-timeout="${mongo.connectTimeout}"
max-wait-time="${mongo.maxWaitTime}"
socket-keep-alive="${mongo.socketKeepAlive}"
socket-timeout="${mongo.socketTimeout}"
/>
</mongo:mongo-client> <!-- 用户验证 -->
<bean id="userCredentials" class="org.springframework.data.authentication.UserCredentials">
<constructor-arg name="username" value="${mongo.username}" />
<constructor-arg name="password" value="${mongo.password}" />
</bean>
<!-- mongo的工厂,通过它来取得mongo实例,dbname为mongodb的数据库名,没有的话会自动创建 -->
<bean id="mongoDbFactory"
class="org.springframework.data.mongodb.core.SimpleMongoDbFactory">
<constructor-arg ref="mongo" />
<constructor-arg value="${mongo.dbname}" />
<!-- <constructor-arg ref="userCredentials" /> -->
</bean> <bean id="mappingContext"
class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" /> <bean id="defaultMongoTypeMapper"
class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper">
<constructor-arg name="typeKey">
<null />
</constructor-arg>
</bean> <!-- collection的映射 -->
<bean id="mappingMongoConverter"
class="org.springframework.data.mongodb.core.convert.MappingMongoConverter">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
<constructor-arg name="mappingContext" ref="mappingContext" />
<property name="typeMapper" ref="defaultMongoTypeMapper" />
</bean> <!-- mongodb的主要操作对象,所有对mongodb的增删改查的操作都是通过它完成 -->
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
<constructor-arg name="mongoConverter" ref="mappingMongoConverter" />
</bean>
<bean id="audience" class="cn.com.xxx.mongodb.aop.Audience"/> <aop:config proxy-target-class="true">
<aop:aspect ref="audience">
<aop:pointcut id="performance" expression="execution(* cn.com.mongodb.service.impl.*.*(..))"/> <aop:before pointcut-ref="performance" method="takeSeats"/>
<aop:before pointcut-ref="performance" method="turnOffCellPhones"/>
<aop:around pointcut-ref="performance" method="around"/>
<aop:after-returning pointcut-ref="performance" method="applaud"/>
<aop:after-throwing pointcut-ref="performance" method="demandRefund"/>
<aop:after pointcut-ref="performance" method="after"/>
</aop:aspect>
</aop:config>
</beans>
5.为了使javabean对象与mongodb对象相互转化,本人借鉴别人的例子,稍加改动, 主要是应对数据库表字段的命名是含 _ 的这种方式,首先需要约定在生成java pojo的时候,每个字段上面要加上@Field注解(方便利用反射来让两者之间相互转换)
@Document(collection="item_info")
public class ItemInfo implements Serializable { private static final long serialVersionUID = 1L;
private Oid _id;
@Field(value="item_id")
private String itemId;
@Field(value="item_name")
private String itemName;
@Field(value="price")
private Double price;
@Field(value="desc")
private String desc; public Oid get_id() {
return _id;
} public void set_id(Oid _id) {
this._id = _id;
} public String getItemId() {
return itemId;
} public void setItemId(String itemId) {
this.itemId = itemId;
} public String getItemName() {
return itemName;
} public void setItemName(String itemName) {
this.itemName = itemName;
} public Double getPrice() {
return price;
} public void setPrice(Double price) {
this.price = price;
} public String getDesc() {
return desc;
} public void setDesc(String desc) {
this.desc = desc;
} @Override
public String toString() {
return "ItemInfo [_id=" + _id + ", itemId=" + itemId + ", itemName="
+ itemName + ", price=" + price + ", desc=" + desc + "]";
}
实现java对象与DBObject对象之间的相互转化
public class BeanUtil { /**
* 把实体bean对象转换成DBObject
* @param bean
* @return
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public static <T> DBObject bean2DBObject(T bean) throws IllegalArgumentException,
IllegalAccessException {
if (bean == null) {
return null;
}
DBObject dbObject = new BasicDBObject();
// 获取对象对应类中的所有属性域
Field[] fields = bean.getClass().getDeclaredFields(); // 获取所有注解
for (Field field : fields) {
org.springframework.data.mongodb.core.mapping.Field anno = field.getAnnotation(org.springframework.data.mongodb.core.mapping.Field.class);
// 获取属性名
String varName = field.getName(); if("serialVersionUID".equals(varName) || "_id".equals(varName)){
continue;
} // 获取注解的值
varName = anno.value();
// 修改访问控制权限
boolean accessFlag = field.isAccessible();
if (!accessFlag) {
field.setAccessible(true);
}
Object param = field.get(bean);
if (param == null) {
continue;
} else if (param instanceof Integer) {//判断变量的类型
int value = ((Integer) param).intValue();
dbObject.put(varName, value);
} else if (param instanceof String) {
String value = (String) param;
dbObject.put(varName, value);
} else if (param instanceof Double) {
double value = ((Double) param).doubleValue();
dbObject.put(varName, value);
} else if (param instanceof Float) {
float value = ((Float) param).floatValue();
dbObject.put(varName, value);
} else if (param instanceof Long) {
long value = ((Long) param).longValue();
dbObject.put(varName, value);
} else if (param instanceof Boolean) {
boolean value = ((Boolean) param).booleanValue();
dbObject.put(varName, value);
} else if (param instanceof Date) {
Date value = (Date) param;
dbObject.put(varName, value);
}
// 恢复访问控制权限
field.setAccessible(accessFlag);
} return dbObject;
} /**
* 把DBObject转换成bean对象
* @param dbObject
* @param bean
* @return
* @throws IllegalAccessException
* @throws InvocationTargetException
* @throws NoSuchMethodException
*/
public static <T> T dbObject2Bean(DBObject dbObject, T bean) throws IllegalAccessException,
InvocationTargetException, NoSuchMethodException {
if (bean == null) {
return null;
}
Field[] fields = bean.getClass().getDeclaredFields();
for (Field field : fields) {
String varName = field.getName();
org.springframework.data.mongodb.core.mapping.Field anno = field.getAnnotation(org.springframework.data.mongodb.core.mapping.Field.class);
if("serialVersionUID".equals(varName) || "_id".equals(varName)){
continue;
} String fieldName = anno.value();
Object object = dbObject.get(fieldName);
if (object != null) {
BeanUtils.setProperty(bean, varName, object);
}
}
return bean;
}
}
好了,准备工作就做好了
相应的Service与实现方法
public interface ItemInfoService { // 查询
public List<ItemInfo> getItemInfo(JSONObject json) throws Exception; // 保存
public int save(ItemInfo itemInfo) throws Exception; // 更新
public void update(ItemInfo intemInfo) throws Exception;
}
@Service(value="itemInfoService")
public class ItemInfoServiceImpl implements ItemInfoService { @Autowired
private MongoTemplate mongoTemplate;
private final static String COLLECTION_NAME = "item_info"; @Override
@SuppressWarnings("static-access")
public List<ItemInfo> getItemInfo(JSONObject json) throws Exception{
List<ItemInfo> list = new ArrayList<ItemInfo>();
// 判断查询的json中传递过来的参数
DBObject query = new BasicDBObject();
// item_id,item_name,price,desc
if(json.has("item_id")){ query.put("item_id", json.getString("item_id"));
}else if(json.has("item_name")){
query.put("item_name", json.getString("item_name"));
} DBCursor results = mongoTemplate.getCollection("item_info").find(query);
if(null != results){
Iterator<DBObject> iterator = results.iterator();
while(iterator.hasNext()){
//Document doc = (Document) iterator.next();
BasicDBObject obj = (BasicDBObject) iterator.next();
//System.out.println(obj.toJson());
// json 字符串
String objStr = obj.toString();
//JSONObject itemInfoJson = new JSONObject().fromObject(objStr);
//itemInfoJson.put("_id", itemInfoJson.getJSONObject("_id").getString("$oid"));
ItemInfo itemInfo = new ItemInfo();
itemInfo = BeanUtil.dbObject2Bean(obj, itemInfo);
list.add(itemInfo);
}
} return list;
} @Override
public int save(ItemInfo itemInfo) throws Exception {
itemInfo.setDesc("1111");
itemInfo.setItemId("i1234567890123");
itemInfo.setItemName("item_name_xx");
itemInfo.setPrice(110.0); DBCollection collection = this.mongoTemplate.getCollection("item_info");
int result = 0;
DBObject iteminfoObj = BeanUtil.bean2DBObject(itemInfo); //iteminfoObj.removeField("serialVersionUID");
//result = collection.insert(iteminfoObj).getN();
WriteResult writeResult = collection.save(iteminfoObj);
result = writeResult.getN();
return result;
} @Override
public void update(ItemInfo intemInfo) throws Exception { DBCollection collection = this.mongoTemplate.getCollection(COLLECTION_NAME);
ItemInfo queryItemInfo = new ItemInfo();
queryItemInfo.setItemId(intemInfo.getItemId());
DBObject itemInfoObj = BeanUtil.bean2DBObject(intemInfo);
DBObject query = BeanUtil.bean2DBObject(queryItemInfo);
collection.update(query, itemInfoObj);
} }
junit test
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")
public class ItemInfoServiceTest { @Autowired
private ItemInfoService itemInfoService; @Ignore
@Test
public void testSave(){
ItemInfo itemInfo = new ItemInfo();
try {
this.itemInfoService.save(itemInfo);
} catch (Exception e) {
e.printStackTrace();
}
} @Ignore
@Test
public void testGetItemInfo(){
List<ItemInfo> list = new ArrayList<ItemInfo>();
JSONObject json = new JSONObject();
//json.put("item_id", "47a09d51-bf24-442b-9076-4701dcb614b9");
json.put("item_id", "i1234567890123");
try {
list = this.itemInfoService.getItemInfo(json);
if(null != list && list.size() > 0){
//System.out.println(list.get(0).toString());
for (ItemInfo itemInfo : list) {
//itemInfo.setItemName("======");
this.itemInfoService.getItemInfo(json);
}
}
System.out.println(1 / 0);
} catch (Exception e) {
e.printStackTrace();
}
} @Test
public void testUpdate(){
JSONObject json = new JSONObject();
//json.put("item_id", "47a09d51-bf24-442b-9076-4701dcb614b9");
json.put("item_id", "i1234567890123");
List<ItemInfo> list = new ArrayList<ItemInfo>();
try {
list = this.itemInfoService.getItemInfo(json); if(null != list && list.size() > 0){
for (ItemInfo itemInfo : list) { }
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
OK , 测试完成。
mongodb与spring mvc 整合的更多相关文章
- 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代码 ...
- Spring与Struts2整合VS Spring与Spring MVC整合
Spring与Struts2整合,struts.xml在src目录下 1.在web.xml配置监听器 web.xml <!-- 配置Spring的用于初始化ApplicationContext的 ...
- MyBatis+Spring+Spring MVC整合开发
MyBatis+Spring+Spring MVC整合开发课程观看地址:http://www.xuetuwuyou.com/course/65课程出自学途无忧网:http://www.xuetuwuy ...
- 【RabbitMQ系列】 Spring mvc整合RabbitMQ
一.linux下安装rabbitmq 1.安装erlang环境 wget http://erlang.org/download/otp_src_18.2.1.tar.gz tar xvfz otp_s ...
- Java基础-SSM之Spring和Mybatis以及Spring MVC整合案例
Java基础-SSM之Spring和Mybatis以及Spring MVC整合案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 能看到这篇文章的小伙伴,详细你已经有一定的Java ...
- spring mvc整合mybaitis和log4j
在上一篇博客中,我介绍了在mac os上用idea搭建spring mvc的maven工程,但是一个完整的项目肯定需要数据库和日志管理,下面我就介绍下spring mvc整合mybatis和log4j ...
- Spring MVC 整合Swagger的一些问题总结
在做Spring MVC 整合swagger的时候,遇到的两个问题: 第一个问题 在网上找了一些Spring MVC 和Swagger的例子,照着一步步的配置,结果,到最后,项目都起来了,没有任何问题 ...
- 【Java Web开发学习】Spring MVC整合WebSocket通信
Spring MVC整合WebSocket通信 目录 ========================================================================= ...
- MQTT 3 ——MQTT与Spring Mvc整合
本篇记录一下MQTT客户端与Spring Mvc整合 网络上已经有很多的MQTT客户端与SpringBoot整合的技术文档,但是与Spring Mvc框架的整合文档似乎并不太多,可能是因为Spri ...
随机推荐
- Jenkins 定时构建语法规则
1.Jenkins自由风格任务定时构建 2.语法规则 定时构建语法 * * * * * 第一个*表示分钟,取值0~59 第二个*表示小时,取值0~23 第三个*表示一个月的第几天,取值1~31 第四个 ...
- Jenkins部分插件介绍
1.Join Plugin 功能介绍:这是一个触发job的插件,亮点在于它触发job的条件是等待当前job的所有下游job都完成才会发生. 例:假如A同时触发B1和B2两个下游job,然后配置这个插件 ...
- 腾讯技术分享:微信小程序音视频技术背后的故事
1.引言 微信小程序自2017年1月9日正式对外公布以来,越来越受到关注和重视,小程序上的各种技术体验也越来越丰富.而音视频作为高速移动网络时代下增长最快的应用形式之一,在微信小程序中也当然不能错过. ...
- Docker安装配置MongoDB并使用Robo 3T在局域网连接
主要参考了这位老兄的文章(传送门),写的还是比较详细的. 不废话直接来正经的. 1.docker pull mongo 从docker hub拉取最新的mongo镜像文件,300多M大小. 2.doc ...
- Python文件操作与函数目录
文件操作 python文件操作 函数 Python函数学习——初步认识 Python函数学习——作用域与嵌套函数 Python函数学习——匿名函数 python内置函数 Python函数学习——递归 ...
- 橙色优学:Java编程怎么提升技术,Java编程思维至关重要
橙色优学了解做为程序员,一旦进入技术行列,就开启了持续学习的道路,更迭迅速的互联网时代,技术自然也是一代一代的更新,在技术进阶的道路上,要不断吸收新的想法和技术知识. 牛逼的人总是让人羡慕,但如何才能 ...
- 今日头条面试题——LRU原理和Redis实现
很久前参加过今日头条的面试,遇到一个题,目前半部分是如何实现 LRU,后半部分是 Redis 中如何实现 LRU. 我的第一反应应该是内存不够的场景下,淘汰旧内容的策略.LRU ... Least R ...
- 剑指offer例题分享--7
前言:继续前面的分享... 面试题31: 代码如下: #include<iostream> #include<limits.h> using namespace std; bo ...
- Spring Boot 1.5升级2.1 主要问题汇总
我们目前工作的系统是基于Spring Boot 1.5.19.RELEASE.Spring Cloud Edgware.SR3开发的,因为一个新项目开发过程的体验,所以在考虑升级到Spring Boo ...
- vue-15-vuex-store的用法
vue-16-vuex 1, 介绍 对 vue 进行状态管理的, 集中存储所有组件的所有状态, 解决多个组件共享数据的问题. 即, 所有组件可以拿到同样的状态, 组件间共享数据 2, 在之前进行数据交 ...