博客详情

spring4整合mongodb (原创)

作者: 朝如青丝暮成雪
发布时间:2018-03-25 16:37:25  文章分类:java编程   阅读(891)  评论(0)

一、mongodb是什么

MongoDB  是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB  是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

(以上是百度百科的介绍,更多详情请参考mongodb官网 https://www.mongodb.com/ )

 二、java中使用spring整合mongodb

 我们采用的是spring-data-mongodb  组件整合mongodb ,整合过程十分简单。


mongodb.properties 


#mongoDB连接配置
mongo.dbname=myDB
mongo.host=192.168.1.129
mongo.port=27017
#mongo.username=root
#mongo.password=root
#一个线程变为可用的最大阻塞数

#mongo.writeConcern=SAFE
mongo.connectionsPerHost=8
#线程队列数,它以上面connectionsPerHost值相乘的结果就是线程队列最大值
mongo.threadsAllowedToBlockForConnectionMultiplier=4
#连接超时时间(毫秒)
mongo.connectTimeout=1500
#最大等待时间
mongo.maxWaitTime=1500
#自动重连
mongo.autoConnectRetry=true
#scoket保持活动
mongo.socketKeepAlive= true
#scoket超时时间
mongo.socketTimeout=1500
 


spring-mongodb.xml  (注意spring的版本必须是4以上)


<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:cache="http://www.springframework.org/schema/cache"
    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-4.3.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-4.3.xsd
          http://www.springframework.org/schema/aop
          http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
          http://www.springframework.org/schema/tx
          http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
          http://www.springframework.org/schema/cache
          http://www.springframework.org/schema/cache/spring-cache-4.3.xsd
          http://www.springframework.org/schema/data/mongo
		  http://www.springframework.org/schema/data/mongo/spring-mongo-1.10.xsd">
	    
	  
	  <mongo:db-factory id="mongoDbFactory" dbname="${mongo.dbname}" mongo-ref="mongoClient"/>
	  
	  <!--credentials的配置形式是:用户名:密码@默认数据库-->
<!-- 	<mongo:mongo-client id="mongoClient" host="${mongo.host}" port="${mongo.port}"
                    credentials="${mongo.username}:${mongo.password}@${mongo.dbname}"
          > -->
	<mongo:mongo-client id="mongoClient" 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}"
                          socket-timeout="${mongo.socketTimeout}"
                          />
   </mongo:mongo-client>

	
	<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
	    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
	</bean>
	  
   
    
</beans>



pom.xml  


     <!--  slf4j jar包 (api)-->
 		  <dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.7</version>
		</dependency> 
		 <!--  slf4j jar包   (实现)-->
	 <dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.7</version>
		</dependency> 

       <!-- spring-data-mongodb 组件  -->
	 <dependency>
	    <groupId>org.springframework.data</groupId>
	    <artifactId>spring-data-mongodb</artifactId>
	    <version>1.10.7.RELEASE</version>
	</dependency>
		



ok,以上就整合完成了。

在我们的业务代码中如果需要调用mongodb ,只需要@resources 注入mongoTemplate 这个bean接口。 


三、mongodb操作的简单封装(CRUD) 

 MongoBaseDao.java 


package com.tingcream.hplusAdmin.business.other.base;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;

import javax.annotation.Resource;

import org.apache.commons.lang3.StringUtils;
import org.bson.types.ObjectId;
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;
import org.springframework.stereotype.Component;
import com.mongodb.WriteResult;
 
/**
 * 对mongodb CRUD的简单封装
 * @author jelly
 */
@Component
public class MongoBaseDao {
	
	@Resource
	private MongoTemplate mongoTemplate;
	
	/**
	 * 根据id查询 
	 * @param _id  主键id
	 * @param entityClass 实体类
	 * @return T  
	 * @author jelly
	 *
	 */
	 public <T> T findById( String _id,Class<T> entityClass) {    
	        return  mongoTemplate.findById(_id, entityClass);    
     } 
	 /**
	  * 根据id查询 
	  * @param _id  主键id
	  * @param entityClass 实体类
	  * @param collectionName  集合名称
	  * @return T
	  * @author jelly
	  *
	  */
	 public <T> T findById( String _id,Class<T> entityClass,String collectionName) {    
		 return  mongoTemplate.findById(_id, entityClass,collectionName);    
	 } 
     	 
	 
	 /**
	  * 保存一个实体对象  
	  * @param t
	  * @return T
	  * @author jelly
	  *
	  */
	public  <T> T save(T t){
		mongoTemplate.save(t);
		return  t;//自动主键返回
	}
	/**
	 * 
	 * @param t
	 * @param collectionName
	 * @return
	 * @return T
	 * @author jelly
	 *
	 */
	public  <T> T save(T t,String collectionName){
		mongoTemplate.save(t,collectionName);
		return  t;//自动主键返回
	}
	
	/**
	 * 查询所有实体对象
	 * @param entityClass
	 * @return List<T>
	 * @author jelly
	 *
	 */
	public  <T>  List<T> findAll(Class<T> entityClass){
	  return 	mongoTemplate.findAll(entityClass);
	}
	/**
	 * 查询所有实体对象
	 * @param entityClass
	 * @param collectionName
	 * @return List<T>
	 * @author jelly
	 *
	 */
	public  <T>  List<T> findAll(Class<T> entityClass,String collectionName){
		return 	mongoTemplate.findAll(entityClass,collectionName);
	}
	
	/**
	 * 根据id删除
	 * @param _id
	 * @param entityClass
	 * @return WriteResult
	 * @author jelly
	 *
	 */
	public  <T> WriteResult  deleteById(String _id,Class<T> entityClass){
		 Query query =Query.query(Criteria.where("_id").is(new ObjectId(_id)));
		 
		 return     mongoTemplate.remove(query, entityClass);
		  
	}
	/**
	 * 根据id删除
	 * @param _id
	 * @param entityClass
	 * @param collectionName
	 * @return WriteResult
	 * @author jelly
	 *
	 */
	public  <T> WriteResult  deleteById(String _id,Class<T> entityClass,String collectionName){
		Query query =Query.query(Criteria.where("_id").is(new ObjectId(_id)));
		
		return     mongoTemplate.remove(query, entityClass,collectionName);
		
	}
	 
	
	/**
	 * 更新一个实体对象 ,根据_id主键update
	 * @param t
	 * @throws Exception
	 * @return WriteResult
	 * @author jelly
	 *
	 */
	public  <T> WriteResult updateOne(T t) throws Exception{
		
		//where条件, 根据id 更新
		 //Query query =Query.query(Criteria.where("_id").is(new ObjectId(_id)));
		 Update  update=new Update();
		  
		   Class<? extends Object> clazz=t.getClass(); //clazz 对象
		 
		    Field field =   clazz.getDeclaredField("_id");
		    
		    PropertyDescriptor idDescriptor = new PropertyDescriptor(field.getName(), clazz);
		    String _id = (String) idDescriptor.getReadMethod().invoke(t);
		    
		    Query query =Query.query(Criteria.where("_id").is(new ObjectId(_id)));//查询条件  id
		    
		 
		  BeanInfo beanInfo = Introspector.getBeanInfo(clazz); 
		   
		   PropertyDescriptor[] propertyDescriptors=  beanInfo.getPropertyDescriptors();//属性描述器数组
		   
		 for(int i=0;i<propertyDescriptors.length;i++){
			 //属性描述器
			 PropertyDescriptor descriptor  = propertyDescriptors[i];
			 
			  String propertyName = descriptor.getName(); //获得属性名
			 
			 if(propertyName.equals("class") || propertyName.equals("_id") || propertyName.equals("serialVersionUID")){
				 continue;
			 }
				PropertyDescriptor pd = new PropertyDescriptor(propertyName, clazz);
				 Method writeMethod= pd.getWriteMethod();
				 if(writeMethod==null){
					 continue;
				 }
				 Method readMethod=pd.getReadMethod();
				 String retType= readMethod.getReturnType().getName();
				 if(retType.equals(String.class.getName())){//"java.lang.String"
					 
					String	value = (String) readMethod.invoke(t);
					 
					 if(StringUtils.isNotEmpty(value)){
						   update.set(propertyName, value);	 
					 } 
				 }else {
					 if(readMethod.invoke(t)!=null){
						  update.set(propertyName, readMethod.invoke(t));	
					 }
				 }
		 }
		 
		 return  mongoTemplate.updateFirst(query, update, clazz);
		
	}
	
	/**
	 *  更新一个实体对象 ,根据_id主键update
	 * @param t
	 * @param collectionName
	 * @throws Exception
	 * @return WriteResult
	 * @author jelly
	 *
	 */
	public  <T> WriteResult updateOne(T t,String collectionName) throws Exception{
		
		//where条件, 根据id 更新
		//Query query =Query.query(Criteria.where("_id").is(new ObjectId(_id)));
		Update  update=new Update();
		
		Class<? extends Object> clazz=t.getClass(); //clazz 对象
		
		Field field =   clazz.getDeclaredField("_id");
		
		PropertyDescriptor idDescriptor = new PropertyDescriptor(field.getName(), clazz);
		String _id = (String) idDescriptor.getReadMethod().invoke(t);
		
		Query query =Query.query(Criteria.where("_id").is(new ObjectId(_id)));//查询条件  id
		
		
		BeanInfo beanInfo = Introspector.getBeanInfo(clazz); 
		
		PropertyDescriptor[] propertyDescriptors=  beanInfo.getPropertyDescriptors();//属性描述器数组
		
		for(int i=0;i<propertyDescriptors.length;i++){
			//属性描述器
			PropertyDescriptor descriptor  = propertyDescriptors[i];
			
			String propertyName = descriptor.getName(); //获得属性名
			
			if(propertyName.equals("class") || propertyName.equals("_id") || propertyName.equals("serialVersionUID")){
				continue;
			}
			PropertyDescriptor pd = new PropertyDescriptor(propertyName, clazz);
			Method writeMethod= pd.getWriteMethod();
			if(writeMethod==null){
				continue;
			}
			Method readMethod=pd.getReadMethod();
			String retType= readMethod.getReturnType().getName();
			if(retType.equals(String.class.getName())){//"java.lang.String"
				
				String	value = (String) readMethod.invoke(t);
				if(StringUtils.isNotEmpty(value)){
					update.set(propertyName, value);	 
				} 
			}else {
				 if(readMethod.invoke(t)!=null){
					  update.set(propertyName, readMethod.invoke(t));	
				 }
			 }
		}
		
		return  mongoTemplate.updateFirst(query, update, clazz,collectionName);
		
	}
	
	 
	    
}



关键字:  mongodb  spring  java
评论信息
暂无评论
发表评论

亲,您还没有登陆,暂不能评论哦! 去 登陆 | 注册

博主信息
   
数据加载中,请稍候...
文章分类
   
数据加载中,请稍候...
阅读排行
 
数据加载中,请稍候...
评论排行
 
数据加载中,请稍候...

Copyright © 叮叮声的奶酪 版权所有
备案号:鄂ICP备17018671号-1

鄂公网安备 42011102000739号