java反射機制解決資料庫查詢結果到Model類

aNoobCoder發表於2017-02-04
package com.Android.util;

import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;



public class GetData {

    public static List resultSetToList(ResultSet rs, Class<?> cls)
            throws Exception {

        // 取得Method
        Method[] methods = cls.getMethods();// 獲得bean的所有方法

        List list = new ArrayList();
        // 用於獲取列數、或者列型別
        ResultSetMetaData meta = rs.getMetaData();
        Object obj = null;
        while (rs.next()) {
            // 獲取formbean例項物件
            obj = cls.newInstance(); // 用Class.forName方法例項化物件和new建立例項化物件是有很大區別的,它要求JVM首先從類載入器中查詢類,然後再例項化,並且能執行類中的靜態方法。而new僅僅是新建一個物件例項
            // 迴圈獲取指定行的每一列的資訊

            for (int i = 1; i <= meta.getColumnCount(); i++) {
                // 當前列名
                String colName = meta.getColumnName(i);
                // 設定方法名
                String setMethodName = "set" + colName;

                // 遍歷Method
                Method setMethod = null;
                for (int j = 0; j < methods.length; j++) {
                    if (methods[j].getName().equalsIgnoreCase(setMethodName)) { // 比較列名
                        setMethodName = methods[j].getName();
                        setMethod = methods[j];
                        // 獲取當前位置的值,返回Object型別
                        Object value = rs.getObject(colName);
                        if (value == null) {
                            continue;
                        }

                        // 實行Set方法
                        try {
                            // // 利用反射獲取物件
                            // JavaBean內部屬性和ResultSet中一致時候
                            setMethod.invoke(obj, value);
                            break;

                        } catch (Exception e) {
                            // JavaBean內部屬性和ResultSet中不一致時候,使用String來輸入值。
                            e.printStackTrace();
                            setMethod.invoke(obj, value.toString());
                        }
                    }
                }
            }

            list.add(obj);
        }

        return list;

    }

    public static Object resultSetToBean(ResultSet rs, Class cls)
            throws Exception {

        // 取得Method
        Method[] methods = cls.getMethods();// 獲得bean的所有方法

        // 用於獲取列數、或者列型別
        ResultSetMetaData meta = rs.getMetaData();
        Object obj = null;
        if (rs.next()) {
            // 獲取formbean例項物件
            obj = cls.newInstance(); // 用Class.forName方法例項化物件和new建立例項化物件是有很大區別的,它要求JVM首先從類載入器中查詢類,然後再例項化,並且能執行類中的靜態方法。而new僅僅是新建一個物件例項
            // 迴圈獲取指定行的每一列的資訊

            for (int i = 1; i <= meta.getColumnCount(); i++) {
                // 當前列名
                String colName = meta.getColumnName(i);
                // 設定方法名
                String setMethodName = "set" + colName;

                // 遍歷Method
                Method setMethod = null;
                for (int j = 0; j < methods.length; j++) {
                    if (methods[j].getName().equalsIgnoreCase(setMethodName)) { // 比較列名
                        setMethodName = methods[j].getName();
                        setMethod = methods[j];
                        // 獲取當前位置的值,返回Object型別
                        Object value = rs.getObject(colName);
                        if (value == null) {
                            continue;
                        }

                        // 實行Set方法
                        try {
                            // // 利用反射獲取物件
                            // JavaBean內部屬性和ResultSet中一致時候
                            setMethod.invoke(obj, value);
                            break;

                        } catch (Exception e) {
                            // JavaBean內部屬性和ResultSet中不一致時候,使用String來輸入值。
                            e.printStackTrace();
                            setMethod.invoke(obj, value.toString());
                        }
                    }
                }
            }

        }

        return obj;

    }
}

相關文章