利用java反射将结果集封装成为对象和对象集合

Posted 星朝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用java反射将结果集封装成为对象和对象集合相关的知识,希望对你有一定的参考价值。

java反射机制是什么

反射机制是在运行状态中,可以知道任何一个类的属性和方法,并且调用类的属性和方法;

反射机制能够做什么

1、判断运行对象的所属类
2、构造任意一个类的对象
3、获取任意一个类的属性和方法
4、调用任意属性和方法
5、生成动态代理

利用反射将结果集封装成为对象或者集合(实测可用)

package coral.base.util;import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import wfc.service.database.RecordSet;

public class ReflectUtils {
/**
* 将一个map集合封装成为bean对象

* * @param param
* @param clazz
* @return
*/

public static <T> T MapToBean(Map<String, Object> param, Class<?> clazz) {
Object value = null;

Class[] paramTypes = new Class[1];

Object obj = null;

try {
obj = clazz.newInstance();

// 获取类的属性
Field[] declaredFields = clazz.getDeclaredFields();
// 获取父类或接口的公有属性
Field[] superFields = clazz.getSuperclass().getFields();

List<Field[]> list = new ArrayList<Field[]>();
if (declaredFields != null) {
list.add(declaredFields);
}
if (superFields != null) {
list.add(superFields);
}
for (Field[] fields : list) {
for (Field field : fields) {
String fieldName = field.getName();
// 获取属性对应的值?
value = param.get(fieldName);
// 把值设置进入对象属性中 这里可能是有属性但是没有相应的set方法,所以要做异常处理
try {
PropertyDescriptor pd = new PropertyDescriptor(
fieldName, clazz);
Method method = pd.getWriteMethod();
method.invoke(obj, new Object[] { value });
} catch (Exception e1) {
}
}
}
} catch (Exception e1) {
} return (T) obj;
}
/**
* 获取类的所有属性,包括父类和接口
* @param clazz
* @return
*/

public static List<Field[]> getBeanFields(Class<?> clazz) {
List<Field[]> list = new ArrayList<Field[]>();
Field[] declaredFields = clazz.getDeclaredFields();

Field[] superFields = clazz.getSuperclass().getFields();
if (declaredFields != null) {
list.add(declaredFields);

}
if (superFields != null) {
list.add(superFields);
}
return list;
} /**
* 从结果集中获取出值
* @param fieldName
* @param rs
* @return
*/

public static Object getFieldValue(String fieldName, ResultSet rs) {
Object value = null;
try {
//捕获值不存在的异常
value = rs.getObject(fieldName);
return value;
} catch (SQLException e) {
//oracle数据库的列都是大写,所以才查找一次
fieldName = fieldName.toLowerCase();
try {

value = rs.getObject(fieldName);
return value;
} catch (SQLException e1) {
//结果集中没有对应的值,返回为空
return null;
}

}
}
/**
* 方法重载,
* @param fieldName
* @param rs 这个是封装过的结果集
* @return
*/

public static Object getFieldValue(String fieldName, RecordSet rs) {
Object value = null;
value = rs.getObject(fieldName);
return value;
}

/**
* 方法重载
* @param rs 封装过的结果集
* @param clazz
* @return
*/

public static <T> T RSToBean(RecordSet rs, Class<?> clazz) {
Object obj = null;
List<Field[]> list = getBeanFields(clazz);
try {
obj = clazz.newInstance();

for (Field[] fields : list) {
for (Field field : fields) {
String fieldName = field.getName();
// String fieldName = field.getName();?
Object value = getFieldValue(fieldName, rs);
try {
PropertyDescriptor pd = new PropertyDescriptor(
fieldName, clazz);
Method method = pd.getWriteMethod();
method.invoke(obj, new Object[] { value });
} catch (Exception e1) {

}
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return (T) obj;
}
/**
* 把结果集封装成为bean对象
* @param rs
* @param clazz
* @return
*/

public static <T> T RSToBean(ResultSet rs, Class<?> clazz) {
Object obj = null;
List<Field[]> list = getBeanFields(clazz);
try {
while (rs.next()) {
obj = clazz.newInstance();


for (Field[] fields : list) {
for (Field field : fields) {
String fieldName = field.getName();
// String fieldName = field.getName();?
Object value = getFieldValue(fieldName, rs);
PropertyDescriptor pd = new PropertyDescriptor(
fieldName, clazz);
Method method = pd.getWriteMethod();
method.invoke(obj, new Object[] { value });
}
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return (T) obj;
}
/**
* 把结果集封装成为List

* * @param rs
* @param clazz
* @return
*/

public static <T> List<T> RsToList(ResultSet rs, Class<?> clazz) {
ArrayList<T> objList = new ArrayList<T>();
// 获取所有的属性
List<Field[]> list = getBeanFields(clazz);
try {
while (rs.next()) {
// 定义临时变量
Object tempObeject = clazz.newInstance();

// 添加到属性中
for (Field[] fields : list) {
for (Field field : fields) {
String fieldName = field.getName();
// 获取属性值?
Object value = getFieldValue(fieldName, rs);
PropertyDescriptor pd = new PropertyDescriptor(
fieldName, clazz);
Method method = pd.getWriteMethod();
method.invoke(tempObeject, new Object[] { value });
}
}
objList.add((T) tempObeject);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return objList;
}}






























































































































































































































以上是关于利用java反射将结果集封装成为对象和对象集合的主要内容,如果未能解决你的问题,请参考以下文章

jdbc利用java反射实现结果集得到处理:bug:argument type mismatch

java对jdbc操作结果简单的映射封装

利用反射技术将查询结果封装为对象

利用java反射将map值封装到对象中

Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法

利用反射机制实现对象转Map集合