java反射机制解决数据库查询结果到Model类

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;

    }
}

你可能感兴趣的:(java反射机制解决数据库查询结果到Model类)