一、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);
         
    }
     
      
         
}



ok ~~~