1. 程式人生 > >Resultset轉Bean工具類

Resultset轉Bean工具類

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