Resultset轉Bean工具類
阿新 • • 發佈:2018-11-16
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); } }