使用java反射將數據庫結果集轉換成對象結果集

package com.jelly.reflect;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;

import com.jelly.beans.User;
import com.jelly.utils.JDBCUtil;


public class JavaBeanReflect implements Serializable{
	//
	private static final long serialVersionUID = 1L;
	//
	private Connection conn = null;
	private PreparedStatement pstmt = null;
	private ResultSet rs = null;
	
	
	
	/**
	 * 根據名字獲取對應的set方法
	 * @param name
	 * @return
	 */
	private String getMethodName(String fieldName){
		if(fieldName == null || "".equals(fieldName.trim())){
			return null;
		}
		String n = fieldName.substring(0, 1);
		return "set"+fieldName.replaceFirst(n,n.toUpperCase());
	}
	
	/**
	 * 根據名字獲取方法類型
	 * @param clazz
	 * @param fieldName
	 * @return
	 */
	@SuppressWarnings("finally")
	private Class<?> getFieldType(Class<?> clazz,String fieldName){
		Class<?> c = null;
		try {
			Field field = clazz.getDeclaredField(fieldName);
			c = field.getType();
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			return c;
		}
	}
	/**
	 * 將數據轉換成對象
	 * @param 
	 * @param clazz
	 * @param rs
	 * @return
	 * @throws Exception
	 */
	private  T getT(Class clazz,ResultSet rs) throws Exception{
		ResultSetMetaData rsmd = rs.getMetaData();
		Integer count = rsmd.getColumnCount();
		T t= clazz.newInstance();
		for(int i=1; i<=count; i++){
			//獲得列名
			String columnName = rsmd.getColumnName(i);
			//獲取方法名
			String setMethodName = getMethodName(columnName);
			//獲得方法類型
			Class<?> fieldType = getFieldType(clazz, columnName);
			//
			Method method  = clazz.getMethod(setMethodName, fieldType);//
			//調用方法 因爲set方法一般就一個參數。所以這兒沒有判斷參數個數
			method.invoke(t, rs.getObject(columnName));
		}
		count = null;
		return t;
	}
	
	
	/**
	 * 查詢所有數據
	 * @param 
	 * @param clazz
	 * @return
	 */
	public  List select(Class clazz){
		List list = new ArrayList();
		try {
			conn = JDBCUtil.getConnection();
			pstmt = conn.prepareStatement("select * from user");
			rs = pstmt.executeQuery();
			while(rs.next()){
				list.add(getT(clazz,rs));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			JDBCUtil.closeConnection(rs, pstmt, conn);
		}
		return list;
	}
	
	
	
	
	public static void main(String [] args) throws Exception{
		JavaBeanReflect tr = new JavaBeanReflect();
		List list = tr.select(User.class);
		for(User user : list){
			System.out.println(user.toString());
		}
	}
	
	
}


以前沒弄過,不知道有沒有更好更簡單的辦法,如果有請告訴我一下。謝謝!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章