您的位置:首页 > 编程语言 > Java开发

浅谈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中的属性名配对,然后赋值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: