`
littie1987
  • 浏览: 133872 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

MongoDB和JavaBean对象的转化工具类

 
阅读更多
package com.paile.utils.beans;

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.Vector;

import org.apache.commons.beanutils.BeanUtils;

import com.mongodb.BasicDBList;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;

public class DBObjectToJavaBean {

	public static <T> List<T> cursorToList(DBCursor cursor, Class<T> clazz)
			throws Exception {
		List<T> list = new ArrayList<T>();
		while (cursor.hasNext()) {
			DBObject dbObj = cursor.next();
			T t = propertySetter(dbObj, clazz);
			list.add(t);
		}
		return list;
	}

	public static <T> T propertySetter(DBObject dbObj, Class<T> clazz)
			throws Exception {
		if (dbObj == null)
			return null;
		T t = clazz.newInstance();
		recyleSetter(dbObj, t);
		return t;
	}

	/***
	 * 递归所有属性
	 * 
	 * @param dbObj
	 * @param bean
	 * @throws Exception
	 */
	private static void recyleSetter(DBObject dbObj, Object bean) throws Exception {
		Iterator<String> it = dbObj.keySet().iterator();
		while (it.hasNext()) {
			String key = it.next();
			Object value = dbObj.get(key);
			recyleValueJutisy(key, value, bean);
		}
	}

	@SuppressWarnings("rawtypes")
	private static void recyleValueJutisy(String key, Object value, Object bean)
			throws Exception {
		if (value instanceof BasicDBList) {
			BasicDBList dblist = (BasicDBList) value;
			Iterator<Object> it = dblist.iterator();
			Class<?> type = null;
			try {
				type = getPropertyType(bean, key);
				List list = new ArrayList();
				while (it.hasNext()) {
					Object object = it.next();
					if (object instanceof DBObject) {
						DBObject dbItem = (DBObject) object;
						Object o = type.newInstance();
						recyleSetter(dbItem, o);
						list.add(o);
					} else if (object instanceof String) {
						list.add(object);
					}
				}
				BeanUtils.setProperty(bean, key, list);
			} catch (NoSuchFieldException e) {
			}

		} else if (value instanceof DBObject) {
			DBObject dbItem = (DBObject) value;
			Class<?> type = getPropertyType(bean, key);
			Class tclazz = Timestamp.class;
			if (type == tclazz) {
				// 时间类型
				Object otime = dbItem.get("time");
				if (otime != null) {
					long time = Long.parseLong(String.valueOf(otime));
					Timestamp st = new Timestamp(time);
					BeanUtils.setProperty(bean, key, st);
				}
			} else {
				Object o = type.newInstance();
				recyleSetter(dbItem, o);
				BeanUtils.setProperty(bean, key, o);
			}
		} else {
			Class<?> clazz = bean.getClass();
			Field field;
			try {
				field = clazz.getDeclaredField(key);
				if (field != null) {
					if (value != null) {
						if ("".equals(value)) {
							if (field.getType() == String.class)
								BeanUtils.setProperty(bean, key, value);
						} else {
								BeanUtils.setProperty(bean, key, value);
						}
					}

				}
			} catch (NoSuchFieldException e) {
			}

		}
	}

	/**
	 * @param bean
	 * @param key
	 * @return
	 * @throws Exception
	 */
	private static Class getPropertyType(Object bean, String key) throws Exception {
		Class<?> clazz = bean.getClass();
		Field f = clazz.getDeclaredField(key);
		Class t = f.getType();
		if (t.getName().startsWith("java.lang")) {
			return t;
		}
		if (t.isAssignableFrom(List.class) || t.isAssignableFrom(Set.class)
				|| t.isAssignableFrom(Vector.class)) {
			Type gt = f.getGenericType();
			if (gt == null) {
				return t;
			}
			if (gt instanceof ParameterizedType) {
				ParameterizedType pt = (ParameterizedType) gt;
				Class genericClazz = (Class) pt.getActualTypeArguments()[0];
				if (genericClazz != null) {
					return genericClazz;
				}
			}
		}
		return t;
	}
}

   使用说明:

   例如:想把一个DBOBject对象转换为UserBean:

UserBean user = DBObjectToJavaBean .propertySetter(dbObj,UserBean.class);
//该方法支持多层Mongo对象的转化

 

分享到:
评论

相关推荐

    java针对mongo操作的封装,完全面向对象,无需修改,可直接使用

    完全面向对象的mongo封装,maven工程源码,可直接install导出jar包引用,支持基本的增删改查和分页等,使用反射对javaBean实体进行映射,所有方法参数只需要传javaBean就行了,支持带密码连接,即拿即用,无需修改。

    SpringBoot整合MongoDB.docx

    接下来,我们通过 `@SpringBootTest` 和 `@RunWith(SpringRunner.class)` 注解创建一个测试类 `MongoTest`,并利用 `@Autowired` 注解注入 `MongoTemplate` 对象: ```java import org.junit.Test; import org....

    json2javabean josnschema2pojo

    JSON到Java Bean转换工具,如"json2javabean"和"josnschema2pojo",是开发人员在处理JSON数据与Java对象之间转换时的便利工具。这些工具能够根据JSON格式的数据自动生成对应的Java类,使得数据绑定变得更加简单和...

    Hutool 参考文档.pdf

    16进制工具(HexUtil)、Escape工具(EscapeUtil)、Hash算法(HashUtil)、URL工具(URLUtil)、XML工具(XmlUtil)和对象工具(ObjectUtil)都提供了对应处理功能的工具类。 反射工具(ReflectUtil)、泛型类型...

    基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.4.0.pdf

    8. **模板工具类增强**:FtlUtils工具类新增了一些方法,简化了模板配置的操作。 9. **中文参数支持**:Apache-commons包进行了全面升级,ini配置文件现在支持中文写入和显示,提高了对中文环境的兼容性。 10. **...

    网上购物系统(JavaBean+Servlet+jsp).zip

    【标题】"网上购物系统(JavaBean+Servlet+jsp)"是一个基于Java技术栈开发的电子商务应用程序,它利用了JavaBean、Servlet和JSP(JavaServer Pages)这三种核心技术来实现前端用户界面、业务逻辑处理以及数据存储交互...

    基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.4.0版)

    8、FtlUtils工具类添加一些新的方法,方便模板配置 9、Apache-commons包全面升级,ini配置文件中的参数支持中文写入和显示 10、修复已知Bug并进行了一些优化 官 网:http://www.tablego.cn 码 云:...

    word123456ads

    这里我们主要探讨几个重要的概念:面向bean编程、面向切面编程、面向对象编程,以及与Hadoop、HBase、Hive、Storm、MongoDB和Struts2相关的知识点。 1. **面向bean编程**(Bean Oriented Programming):虽然这个...

    java web 一个简陋的网站页面

    Java Web 是一种用于开发Web应用程序的技术栈,它主要基于Java语言,结合了Servlet、JSP(JavaServer Pages)和JavaBean等组件。在这个简陋的网站页面中,我们可以推测其核心是利用这些技术来实现基本的网页展示和...

    基于工作过程系统化的Java Web应用开发课程研究.zip

    首先,课程可能会从基础的Java编程语言开始,讲解面向对象编程的概念,包括类、对象、继承、封装和多态性。这为后续的Web开发打下坚实的基础。接着,会深入到Servlet和JSP,解释它们在动态网页生成中的作用,以及...

    Java网络编程与分布式计算

    Java的`java.lang.Thread`类和`java.util.concurrent`包提供了丰富的多线程支持,包括线程的创建、同步和协作。`synchronized`关键字用于控制并发访问,`wait()`、`notify()`和`notifyAll()`方法则用于线程间的通信...

    javadaima

    在Java Web开发中,这样的文件可能与数据库设计有关,比如用Mongoose(一个MongoDB对象数据模型库)在Node.js环境中创建的数据模型文件,或者可能是使用某种特定的数据分析工具所创建的模型。 学习Java Web开发通常...

    阿里巴巴java部分笔试试题(2份)

    综上所述,准备阿里巴巴的Java面试需要扎实的编程基础,深入理解Java核心技术,熟悉常用的框架和工具,以及具备一定的算法和数据结构知识。通过认真研究提供的笔试试题,求职者可以有针对性地提升自己的技能,提高...

    Java 图书管理系统

    4. **JavaBean**:JavaBean是一种符合特定规范的Java类,通常用于封装数据和提供简单的业务逻辑。在这个系统中,JavaBean可能代表图书实体,包含属性如书名、作者、出版社等,以及对应的getter和setter方法。 5. **...

    Java实现webQQ聊天完整代码

    在这个项目中,JavaBean可以代表用户、聊天室或者消息对象,它们的属性和方法可以被Servlet和JSP调用,进行数据操作。 4. **QQ协议**:为了实现QQ聊天功能,项目需要理解和实现QQ的通信协议。这可能涉及到网络编程...

    java分页控件.rar

    这些标签库提供了一套完整的分页解决方案,只需在JSP页面中插入相应的标签,配合后台的JavaBean或Action类,就可以实现分页功能。DisplayTag支持多种定制,如排序、国际化等。 2. **Servlet + JSP**:通过Servlet...

    基于JSP的网上办公系统设计.doc

    JSP作为表现层,负责展示信息和接收用户输入,Servlet或JavaBean作为业务逻辑层处理请求,而数据库(如MySQL、Oracle等)用于存储和检索数据。 2. **用户认证与权限管理**:系统需要实现实名登录、权限控制,确保...

    uf-web-mobile

    3. **JavaBean**:JavaBean是遵循特定规范的Java类,常作为可重用的组件,用于封装业务逻辑。在Web应用中,JavaBean可以存储和管理数据,提供给Servlet或JSP使用。 4. **MVC架构**:Model-View-Controller(模型-...

    基于 JavaEE 的快速开发框架 Tephra-JavaEE

    提供MongoDB工具实现对NoSQL的支持,支持负载均衡。 提供轻量级、快速响应的控制器,允许设置最大并发峰值,以确保在突如其来的并发攻击后能继续正常提供服务;也允许设置单IP最大并发量,确保小量IP并发攻击时仍能...

Global site tag (gtag.js) - Google Analytics