浅谈JAVA的反射,从ResultSet到POJO(JavaBean)
2008-10-07 11:06
429 查看
其实反射也不是什么高深莫测的东西。反射就是我们对一个未知对象进行操作,由于它是未知的,所以我们需要从类型等方面下手,使用该对象共有的方法和属性,引用自该对象,从而得到我们想要的结果。
本文简单列举了一个利用反射将ResultSet的值自动赋值到POJO(JavaBean)对象的一个实例,便于大家学习。
package demo;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.sql.ResultSetMetaData;
import java.sql.ResultSet;
/**
* 绑定数据处理
* Wrote by redria
*/
public class BindData {
/**
* 从ResultSet绑定到JavaBean
*
* @param ResultSet
* @param DTO(JavaBean)
* @return DTO
*/
public static DTO bindDataToDTO(ResultSet rs, DTO dto) throws Exception {
//取得Method方法
Method[] methods = dto.getClass().getMethods();
//取得ResultSet的列名
ResultSetMetaData rsmd = rs.getMetaData();
int columnsCount = rsmd.getColumnCount();
String[] columnNames = new String[columnsCount];
for (int i = 0; i < columnsCount; i++) {
columnNames[i] = rsmd.getColumnLabel(i + 1);
}
//遍历ResultSet
while (rs.next()) {
//反射, 从ResultSet绑定到JavaBean
for (int i = 0; i < columnNames.length; i++) {
//取得Set方法
String setMethodName = "set" + columnNames[i];
//遍历Method
for (int j = 0; j < methods.length; j++) {
if (methods[j].getName().equalsIgnoreCase(setMethodName)) {
setMethodName = methods[j].getName();
Object value = rs.getObject(columnNames[i]);
//实行Set方法
try {
//JavaBean内部属性和ResultSet中一致时候
Method setMethod = dto.getClass().getMethod(
setMethodName, value.getClass());
setMethod.invoke(dto, value);
} catch (Exception e) {
//JavaBean内部属性和ResultSet中不一致时候,使用String来输入值。
Method setMethod = dto.getClass().getMethod(
setMethodName, String.class);
setMethod.invoke(dto, value.toString());
}
}
}
}
}
//戻り値
return dto;
}
/**
*从ResultSet绑定到JavaBean数组
*
* @param ResultSet
* @param DTO(JavaBean)
* @return DTO数组
*/
public static DTO[] bindDataToDTOS(ResultSet rs, DTO dto) throws Exception {
//取得Method
Method[] methods = dto.getClass().getMethods();
//取得ResultSet的列名
ResultSetMetaData rsmd = rs.getMetaData();
int columnsCount = rsmd.getColumnCount();
String[] columnNames = new String[columnsCount];
for (int i = 0; i < columnsCount; i++) {
columnNames[i] = rsmd.getColumnLabel(i + 1);
}
//取得Class
Class<? extends DTO> dtoClass = dto.getClass();
//取得record数
rs.last();
int rsCnt = rs.getRow();
rs.beforeFirst();
//DTO[]初期化
DTO[] dtos = (DTO[]) Array.newInstance(dtoClass, rsCnt);
int dtoNow = 0;
//遍历ResultSet
while (rs.next()) {
//DTO[]中DTO初期化
dtos[dtoNow] = (DTO) dtoClass.newInstance();
//反射, 从ResultSet绑定到JavaBean
for (int i = 0; i < columnNames.length; i++) {
//取得Set方法
String setMethodName = "set" + columnNames[i];
//遍历Method
for (int j = 0; j < methods.length; j++) {
if (methods[j].getName().equalsIgnoreCase(setMethodName)) {
setMethodName = methods[j].getName();
Object value = rs.getObject(columnNames[i]);
//实行Set方法
try {
//JavaBean内部属性和ResultSet中一致时候
Method setMethod = dto.getClass().getMethod(
setMethodName, value.getClass());
setMethod.invoke(dtos[dtoNow], value);
} catch (Exception e) {
//JavaBean内部属性和ResultSet中不一致时候,使用String来输入值。
Method setMethod = dto.getClass().getMethod(
setMethodName, String.class);
setMethod.invoke(dtos[dtoNow], value.toString());
}
}
}
}
dtoNow++;
}
//返回值
return dtos;
}
}
当然这里的DTO是一个普通的JavaBean类。我们可以建立一个基类,然后建立我们要的JavaBean子类来继承于该基类,将子类扔进来反射,我们就可以得到一个绑定好数据的子类。诚然,我这里对数据类型判别的也不多,不是和ResultSet中一直的,统统变成了String,这里可以根据需要自行修改。
注意:这里如果要绑定,则必须JavaBean中的属性名称和ResultSet中的列名一致,反射也需要有一个参照对象不是么,不然绑定到哪里去呢?呵呵……
原理么,就是拿ResultSet中的列名和JavaBean中的属性名配对,然后赋值。
本文简单列举了一个利用反射将ResultSet的值自动赋值到POJO(JavaBean)对象的一个实例,便于大家学习。
package demo;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.sql.ResultSetMetaData;
import java.sql.ResultSet;
/**
* 绑定数据处理
* Wrote by redria
*/
public class BindData {
/**
* 从ResultSet绑定到JavaBean
*
* @param ResultSet
* @param DTO(JavaBean)
* @return DTO
*/
public static DTO bindDataToDTO(ResultSet rs, DTO dto) throws Exception {
//取得Method方法
Method[] methods = dto.getClass().getMethods();
//取得ResultSet的列名
ResultSetMetaData rsmd = rs.getMetaData();
int columnsCount = rsmd.getColumnCount();
String[] columnNames = new String[columnsCount];
for (int i = 0; i < columnsCount; i++) {
columnNames[i] = rsmd.getColumnLabel(i + 1);
}
//遍历ResultSet
while (rs.next()) {
//反射, 从ResultSet绑定到JavaBean
for (int i = 0; i < columnNames.length; i++) {
//取得Set方法
String setMethodName = "set" + columnNames[i];
//遍历Method
for (int j = 0; j < methods.length; j++) {
if (methods[j].getName().equalsIgnoreCase(setMethodName)) {
setMethodName = methods[j].getName();
Object value = rs.getObject(columnNames[i]);
//实行Set方法
try {
//JavaBean内部属性和ResultSet中一致时候
Method setMethod = dto.getClass().getMethod(
setMethodName, value.getClass());
setMethod.invoke(dto, value);
} catch (Exception e) {
//JavaBean内部属性和ResultSet中不一致时候,使用String来输入值。
Method setMethod = dto.getClass().getMethod(
setMethodName, String.class);
setMethod.invoke(dto, value.toString());
}
}
}
}
}
//戻り値
return dto;
}
/**
*从ResultSet绑定到JavaBean数组
*
* @param ResultSet
* @param DTO(JavaBean)
* @return DTO数组
*/
public static DTO[] bindDataToDTOS(ResultSet rs, DTO dto) throws Exception {
//取得Method
Method[] methods = dto.getClass().getMethods();
//取得ResultSet的列名
ResultSetMetaData rsmd = rs.getMetaData();
int columnsCount = rsmd.getColumnCount();
String[] columnNames = new String[columnsCount];
for (int i = 0; i < columnsCount; i++) {
columnNames[i] = rsmd.getColumnLabel(i + 1);
}
//取得Class
Class<? extends DTO> dtoClass = dto.getClass();
//取得record数
rs.last();
int rsCnt = rs.getRow();
rs.beforeFirst();
//DTO[]初期化
DTO[] dtos = (DTO[]) Array.newInstance(dtoClass, rsCnt);
int dtoNow = 0;
//遍历ResultSet
while (rs.next()) {
//DTO[]中DTO初期化
dtos[dtoNow] = (DTO) dtoClass.newInstance();
//反射, 从ResultSet绑定到JavaBean
for (int i = 0; i < columnNames.length; i++) {
//取得Set方法
String setMethodName = "set" + columnNames[i];
//遍历Method
for (int j = 0; j < methods.length; j++) {
if (methods[j].getName().equalsIgnoreCase(setMethodName)) {
setMethodName = methods[j].getName();
Object value = rs.getObject(columnNames[i]);
//实行Set方法
try {
//JavaBean内部属性和ResultSet中一致时候
Method setMethod = dto.getClass().getMethod(
setMethodName, value.getClass());
setMethod.invoke(dtos[dtoNow], value);
} catch (Exception e) {
//JavaBean内部属性和ResultSet中不一致时候,使用String来输入值。
Method setMethod = dto.getClass().getMethod(
setMethodName, String.class);
setMethod.invoke(dtos[dtoNow], value.toString());
}
}
}
}
dtoNow++;
}
//返回值
return dtos;
}
}
当然这里的DTO是一个普通的JavaBean类。我们可以建立一个基类,然后建立我们要的JavaBean子类来继承于该基类,将子类扔进来反射,我们就可以得到一个绑定好数据的子类。诚然,我这里对数据类型判别的也不多,不是和ResultSet中一直的,统统变成了String,这里可以根据需要自行修改。
注意:这里如果要绑定,则必须JavaBean中的属性名称和ResultSet中的列名一致,反射也需要有一个参照对象不是么,不然绑定到哪里去呢?呵呵……
原理么,就是拿ResultSet中的列名和JavaBean中的属性名配对,然后赋值。
相关文章推荐
- DAO层通用实现,结果集ResultSet转化为javaBean的反射实现,自动生成javaBean
- 利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils
- java的反射机制浅谈
- Java各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分
- java利用反射获取类属性名,获取JavaBean属性名
- 也浅谈下Java反射
- 利用反射与dom4j读取javabean生成对应XML和读取XML得到对应的javabean对象集合
- java 反射实现javabean转json
- JAVA的反射机制浅谈
- Java反射获取标准JavaBean属性
- Java反射之模拟JavaBean接收表单参数
- 浅谈java的反射机制,只是有助于去理解这一机制。
- Java深入(高新技术)(四):反射、Class、Constructor、Method、Field、数组的反射、JavaBean
- 浅谈Java的反射机制
- 浅谈Java中的反射机制以及Class、Constructor、Field、Method简单框架原理
- java中使用反射获取pojo(实体)类的所有字段值
- java对象 POJO和JavaBean的区别
- 浅谈 JavaBean与反射
- 浅谈Java反射
- 浅谈Java自定义注解和运行时靠反射获取注解