(摘抄)利用反射机制,将ResultSet处理为bean或list的方法

我自己的处理:写一个util类,然后封装方法

@SuppressWarnings("unchecked")
	public static List resultSetToList(ResultSet rs, Class cls)throws Exception {
	

			//取得Method 
	        Method[] methods = cls.getDeclaredMethods(); 
	       System.out.println(methods[0].getName());
			List lst = 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 
	                for (int j = 0; j < methods.length; j++) { 
	                    if (methods[j].getName().equalsIgnoreCase(setMethodName)) { 
	                        setMethodName = methods[j].getName(); 
	                        
	                        System.out.println(setMethodName);
	                    	// 获取当前位置的值,返回Object类型
	                        Object value = rs.getObject(colName); 
	                        if(value == null){
	                        	continue;
	                        }

	                        //实行Set方法 
	                        try { 
	                        	 利用反射获取对象
	                            //JavaBean内部属性和ResultSet中一致时候 
	                            Method setMethod = obj.getClass().getMethod( 
	                                    setMethodName, value.getClass()); 
	                            setMethod.invoke(obj, value); 
	                        } catch (Exception e) { 
	                            //JavaBean内部属性和ResultSet中不一致时候,使用String来输入值。 
	                           e.printStackTrace();
	                        } 
	                    } 
	                } 
				}
				lst.add(obj);
			}

			return lst;
		
	}
 

 

相关参考:

 

 

原文地址  http://blog.csdn.net/redria/article/details/2988158

其实反射也不是什么高深莫测的东西。反射就是我们对一个未知对象进行操作,由于它是未知的,所以我们需要从类型等方面下手,使用该对象共有的方法和属性,引用自该对象,从而得到我们想要的结果。

 

本文简单列举了一个利用反射将ResultSet的值自动赋值到POJO(JavaBean)对象的一个实例,便于大家学习。

 

package demo; 

import java.lang.reflect.Array; 
import java.lang.reflect.Method; 
import java.sql.ResultSetMetaData; 
import java.sql.ResultSet; 

/** 
 * 绑定数据处理 
 * Wrote by redria 
 */ 
public class BindData { 
    /** 
     * 从ResultSet绑定到JavaBean 
     *  
     * @param ResultSet 
     * @param DTO(JavaBean) 
     * @return DTO 
     */ 
    public static DTO bindDataToDTO(ResultSet rs, DTO dto) throws Exception { 

        //取得Method方法 
        Method[] methods = dto.getClass().getMethods(); 

        //取得ResultSet的列名 
        ResultSetMetaData rsmd = rs.getMetaData(); 
        int columnsCount = rsmd.getColumnCount(); 
        String[] columnNames = new String[columnsCount]; 
        for (int i = 0; i < columnsCount; i++) { 
            columnNames[i] = rsmd.getColumnLabel(i + 1); 
        } 

        //遍历ResultSet 
        while (rs.next()) { 
            //反射, 从ResultSet绑定到JavaBean 
            for (int i = 0; i < columnNames.length; i++) { 
                //取得Set方法 
                String setMethodName = "set" + columnNames[i]; 
                //遍历Method 
                for (int j = 0; j < methods.length; j++) { 
                    if (methods[j].getName().equalsIgnoreCase(setMethodName)) { 
                        setMethodName = methods[j].getName(); 
                        Object value = rs.getObject(columnNames[i]); 

                        //实行Set方法 
                        try { 
                            //JavaBean内部属性和ResultSet中一致时候 
                            Method setMethod = dto.getClass().getMethod( 
                                    setMethodName, value.getClass()); 
                            setMethod.invoke(dto, value); 
                        } catch (Exception e) { 
                            //JavaBean内部属性和ResultSet中不一致时候,使用String来输入值。 
                            Method setMethod = dto.getClass().getMethod( 
                                    setMethodName, String.class); 
                            setMethod.invoke(dto, value.toString()); 
                        } 
                    } 
                } 
            } 
        } 

        //戻り値 
        return dto; 
    } 

    /** 
     *从ResultSet绑定到JavaBean数组 
     *  
     * @param ResultSet 
     * @param DTO(JavaBean) 
     * @return DTO数组 
     */ 
    public static DTO[] bindDataToDTOS(ResultSet rs, DTO dto) throws Exception { 

        //取得Method 
        Method[] methods = dto.getClass().getMethods(); 

        //取得ResultSet的列名  
        ResultSetMetaData rsmd = rs.getMetaData(); 
        int columnsCount = rsmd.getColumnCount(); 
        String[] columnNames = new String[columnsCount]; 
        for (int i = 0; i < columnsCount; i++) { 
            columnNames[i] = rsmd.getColumnLabel(i + 1); 
        } 

        //取得Class 
        Class<? extends DTO> dtoClass = dto.getClass(); 

        //取得record数 
        rs.last(); 
        int rsCnt = rs.getRow(); 
        rs.beforeFirst(); 

        //DTO[]初期化 
        DTO[] dtos = (DTO[]) Array.newInstance(dtoClass, rsCnt); 

        int dtoNow = 0; 
        //遍历ResultSet 
        while (rs.next()) { 
            //DTO[]中DTO初期化 
            dtos[dtoNow] = (DTO) dtoClass.newInstance(); 
            //反射, 从ResultSet绑定到JavaBean 
            for (int i = 0; i < columnNames.length; i++) { 
                //取得Set方法 
                String setMethodName = "set" + columnNames[i]; 
                //遍历Method  
                for (int j = 0; j < methods.length; j++) { 
                    if (methods[j].getName().equalsIgnoreCase(setMethodName)) { 
                        setMethodName = methods[j].getName(); 
                        Object value = rs.getObject(columnNames[i]); 

                        //实行Set方法 
                        try { 
                            //JavaBean内部属性和ResultSet中一致时候 
                            Method setMethod = dto.getClass().getMethod( 
                                    setMethodName, value.getClass()); 
                            setMethod.invoke(dtos[dtoNow], value); 
                        } catch (Exception e) { 
                            //JavaBean内部属性和ResultSet中不一致时候,使用String来输入值。 
                            Method setMethod = dto.getClass().getMethod( 
                                    setMethodName, String.class); 
                            setMethod.invoke(dtos[dtoNow], value.toString()); 
                        } 
                    } 
                } 
            } 
            dtoNow++; 
        } 

        //返回值 
        return dtos; 
    } 
}
当然这里的DTO是一个普通的JavaBean类。我们可以建立一个基类,然后建立我们要的JavaBean子类来继承于该基类,将子类扔进来反射,我们就可以得到一个绑定好数据的子类。诚然,我这里对数据类型判别的也不多,不是和ResultSet中一直的,统统变成了String,这里可以根据需要自行修改。

 

注意:这里如果要绑定,则必须JavaBean中的属性名称和ResultSet中的列名一致,反射也需要有一个参照对象不是么,不然绑定到哪里去呢?呵呵……

 

原理么,就是拿ResultSet中的列名和JavaBean中的属性名配对,然后赋值。
 

 

 

 

http://www.blogjava.net/wanghl259748/articles/277261.html

 

一般做法是将ResultSet封装成一个个javabean然后将javabean放入list集合中返回。 

类似于: 
public   class   test   { 

DB   dbx   =   new   DB(); 

public   static   List   resultSetToList(String   sql)   throws   SQLException   { 
DB   dbx   =   new   DB(); 
ResultSet   rs   =   dbx.executeQuery(sql); 
ResultSetMetaData   md   =   rs.getMetaData(); 
for   (int   i   =   0;   i   <   md.getColumnCount();   i++)   { 
System.out.println(md.getColumnName(i)); 
System.out.println( "----------------- "); 
} 
List   list   =   new   ArrayList(); 
while   (rs.next())   { 
UserBean   bean   =   new   UserBean(); 
int   userid   =   rs.getInt( "userid "); 
String   username   =   rs.getString( "username "); 
bean.setUserid(userid   +   " "); 
bean.setUsername(username); 
list.add(bean); 
System.out.println(userid   +   "   "+username); 
} 
return   list; 
} 
}

 另外一种方法

package com.service;

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

import com.entity.Student;

public class Service {
    public List toList(ResultSet rs,Class cls)
    {
        try
        {
            
            List lst=new ArrayList();
            //用于获取列数、或者列类型
            ResultSetMetaData meta=rs.getMetaData();
            Object obj=null;
            while(rs.next())
            {
                //获取formbean实例对象
                obj=Class.forName(cls.getName()).newInstance();              //用Class.forName方法实例化对象和new创建实例化对象是有很大区别的,它要求JVM首先从类加载器中查找类,然后再实例化,并且能执行类中的静态方法。而new仅仅是新建一个对象实例
                //循环获取指定行的每一列的信息
                for(int i=1;i<=meta.getColumnCount();i++)
                {
                    //当前列名
                    String colName=meta.getColumnName(i);
                    //将列名第一个字母大写(为什么加+""ne ?是大写字母比小写字母多个字节?)
                    colName=colName.replace(colName.charAt(0)+"", new String(colName.charAt(0)+"").toUpperCase());
                    //设置方法名
                    String methodName="set"+colName;
                    System.out.println(methodName);
                    //获取当前位置的值,返回Object类型
                    Object value=rs.getObject(i);
                    //利用反射获取对象(反射概念很模糊?不太懂)
                    Method method=obj.getClass().getMethod(methodName, value.getClass());
                    method.invoke(obj, value);                 //感觉这段类似于obj.setMethodName(value)......对于静态方法的反射可以写成method.invoke(null,value),而不能把第一个参数省略,如果方法没有参数的话,第二个参数可以为空
                }
                lst.add(obj);
            }
            
            return lst;
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
            return null;
        }
        
    }
}
 

使用BeanUtils类简化request和resultset转换 
2009年06月01日 20:02
当提交表单时,如果没有使用Struts等框架的话,你的代码可能是这样

   User user=new User();
   user.setUsername(request.getParameter("username"));
   user.setPassword(request.getParameter("password"));
   user.setEmail(request.getParameter("email"));

如果表单项比较多,每次都要这样写是不是很烦?

OK,使用commons-beanutils吧。你只需要这样写

try {
    Map params=request.getParameterMap();
    BeanUtils.populate(user , params);
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } 
那么处理ResultSet时,如果没有Hibernate等框架,你的代码可能是这样

if (rs.next()) {
    User user = new User();
    user.setId(rs.getLong("id"));
    user.setUsercode(rs.getString("usercode"));
    user.setSex(rs.getString("sex"));
    user.setPassword(rs.getString("password"));
    user.setPhone(rs.getString("phone"));
    user.setEmail(rs.getString("email"));
   users.add(user);
}

是不是也有点烦?OK,这样来写吧

ResultSetDynaClass rsdc = new ResultSetDynaClass(rs);
Iterator rows = rsdc.iterator();
ArrayList lists = new ArrayList();
while (rows.hasNext()) {
     User user = new User();
     DynaBean row = (DynaBean) rows.next();
     BeanUtils.copyProperties(user, row);
     lists.add(user)
}

如何,是否让你的工作更加有效率了呢?

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值