Mongdb3.2-java document转javabean

本文介绍了一种在Spring版本较低的情况下,通过mongo-java-driver实现MongoDB与Java应用的交互方法,并提供了一段将MongoDB查询结果转换为JavaBean的实用代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   项目中由于框架中的spring版本过低,不支持spring与mongodb的整合,只能使用mongo-java-driver-3.2.2.jar来进行mongodb数据库与java的交互。由于mongodb3.2以上版本查询结果是一个document,mongodb官方暂未提供document转javabean的方法。查遍万能的某百某谷不得方法,于是自己写了一个document转Javabean的方法,望各位大神不吝赐教。


/**
* 根据查询的记录转成javabean
* @param collection
* @param filter
* @param obj
* @return
*/
public List queryToBeanList(MongoCollection<Document> collection,Bson filter,Object obj){
List list = new ArrayList();
MongoCursor<Document> cursor = null;
if (filter!=null) {
cursor = collection.find(filter).iterator();
}else {
cursor = collection.find().iterator();
}

while(cursor.hasNext()){  
Document doc = cursor.next();
Object object;
try {
object = ReflectUtil.setFieldValue(obj.getClass().newInstance(), doc);
list.add(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();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
return list;
}

    /**
* 根据mongodb中的document记录设置对应的实体类的属性
* @param obj
* @param doc
* @return
* @throws NoSuchMethodException
* @throws SecurityException
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws InvocationTargetException
* @throws InstantiationException
*/
public static Object setFieldValue(Object obj, Document doc)
throws NoSuchMethodException, SecurityException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException, InstantiationException {
Class clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
Method[] methods = clazz.getDeclaredMethods();
for (Field field : fields) {
String name = field.getName();
String setName = parseSetName(name);
if (!checkSetMethod(methods, setName)) {
continue;
}
String fieldType = field.getType().getName();
Method fieldSetMet = clazz.getDeclaredMethod(setName,
field.getType());
if ("java.lang.String".equalsIgnoreCase(fieldType)) {
String value = doc.getString(name);
if (value==null||"".equals(value)) {
continue;
}
fieldSetMet.invoke(obj, value);
} else if ("java.lang.Integer".equalsIgnoreCase(fieldType)
|| "int".equalsIgnoreCase(fieldType)) {
Integer value = doc.getInteger(name);
if (value==null) {
continue;
}
fieldSetMet.invoke(obj, value);
} else if ("java.lang.Long".equalsIgnoreCase(fieldType)
|| "long".equalsIgnoreCase(fieldType)) {

Long value = doc.getLong(name);
if (value==null) {
continue;
}
fieldSetMet.invoke(obj, value);
} else if ("java.lang.Double".equalsIgnoreCase(fieldType)
|| "long".equalsIgnoreCase(fieldType)) {
Double value = doc.getDouble(name);
if (value==null) {
continue;
}
fieldSetMet.invoke(obj, value);
} else if ("java.lang.Boolean".equalsIgnoreCase(fieldType)
|| "boolean".equalsIgnoreCase(fieldType)) {
Boolean value = doc.getBoolean(name);
if (value==null) {
continue;
}
fieldSetMet.invoke(obj, value);
} else if ("java.sql.Timestamp".equalsIgnoreCase(fieldType)) {
Date date = doc.getDate(name);
if(date==null){
continue;
}
fieldSetMet.invoke(obj, new java.sql.Timestamp(date.getTime()));
} else if ("java.sql.Date".equalsIgnoreCase(fieldType)) {
Date date = doc.getDate(name);
if(date==null){
continue;
}
fieldSetMet.invoke(obj, new java.sql.Date(date.getTime()));
} else if ("java.util.Date".equalsIgnoreCase(fieldType)) {
Date date = doc.getDate(name);
if(date==null){
continue;
}
fieldSetMet.invoke(obj, date);
} else if ("java.util.List".equalsIgnoreCase(fieldType)) {
List<Document> docs = (List<Document>) doc.get(name);
if (docs==null||docs.size()==0) {
continue;
}
Class fieldClazz = field.getType(); // 得到field的class及类型全路径+
Class genericClazz = null;
if (fieldClazz.isAssignableFrom(List.class)) //
{
Type fc = field.getGenericType(); // 关键的地方,如果是List类型,得到其Generic的类型


if (fc instanceof ParameterizedType) //如果是泛型参数的类型
{
ParameterizedType pt = (ParameterizedType) fc;


genericClazz = (Class) pt.getActualTypeArguments()[0]; // 得到泛型里的class类型对象。


}
}
List list = new ArrayList<>();
for (Document document : docs) {
Object genericobj = genericClazz.newInstance();
Object object = setFieldValue(genericobj, document);
list.add(object);
}
fieldSetMet.invoke(obj, list);
}else {
String docName = field.getType().getSimpleName();
Document document = (Document)doc.get(docName);
if (document==null) {
continue;
}
Class fieldClazz = field.getType();
Object object = fieldClazz.newInstance();
object = setFieldValue(object,document);
fieldSetMet.invoke(obj, object);
}
}
return obj;
}



/**
* 检查实体类中是否有set方法
* @param methods
* @param methodName
* @return
*/
public static boolean checkSetMethod(Method[] methods, String methodName) {
for (Method method : methods) {
if (methodName.equals(method.getName())) {
return true;
}
}
return false;
}

/**
* 根据属性名字拼接set方法名
* @param name
* @return
*/
public static String parseSetName(String name) {
if (name == null || "".equals(name)) {
return null;
}
return "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值