package org.pandas.webIdp.webOP.help;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
public class ResBeanUntil<T> {
/**
*
* @param clazz 所要封裝的javaBean
* @param rs 記錄集
* @return ArrayList 數組里邊裝有 多個javaBean
* @throws Exception
* @說明:利用反射機制從ResultSet自動綁定到JavaBean;根據記錄集自動調用javaBean里邊的對應方法。如果javaBean與數據庫字段類型不匹配,按String類型封裝
*/
public List<T> getList(Class<T> clazz, ResultSet rs) {
Field field = null;
List<T> lists = new ArrayList<T>();
// 取得類里邊的所有方法
try {
// 取得ResultSet列名
ResultSetMetaData rsmd = rs.getMetaData();
// 獲取記錄集中的列數
int counts = rsmd.getColumnCount();
// 定義counts個String 變量
String[] columnNames = new String[counts];
// 給每個變量賦值
for (int i = 0; i < counts; i++) {
columnNames[i] = rsmd.getColumnLabel(i + 1);
}
// 變量ResultSet
while (rs.next()) {
T t = clazz.newInstance();
// 反射, 從ResultSet綁定到JavaBean
e:for (int i = 0; i < counts; i++) {
// 根據 rs 列名 ,組裝javaBean里邊的其中一個set方法,object 就是數據庫第一行第一列的數據了
Object value =null; Class<?> dbType =null;
//try的意義是在於 獲取對象為空時
try {
value=rs.getObject(columnNames[i]);
//這里是獲取數據庫字段的類型 判斷 value是否為空 null的話跳過
dbType =value.getClass();
} catch (Exception e) {
continue e;
}
//設置參數類型,此類型應該跟javaBean 里邊的類型一樣,而不是取數據庫里邊的類型
field = clazz.getDeclaredField(columnNames[i]);
Class<?> beanType = field.getType();
//如果發生從數據庫獲取到得類型跟javaBean類型不同,按String類型取吧
if(beanType!=dbType){
value = rs.getString(columnNames[i]);
}
String setMethodName = "set" + firstUpperCase(columnNames[i]);
// 第一個參數是傳進去的方法名稱,第二個參數是 傳進去的類型;
Method m = t.getClass().getMethod(setMethodName,beanType);
// 第二個參數是傳給set方法數據;如果是get方法可以不寫
m.invoke(t, value);
}
lists.add(t);
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return lists;
}
//首寫字母變大寫
public static String firstUpperCase(String old){
return old.substring(0, 1).toUpperCase()+old.substring(1);
} }