我自己的處理:寫一個util類,然後封裝方法
@SuppressWarnings("unchecked")
public static List resultSetToList(ResultSet rs, Class cls)throws Exception {
//取得Method
Method[] methods = cls.getDeclaredMethods();
System.out.println(methods[0].getName());
List lst = new ArrayList();
// 用於獲取列數、或者列類型
ResultSetMetaData meta = rs.getMetaData();
Object obj = null;
while (rs.next()) {
// 獲取formbean實例對象
obj = cls.newInstance(); // 用Class.forName方法實例化對象和new創建實例化對象是有很大區別的,它要求JVM首先從類加載器中查找類,然後再實例化,並且能執行類中的靜態方法。而new僅僅是新建一個對象實例
// 循環獲取指定行的每一列的信息
for (int i = 1; i <= meta.getColumnCount(); i++) {
// 當前列名
String colName = meta.getColumnName(i);
// 設置方法名
String setMethodName = "set" + colName;
//遍歷Method
for (int j = 0; j < methods.length; j++) {
if (methods[j].getName().equalsIgnoreCase(setMethodName)) {
setMethodName = methods[j].getName();
System.out.println(setMethodName);
// 獲取當前位置的值,返回Object類型
Object value = rs.getObject(colName);
if(value == null){
continue;
}
//實行Set方法
try {
//// 利用反射獲取對象
//JavaBean內部屬性和ResultSet中一致時候
Method setMethod = obj.getClass().getMethod(
setMethodName, value.getClass());
setMethod.invoke(obj, value);
} catch (Exception e) {
//JavaBean內部屬性和ResultSet中不一致時候,使用String來輸入值。
e.printStackTrace();
}
}
}
}
lst.add(obj);
}
return lst;
}
相關參考:
原文地址 http://blog.csdn.net/redria/article/details/2988158
- 其實反射也不是什麼高深莫測的東西。反射就是我們對一個未知對象進行操作,由於它是未知的,所以我們需要從類型等方面下手,使用該對象共有的方法和屬性,引用自該對象,從而得到我們想要的結果。
- 本文簡單列舉了一個利用反射將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中的屬性名配對,然後賦值。
http://www.blogjava.net/wanghl259748/articles/277261.html
- 一般做法是將ResultSet封裝成一個個javabean然後將javabean放入list集合中返回。
- 類似於:
- public class test {
- DB dbx = new DB();
- public static List resultSetToList(String sql) throws SQLException {
- DB dbx = new DB();
- ResultSet rs = dbx.executeQuery(sql);
- ResultSetMetaData md = rs.getMetaData();
- for (int i = 0; i < md.getColumnCount(); i++) {
- System.out.println(md.getColumnName(i));
- System.out.println( "----------------- ");
- }
- List list = new ArrayList();
- while (rs.next()) {
- UserBean bean = new UserBean();
- int userid = rs.getInt( "userid ");
- String username = rs.getString( "username ");
- bean.setUserid(userid + " ");
- bean.setUsername(username);
- list.add(bean);
- System.out.println(userid + " "+username);
- }
- return list;
- }
- }
一般做法是將ResultSet封裝成一個個javabean然後將javabean放入list集合中返回。
類似於:
public class test {
DB dbx = new DB();
public static List resultSetToList(String sql) throws SQLException {
DB dbx = new DB();
ResultSet rs = dbx.executeQuery(sql);
ResultSetMetaData md = rs.getMetaData();
for (int i = 0; i < md.getColumnCount(); i++) {
System.out.println(md.getColumnName(i));
System.out.println( "----------------- ");
}
List list = new ArrayList();
while (rs.next()) {
UserBean bean = new UserBean();
int userid = rs.getInt( "userid ");
String username = rs.getString( "username ");
bean.setUserid(userid + " ");
bean.setUsername(username);
list.add(bean);
System.out.println(userid + " "+username);
}
return list;
}
}
另外一種方法
- package com.service;
- import java.lang.reflect.Method;
- import java.sql.ResultSet;
- import java.sql.ResultSetMetaData;
- import java.util.ArrayList;
- import java.util.List;
- import com.entity.Student;
- public class Service {
- public List toList(ResultSet rs,Class cls)
- {
- try
- {
- List lst=new ArrayList();
- //用於獲取列數、或者列類型
- ResultSetMetaData meta=rs.getMetaData();
- Object obj=null;
- while(rs.next())
- {
- //獲取formbean實例對象
- obj=Class.forName(cls.getName()).newInstance(); //用Class.forName方法實例化對象和new創建實例化對象是有很大區別的,它要求JVM首先從類加載器中查找類,然後再實例化,並且能執行類中的靜態方法。而new僅僅是新建一個對象實例
- //循環獲取指定行的每一列的信息
- for(int i=1;i<=meta.getColumnCount();i++)
- {
- //當前列名
- String colName=meta.getColumnName(i);
- //將列名第一個字母大寫(爲什麼加+""ne ?是大寫字母比小寫字母多個字節?)
- colName=colName.replace(colName.charAt(0)+"", new String(colName.charAt(0)+"").toUpperCase());
- //設置方法名
- String methodName="set"+colName;
- System.out.println(methodName);
- //獲取當前位置的值,返回Object類型
- Object value=rs.getObject(i);
- //利用反射獲取對象(反射概念很模糊?不太懂)
- Method method=obj.getClass().getMethod(methodName, value.getClass());
- method.invoke(obj, value); //感覺這段類似於obj.setMethodName(value)......對於靜態方法的反射可以寫成method.invoke(null,value),而不能把第一個參數省略,如果方法沒有參數的話,第二個參數可以爲空
- }
- lst.add(obj);
- }
- return lst;
- }
- catch(Exception ex)
- {
- ex.printStackTrace();
- return null;
- }
- }
- }
package com.service;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
import com.entity.Student;
public class Service {
public List toList(ResultSet rs,Class cls)
{
try
{
List lst=new ArrayList();
//用於獲取列數、或者列類型
ResultSetMetaData meta=rs.getMetaData();
Object obj=null;
while(rs.next())
{
//獲取formbean實例對象
obj=Class.forName(cls.getName()).newInstance(); //用Class.forName方法實例化對象和new創建實例化對象是有很大區別的,它要求JVM首先從類加載器中查找類,然後再實例化,並且能執行類中的靜態方法。而new僅僅是新建一個對象實例
//循環獲取指定行的每一列的信息
for(int i=1;i<=meta.getColumnCount();i++)
{
//當前列名
String colName=meta.getColumnName(i);
//將列名第一個字母大寫(爲什麼加+""ne ?是大寫字母比小寫字母多個字節?)
colName=colName.replace(colName.charAt(0)+"", new String(colName.charAt(0)+"").toUpperCase());
//設置方法名
String methodName="set"+colName;
System.out.println(methodName);
//獲取當前位置的值,返回Object類型
Object value=rs.getObject(i);
//利用反射獲取對象(反射概念很模糊?不太懂)
Method method=obj.getClass().getMethod(methodName, value.getClass());
method.invoke(obj, value); //感覺這段類似於obj.setMethodName(value)......對於靜態方法的反射可以寫成method.invoke(null,value),而不能把第一個參數省略,如果方法沒有參數的話,第二個參數可以爲空
}
lst.add(obj);
}
return lst;
}
catch(Exception ex)
{
ex.printStackTrace();
return null;
}
}
}
- 使用BeanUtils類簡化request和resultset轉換
- 2009年06月01日 20:02
- 當提交表單時,如果沒有使用Struts等框架的話,你的代碼可能是這樣
- User user=new User();
- user.setUsername(request.getParameter("username"));
- user.setPassword(request.getParameter("password"));
- user.setEmail(request.getParameter("email"));
- 如果表單項比較多,每次都要這樣寫是不是很煩?
- OK,使用commons-beanutils吧。你只需要這樣寫
- try {
- Map params=request.getParameterMap();
- BeanUtils.populate(user , params);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- 那麼處理ResultSet時,如果沒有Hibernate等框架,你的代碼可能是這樣
- if (rs.next()) {
- User user = new User();
- user.setId(rs.getLong("id"));
- user.setUsercode(rs.getString("usercode"));
- user.setSex(rs.getString("sex"));
- user.setPassword(rs.getString("password"));
- user.setPhone(rs.getString("phone"));
- user.setEmail(rs.getString("email"));
- users.add(user);
- }
- 是不是也有點煩?OK,這樣來寫吧
- ResultSetDynaClass rsdc = new ResultSetDynaClass(rs);
- Iterator rows = rsdc.iterator();
- ArrayList lists = new ArrayList();
- while (rows.hasNext()) {
- User user = new User();
- DynaBean row = (DynaBean) rows.next();
- BeanUtils.copyProperties(user, row);
- lists.add(user)
- }
- 如何,是否讓你的工作更加有效率了呢?