基于MongoDB文件服务器增、删、改、查实例封装

基于mongodb-java-driver 3.4 进行封装

<!-- https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver -->
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.4.2</version>
</dependency>
创建MongoDBUtil 封装创建连接
package com.jit.file.Utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.bson.types.ObjectId;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientOptions.Builder;
import com.mongodb.MongoClientURI;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.model.Filters;
import com.mongodb.client.result.DeleteResult;

/**
 * MongoDB工具类 Mongo实例代表了一个数据库连接池,即使在多线程的环境中,一个Mongo实例对我们来说已经足够了<br>
 * 注意Mongo已经实现了连接池,并且是线程安全的。 <br>
 * 设计为单例模式, 因 MongoDB的Java驱动是线程安全的,对于一般的应用,只要一个Mongo实例即可,<br>
 * Mongo有个内置的连接池(默认为10个) 对于有大量写和读的环境中,为了确保在一个Session中使用同一个DB时,<br>
 * DB和DBCollection是绝对线程安全的<br>
 * 
 */
public class MongoDBUtil {

	
	static Logger log = LogManager.getLogger(MongoDBUtil.class);
	//这里是指放在classes下,如果有包的话,前面加包名即可。例:/com/web/db.properties
	static String fileName="/conf/mongodb.jdbc.properties";

	private static MongoClient mongoClient;
    private static String host = null;
	private static String port = null;
	private static String username = null;
	private static String password = null;
	private static String dbname = null;
	private static String agreement = null;
	private static int connectionsPerHost = 100;
	private static int connectTimeout = 3000;
	private static int maxWaitTime = 5000;
	private static int socketTimeout = 0;
	private static int threadsAllowedToBlockForConnectionMultiplier = 5000;
	
	
    static {
    	log.info("===============MongoDBUtil初始化========================");
        Properties p = new Properties();
		
        try {
        	InputStream in = MongoDBUtil.class.getResourceAsStream(fileName);
    		p.load(in);
        } catch (IOException e) {
        	log.error("获取mongo数据库连接属性异常 : com.jit.platform.basics.dao.MongoDBUtil");
            e.printStackTrace();
        }
        // 从配置文件中获取属性值
        
        host = p.getProperty("mongo.host");
        port = p.getProperty("mongo.port");
        username = p.getProperty("mongo.username");
        password = p.getProperty("mongo.password");
        dbname = p.getProperty("mongo.dbname");
        agreement = p.getProperty("mongo.agreement");
        connectionsPerHost = Integer.valueOf(p.getProperty("mongo.connectionsPerHost"));
        connectTimeout = Integer.valueOf(p.getProperty("mongo.connectTimeout"));
        maxWaitTime = Integer.valueOf(p.getProperty("mongo.maxWaitTime"));
        socketTimeout = Integer.valueOf(p.getProperty("mongo.socketTimeout"));
        threadsAllowedToBlockForConnectionMultiplier = Integer.valueOf(p.getProperty("mongo.threadsAllowedToBlockForConnectionMultiplier"));
        
        
		// 大部分用户使用mongodb都在安全内网下,但如果将mongodb设为安全验证模式,就需要在客户端提供用户名和密码:
		String url = "mongodb://"+username+":"+password+"@"+host+":"+port+"/"+dbname+"?authMechanism="+agreement+"&readPreference=primary";
		MongoClientURI uri = new MongoClientURI(url);
		mongoClient = new MongoClient(uri);
        
        // boolean auth = db.authenticate(myUserName, myPassword);
        Builder options = new MongoClientOptions.Builder();
        // options.autoConnectRetry(true);// 自动重连true
        // options.maxAutoConnectRetryTime(10); // the maximum auto connect retry time
        options.connectionsPerHost(connectionsPerHost);// 连接池设置为300个连接,默认为100
        options.connectTimeout(connectTimeout);// 连接超时,推荐>3000毫秒
        options.maxWaitTime(maxWaitTime); //
        options.socketTimeout(socketTimeout);// 套接字超时时间,0无限制
        options.threadsAllowedToBlockForConnectionMultiplier(threadsAllowedToBlockForConnectionMultiplier);// 线程队列数,如果连接线程排满了队列就会抛出“Out of semaphores to get db”错误。
        options.build();
    }

    // ------------------------------------共用方法---------------------------------------------------
    /**
     * 获取DB实例 - 指定DB
     * 
     * @param dbName
     * @return
     */
    @SuppressWarnings("deprecation")
	public static DB getDB() {
        if (dbname != null && !"".equals(dbname)) {
        	DB db = mongoClient.getDB(dbname);
            //MongoDatabase database = mongoClient.getDatabase(dbname);
            return db;
        }
        return null;
    }

    /**
     * 获取collection对象 - 指定Collection
     * 
     * @param collName
     * @return
     */
    @SuppressWarnings("deprecation")
	public static DBCollection getCollection(String collName) {
        if (null == collName || "".equals(collName)) {
            return null;
        }
        return mongoClient.getDB(dbname).getCollection(collName);
    }


    /**
     * 查找对象 - 根据主键_id
     * 
     * @param collection
     * @param id
     * @return
     */
    public Document findById(MongoCollection<Document> coll, String id) {
        ObjectId _idobj = null;
        try {
            _idobj = new ObjectId(id);
        } catch (Exception e) {
            return null;
        }
        Document myDoc = coll.find(Filters.eq("_id", _idobj)).first();
        return myDoc;
    }

    /** 统计数 */
    public int getCount(MongoCollection<Document> coll) {
        int count = (int) coll.count();
        return count;
    }

    /** 条件查询 */
    public MongoCursor<Document> find(MongoCollection<Document> coll, Bson filter) {
        return coll.find(filter).iterator();
    }

    /** 分页查询 */
    public MongoCursor<Document> findByPage(MongoCollection<Document> coll, Bson filter, int pageNo, int pageSize) {
        Bson orderBy = new BasicDBObject("_id", 1);
        return coll.find(filter).sort(orderBy).skip((pageNo - 1) * pageSize).limit(pageSize).iterator();
    }

    /**
     * 通过ID删除
     * 
     * @param coll
     * @param id
     * @return
     */
    public int deleteById(MongoCollection<Document> coll, String id) {
        int count = 0;
        ObjectId _id = null;
        try {
            _id = new ObjectId(id);
        } catch (Exception e) {
            return 0;
        }
        Bson filter = Filters.eq("_id", _id);
        DeleteResult deleteResult = coll.deleteOne(filter);
        count = (int) deleteResult.getDeletedCount();
        return count;
    }

    /**
     * 
     * @param coll
     * @param id
     * @param newdoc
     * @return
     */
    public Document updateById(MongoCollection<Document> coll, String id, Document newdoc) {
        ObjectId _idobj = null;
        try {
            _idobj = new ObjectId(id);
        } catch (Exception e) {
            return null;
        }
        Bson filter = Filters.eq("_id", _idobj);
        // coll.replaceOne(filter, newdoc); // 完全替代
        coll.updateOne(filter, new Document("$set", newdoc));
        return newdoc;
    }

    /**
     * 关闭Mongodb
     */
    public void close() {
        if (mongoClient != null) {
            mongoClient.close();
            mongoClient = null;
        }
    }

    /**
     * 测试入口
     * 
     * @param args
     */
    public static void main(String[] args) {
    	
    	try {
			DBObject query = new BasicDBObject();
			query.put("refId", "29ae5b393ca70a0a11cb33a1509c044b");
			query.put("type", "1");
			BasicDBObject update = new BasicDBObject();
			BasicDBObject update_new = new BasicDBObject();
			update.append("$set", update_new.append("fileName", "FFF.png"));
			//更新文件内容
			update_new.append("file", null);
			//------------------------------------------
			MongoDBUtil.getCollection("QYDJ_FJ_LC").update(query, update, false, false);
	        //------------------------------------------
		} catch (Exception e) {
			e.printStackTrace();
		}

        /*String collName = "ELComData_etl";
        DBCollection coll = MongoDBUtil.getCollection(collName);*/

        // 插入多条
        // for (int i = 1; i <= 4; i++) {
        // Document doc = new Document();
        // doc.put("name", "zhoulf");
        // doc.put("school", "NEFU" + i);
        // Document interests = new Document();
        // interests.put("game", "game" + i);
        // interests.put("ball", "ball" + i);
        // doc.put("interests", interests);
        // coll.insertOne(doc);
        // }

        // // 根据ID查询
        // String id = "556925f34711371df0ddfd4b";
        // Document doc = MongoDBUtil2.findById(coll, id);
        // System.out.println(doc);

        // 查询多个
        /* DBCursor cursor = coll.find();
         
         while (cursor.hasNext()) {
        	 DBObject obj = cursor.next();
        	 System.out.println(obj.toString());
 		} 
         
         cursor.close();*/

        // 查询多个
        // MongoCursor<Person> cursor2 = coll.find(Person.class).iterator();

        // 删除数据库
        // MongoDBUtil2.dropDB("testdb");

        // 删除表
        // MongoDBUtil2.dropCollection(dbName, collName);

        // 修改数据
        // String id = "556949504711371c60601b5a";
        // Document newdoc = new Document();
        // newdoc.put("name", "时候");
        // MongoDBUtil.updateById(coll, id, newdoc);

        // 统计表
        // System.out.println(MongoDBUtil.getCount(coll));

        // 查询所有
        //Bson filter = Filters.eq("count", 0);
       // MongoDBUtil.find(coll, filter);

    }
}
基础操作类
package com.jit.file.dao;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;

import com.jit.file.Utils.BeanUtil;
import com.jit.file.Utils.MongoDBUtil;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.gridfs.GridFS;

/**
 * mongodb 基础操作类
 * @author 
 * @param <T>
 */
@Repository
public class MongodbDao {
	
	private static final Logger logger = LoggerFactory.getLogger(MongodbDao.class);

    
    
    /**
     * 根据对象 增
     * @param Object instance
     * @throws IllegalAccessException 
     * @throws IllegalArgumentException 
     * 
     */
    public void save(Object instance) throws Exception {
    	
    	try {
    		logger.debug("save entity: {}", instance.toString());
    		MongoDBUtil.getCollection(instance.getClass().getSimpleName())
			.insert(BeanUtil.bean2DBObject(instance));
    		
		} catch (RuntimeException re) {
			logger.error("save failed", re);
			throw re;
		}
    	
    }
    
    /**
     * 根据对象  增  临时表(同一表对象存储 如:表A 存为 表A_temp)
     * @param Object 对象
     * @param temp  临时表后缀
     */
    public void save(Object instance,String temp) throws Exception{
    	
    	try {
    		logger.debug("save entity: {}", instance.toString());
    		MongoDBUtil.getCollection(instance.getClass().getSimpleName()+"_"+temp)
			.insert(BeanUtil.bean2DBObject(instance));
    		
		} catch (RuntimeException re) {
			logger.error("save failed", re);
			throw re;
		}
    	
    }
    
    /**
     * 根据对象  增  临时表(同一表对象存储 如:表A 存为 表A_temp)
     * @param Object 对象
     * @param temp  临时表后缀
     */
    public void saveetl(Object instance) throws Exception{
    	
    	try {
    		logger.debug("save entity: {}", instance.toString());
    		MongoDBUtil.getCollection(instance.getClass().getSimpleName().replace("_etl", ""))
			.insert(BeanUtil.bean2DBObject(instance));
    		
		} catch (RuntimeException re) {
			logger.error("save failed", re);
			throw re;
		}
    	
    }

    /**
     * 根据对象  增  临时表(同一表对象存储 如:表A 存为 表A_temp)
     * @param Object 对象
     * @param temp  临时表后缀
     */
    public void saveetl_temp(Object instance) throws Exception{
    	
    	try {
    		logger.debug("save entity: {}", instance.toString());
    		MongoDBUtil.getCollection(instance.getClass().getSimpleName().replace("_etl", "")+"_temp")
			.insert(BeanUtil.bean2DBObject(instance));
    		
		} catch (RuntimeException re) {
			logger.error("save failed", re);
			throw re;
		}
    	
    }
    public GridFS connectDB(){
    	DB db = MongoDBUtil.getDB();
    	GridFS gridFS= new GridFS(db,"fs");
		return gridFS;
    }
    public GridFS connectDB2(String db_name){
    	DB db = MongoDBUtil.getDB();
    	GridFS gridFS= new GridFS(db,db_name);
		return gridFS;
    }
    // ======= 删 ============

    /**
     * 根据id 删除对象
     * @param <T>
     * 
     * @param id
     */
    public <T> void deleteById(String id,T instance) throws Exception{
    	
    	try {
    		logger.debug("delet entity: {}", instance.getClass().getSimpleName()+ " id : " + id);
    		
    		DBObject query = new BasicDBObject();
    		query.put("_id", id);
            
    		MongoDBUtil.getCollection(instance.getClass().getSimpleName()).remove(query);
    		
		} catch (RuntimeException re) {
			logger.error("delet failed", re);
			throw re;
		}
    	
    }
    
    /**
     * 根据id 删除对象 临时表(同一表对象存储 如:表A 存为 表A_temp)
     * @param <T>
     * 
     * @param id
     */
    public <T> void deleteById(String id,T instance,String temp) throws Exception{
    	
    	try {
    		logger.debug("delet entity: {}", instance.getClass().getSimpleName()+ " id : " + id);
    		
    		DBObject query = new BasicDBObject();
    		query.put("_id", id);
            
    		MongoDBUtil.getCollection(instance.getClass().getSimpleName()+"_"+temp).remove(query);
    		
		} catch (RuntimeException re) {
			logger.error("delet failed", re);
			throw re;
		}
    	
    }

    /**
     * 根据条件删除
     */
    public <T> void delete(DBObject query,T instance) throws Exception{
    	
    	try {
    		logger.debug("delet entity: {}", query);
    		
    		MongoDBUtil.getCollection(instance.getClass().getSimpleName()).remove(query);
    		
		} catch (RuntimeException re) {
			logger.error("delet failed", re);
			throw re;
		}
    	
    }
    
    // ======= 修改============
    /**
    * 更新满足条件的所有记录
    * @param <T>
    * @param query
    * @param update
    */
    public <T> void updateMulti(DBObject query, DBObject update,Class<T> clazz) throws Exception{
    	
    	try {
    		logger.debug("[Mongo Dao ]updateMulti:("+query+"),("+update+")");
    		
    		MongoDBUtil.getCollection(clazz.getSimpleName()).updateMulti(query, update);
    		
		} catch (RuntimeException re) {
			logger.error("updateMulti failed", re);
			throw re;
		}
    	
    }
    
    /**
     * 更新满足条件的所有记录  临时表(同一表对象存储 如:表A 存为 表A_temp)
     * @param <T>
     * @param query
     * @param update
     */
     public <T> void updateMulti(DBObject query, DBObject update,Class<T> clazz,String temp) throws Exception{
     	
    	 try {
     		logger.debug("[Mongo Dao ] updateMulti:("+query+"),("+update+")");
     		
     		MongoDBUtil.getCollection(clazz.getSimpleName()+"_"+temp).updateMulti(query, update);
     		
 		} catch (RuntimeException re) {
 			logger.error("updateMulti failed", re);
 			throw re;
 		}
    	 
     }
     
     /**
      * 更新满足条件的所有记录(新)
      * @param <T>
      * @param query
      * @param update
      */
      public <T> void update(DBObject query, BasicDBObject update,Class<T> clazz,boolean multi) throws Exception{
      	
      	try {
      		logger.debug("[Mongo Dao ]updateMulti:("+query+"),("+update+")");
      		MongoDBUtil.getCollection(clazz.getSimpleName()).update(query, update,false,multi);
      		
  		} catch (RuntimeException re) {
  			logger.error("updateMulti failed", re);
  			throw re;
  		}
      	
      }

    // ======= 查 ============
    /**
     * 根据查询query 查找list
     * @param <T>
     * @param query
     * @return
     */
    @SuppressWarnings("unchecked")
	public <T> List<T> find(DBObject query,T bean) throws Exception {
    	
    	try {
     		logger.debug("[Mongo Dao ] find:("+query+") ");
     		
     		DBCursor find = MongoDBUtil.getCollection(bean.getClass().getSimpleName()).find(query);
     		Class<T> c = (Class<T>) bean.getClass();
            
        	List<T> list = new ArrayList<T>();
        	while (find.hasNext()) {
        		T o = c.newInstance();
    			DBObject dbObject = (DBObject) find.next();
    			T dbObjectToBean = dbObjectToBean(dbObject, o);
    			list.add(dbObjectToBean);
    		}
            return list;
 		} catch (RuntimeException re) {
 			logger.error("find failed", re);
 			throw re;
 		}
    	
    }
    
	/**
	 * 获取文件列表时不获取文件内容的方法,可以提高查询效率,需要新建没有文件的实体类,并传入表(集合)名
	 */
    @SuppressWarnings("unchecked")
	public <T> List<T> findNoFile(DBObject query,T noFileBean,String beanName) throws Exception {
    	
    	try {
    		logger.debug("[Mongo Dao ] find:("+query+") ");
    		DBCursor find = MongoDBUtil.getCollection(beanName).find(query);
    		Class<T> c = (Class<T>) noFileBean.getClass();
    		
    		List<T> list = new ArrayList<T>();
    		while (find.hasNext()) {
    			T o = c.newInstance();
    			DBObject dbObject = (DBObject) find.next();
    			T dbObjectToBean = dbObjectToBean(dbObject, o);
    			list.add(dbObjectToBean);
    		}
    		return list;
    	} catch (RuntimeException re) {
    		logger.error("find failed", re);
    		throw re;
    	}
    	
    }

    /**
     * 根据查询query 查找一个对象
     * @param <T>
     * @param query
     * @return
     * @throws NoSuchMethodException 
     * @throws InvocationTargetException 
     * @throws IllegalAccessException 
     */
    public <T> T findOne(DBObject query,T bean) throws Exception {
    	
    	
    	try {
     		logger.debug("[Mongo Dao ] findOne:("+query+") ");
     		
     		DBObject dbObject = MongoDBUtil.getCollection(bean.getClass().getSimpleName()).findOne(query);
     		if(dbObject != null){
     			T dbObjectToBean = dbObjectToBean(dbObject, bean);
     			return dbObjectToBean;
     		}else{
     			return null;
     		}
 		} catch (RuntimeException re) {
 			logger.error("findOne failed", re);
 			throw re;
 		}
    	
    }
    
    
    /**
     * 根据查询query 查找一个对象  临时表(同一表对象存储 如:表A 存为 表A_temp)
     * @param <T>
     * @param query
     * @return
     * @throws NoSuchMethodException 
     * @throws InvocationTargetException 
     * @throws IllegalAccessException 
     */
    public <T> T findOne(DBObject query,T bean,String temp) throws Exception {
    	
    	try {
     		logger.debug("[Mongo Dao ] findOne:("+query+") ");
     		
     		DBObject dbObject = MongoDBUtil.getCollection(bean.getClass().getSimpleName()+"_"+temp).findOne(query);
     		T dbObjectToBean = dbObjectToBean(dbObject, bean);
            return dbObjectToBean;
 		} catch (RuntimeException re) {
 			logger.error("findOne failed", re);
 			throw re;
 		}
    	
    }
    
    /**
     * 根据查询query 查找一个对象  临时表(同一表对象存储 如:表A 存为 表A_temp)
     * @param <T>
     * @param query
     * @return
     * @throws NoSuchMethodException 
     * @throws InvocationTargetException 
     * @throws IllegalAccessException 
     */
    public <T> T findOneEtl(DBObject query,T bean) throws Exception {
    	
    	try {
     		logger.debug("[Mongo Dao ] findOne:("+query+") ");
     		
     		DBObject dbObject = MongoDBUtil.getCollection(bean.getClass().getSimpleName().replace("_etl", "")+"_temp").findOne(query);
     		T dbObjectToBean = dbObjectToBean(dbObject, bean);
            return dbObjectToBean;
 		} catch (RuntimeException re) {
 			logger.error("findOne failed", re);
 			throw re;
 		}
    	
    }
    /**
     * 查询分页  tips:[不要skip 太多的页数,如果跳过太多会严重影响效率。最大不要skip 20000页]
     * @param page
     * @param query
     * @return
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
	public <T> Map findPage(DBObject query,DBObject orderBy,Object instance,int page,int rows) {
        
    	
    	try {
     		logger.debug("[Mongo Dao ] findPage :("+query+"),("+orderBy+"),("+page+"),("+rows+") ");
     		
     		//db.test.sort({"amount":1}).skip(100000).limit(10)  //183ms
        	//db.test.find({amount:{$gt:2399927}}).sort({"amount":1}).limit(10)  //53ms
     		
     		//总页数
    		Long totalNum =  getPageCount(query,instance);
    		
    		int totalPage = (int) Math.ceil(totalNum / rows);
    		if((totalNum % rows)>0||totalNum < rows){
    			totalPage++;
    		}
     		
        	DBCursor cursor = MongoDBUtil.getCollection(instance.getClass().getSimpleName())
            .find(query).skip((page - 1) * rows)
            .limit(rows).sort(orderBy);
        	
    		//分页查询
    		List<DBObject> list = new ArrayList<DBObject>();
    		
    		while (cursor.hasNext()) {
    		    list.add(cursor.next());
    		} 
    		
    		//返回的结果
    		Map returnMap = new HashMap();
    		returnMap.put("result", list);
    		returnMap.put("totalNum",totalNum );
    		returnMap.put("totalPage", totalPage);
    		
    		return returnMap;
    		
 		} catch (RuntimeException re) {
 			logger.error("findPage failed", re);
 			throw re;
 		}
    	
        
    }
    
@SuppressWarnings({ "unused", "unchecked" })
public <T> List<T> findPage1(DBObject query,DBObject orderBy,Object instance,int page,int rows) throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        
    	//db.test.sort({"amount":1}).skip(100000).limit(10)  //183ms
    	//db.test.find({amount:{$gt:2399927}}).sort({"amount":1}).limit(10)  //53ms
    	
    	//总页数
		Long totalNum =  getPageCount(query,instance);
		
		int totalPage = (int) Math.ceil(totalNum / rows);
		if((totalNum % rows)>0||totalNum < rows){
			totalPage++;
		}
		
		logger.info("[Mongo Dao ]queryPage:" + query);
    	DBCursor cursor =MongoDBUtil.getCollection(instance.getClass().getSimpleName())
        .find(query).skip((page - 1) * rows)
        .limit(rows).sort(orderBy);
    	
    Class<T> c = (Class<T>) instance.getClass();
      
  	List<T> list = new ArrayList<T>();
  	while (cursor.hasNext()) {
  		T o = c.newInstance();
  		DBObject dbObject = (DBObject) cursor.next();
  		T dbObjectToBean = dbObjectToBean(dbObject, o);
  		list.add(dbObjectToBean);
  	}
	return list;
        
        
    }
    
    
    /**
     * 根据条件查询库中符合记录的总数,为分页查询服务
     *
     * @param <T>
     * @param query 查询条件
     * @return 满足条件的记录总数
     */
    public <T> Long getPageCount(DBObject query,Object instance){
    	logger.info("[Mongo Dao ]queryPageCount:" + query);
        return MongoDBUtil.getCollection(instance.getClass().getSimpleName()).count(query);
    }
    
    
    
    /**
     * 将DBObject转换成Bean对象
     * 
     */
    public static <T> T dbObjectToBean(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();
            Object object = dbObject.get(varName);
            if (object != null) {
                BeanUtils.setProperty(bean, varName, object);
            }

        }
        return bean;
    }

    // 取出Mongo中的属性值,为bean赋值
    public static <T> void setProperty(T bean, String varName, T object) {
        varName = varName.substring(0, 1).toUpperCase() + varName.substring(1);
        try {
            String type = object.getClass().getName();
            // 类型为String
            if (type.equals("java.lang.String")) {
            	Method m = bean.getClass().getMethod("get" + varName);
                String value = (String) m.invoke(bean);
                if (value == null) {
                    m = bean.getClass()
                            .getMethod("set" + varName, String.class);
                    m.invoke(bean, object);
                }
            }
            // 类型为Integer
            if (type.equals("java.lang.Integer")) {
                Method m = bean.getClass().getMethod("get" + varName);
                String value = (String) m.invoke(bean);
                if (value == null) {
                    m = bean.getClass().getMethod("set" + varName,
                            Integer.class);
                    m.invoke(bean, object);
                }
            }
            // 类型为Boolean
            if (type.equals("java.lang.Boolean")) {
                Method m = bean.getClass().getMethod("get" + varName);
                String value = (String) m.invoke(bean);
                if (value == null) {
                    m = bean.getClass().getMethod("set" + varName,
                            Boolean.class);
                    m.invoke(bean, object);
                }
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

    /**
     * 查询Etl
     * @param query
     * @return
     */
    @SuppressWarnings("unchecked")
	public <T> List<T> findEtl(DBObject query,DBObject orderBy,T instance,int skip) throws Exception{
		logger.info("[Mongo Dao ]queryPage:" + query);
    	DBCursor cursor =MongoDBUtil.getCollection(instance.getClass().getSimpleName())
        .find(query).skip(skip)
        .limit(1000).sort(orderBy);
    	
    	
    	Class<T> c = (Class<T>) instance.getClass();
        
    	List<T> list = new ArrayList<T>();
    	while (cursor.hasNext()) {
    		T o = c.newInstance();
			DBObject dbObject = (DBObject) cursor.next();
			T dbObjectToBean = dbObjectToBean(dbObject, o);
			list.add(dbObjectToBean);
		}
        return list;  	
    }
   
}
实体bean对象转成DBObject
package com.jit.file.Utils;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;

import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;

public class BeanUtil {

  /**
   * 把实体bean对象转换成DBObject
   * @param bean
   * @return
   * @throws IllegalArgumentException
   * @throws IllegalAccessException
   */
  @SuppressWarnings("rawtypes")
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) {
	      // 获取属性名
	      String varName = field.getName();
	      // 修改访问控制权限
	      boolean accessFlag = field.isAccessible();
	      if (!accessFlag) {
	    	  field.setAccessible(true);
	      }
	      Object param = field.get(bean);
	      if(param == null) {
	    	  continue;
	      }else if ("serialVersionUID".equals(varName)) {
	          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);
	      }else if (param instanceof Map) {
	    	  Map value = (Map) param;
	          dbObject.put(varName, value);
	      }else if (param instanceof byte[]) {
	    	  byte[] value = (byte[]) 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();
		  Object object = dbObject.get(varName);
		  if (object != null) {
			  BeanUtils.setProperty(bean, varName, object);
		  }
	  }
	  return bean;
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值