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); } }