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

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

Java代码 复制代码 收藏代码
@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

Java代码 复制代码 收藏代码
  1. 其实反射也不是什么高深莫测的东西。反射就是我们对一个未知对象进行操作,由于它是未知的,所以我们需要从类型等方面下手,使用该对象共有的方法和属性,引用自该对象,从而得到我们想要的结果。
  2. 本文简单列举了一个利用反射将ResultSet的值自动赋值到POJO(JavaBean)对象的一个实例,便于大家学习。
  3. packagedemo;
  4. importjava.lang.reflect.Array;
  5. importjava.lang.reflect.Method;
  6. importjava.sql.ResultSetMetaData;
  7. importjava.sql.ResultSet;
  8. /**
  9. *绑定数据处理
  10. *Wrotebyredria
  11. */
  12. publicclassBindData{
  13. /**
  14. *从ResultSet绑定到JavaBean
  15. *
  16. *@paramResultSet
  17. *@paramDTO(JavaBean)
  18. *@returnDTO
  19. */
  20. publicstaticDTObindDataToDTO(ResultSetrs,DTOdto)throwsException{
  21. //取得Method方法
  22. Method[]methods=dto.getClass().getMethods();
  23. //取得ResultSet的列名
  24. ResultSetMetaDatarsmd=rs.getMetaData();
  25. intcolumnsCount=rsmd.getColumnCount();
  26. String[]columnNames=newString[columnsCount];
  27. for(inti=0;i<columnsCount;i++){
  28. columnNames[i]=rsmd.getColumnLabel(i+1);
  29. }
  30. //遍历ResultSet
  31. while(rs.next()){
  32. //反射,从ResultSet绑定到JavaBean
  33. for(inti=0;i<columnNames.length;i++){
  34. //取得Set方法
  35. StringsetMethodName="set"+columnNames[i];
  36. //遍历Method
  37. for(intj=0;j<methods.length;j++){
  38. if(methods[j].getName().equalsIgnoreCase(setMethodName)){
  39. setMethodName=methods[j].getName();
  40. Objectvalue=rs.getObject(columnNames[i]);
  41. //实行Set方法
  42. try{
  43. //JavaBean内部属性和ResultSet中一致时候
  44. MethodsetMethod=dto.getClass().getMethod(
  45. setMethodName,value.getClass());
  46. setMethod.invoke(dto,value);
  47. }catch(Exceptione){
  48. //JavaBean内部属性和ResultSet中不一致时候,使用String来输入值。
  49. MethodsetMethod=dto.getClass().getMethod(
  50. setMethodName,String.class);
  51. setMethod.invoke(dto,value.toString());
  52. }
  53. }
  54. }
  55. }
  56. }
  57. //戻り値
  58. returndto;
  59. }
  60. /**
  61. *从ResultSet绑定到JavaBean数组
  62. *
  63. *@paramResultSet
  64. *@paramDTO(JavaBean)
  65. *@returnDTO数组
  66. */
  67. publicstaticDTO[]bindDataToDTOS(ResultSetrs,DTOdto)throwsException{
  68. //取得Method
  69. Method[]methods=dto.getClass().getMethods();
  70. //取得ResultSet的列名
  71. ResultSetMetaDatarsmd=rs.getMetaData();
  72. intcolumnsCount=rsmd.getColumnCount();
  73. String[]columnNames=newString[columnsCount];
  74. for(inti=0;i<columnsCount;i++){
  75. columnNames[i]=rsmd.getColumnLabel(i+1);
  76. }
  77. //取得Class
  78. Class<?extendsDTO>dtoClass=dto.getClass();
  79. //取得record数
  80. rs.last();
  81. intrsCnt=rs.getRow();
  82. rs.beforeFirst();
  83. //DTO[]初期化
  84. DTO[]dtos=(DTO[])Array.newInstance(dtoClass,rsCnt);
  85. intdtoNow=0;
  86. //遍历ResultSet
  87. while(rs.next()){
  88. //DTO[]中DTO初期化
  89. dtos[dtoNow]=(DTO)dtoClass.newInstance();
  90. //反射,从ResultSet绑定到JavaBean
  91. for(inti=0;i<columnNames.length;i++){
  92. //取得Set方法
  93. StringsetMethodName="set"+columnNames[i];
  94. //遍历Method
  95. for(intj=0;j<methods.length;j++){
  96. if(methods[j].getName().equalsIgnoreCase(setMethodName)){
  97. setMethodName=methods[j].getName();
  98. Objectvalue=rs.getObject(columnNames[i]);
  99. //实行Set方法
  100. try{
  101. //JavaBean内部属性和ResultSet中一致时候
  102. MethodsetMethod=dto.getClass().getMethod(
  103. setMethodName,value.getClass());
  104. setMethod.invoke(dtos[dtoNow],value);
  105. }catch(Exceptione){
  106. //JavaBean内部属性和ResultSet中不一致时候,使用String来输入值。
  107. MethodsetMethod=dto.getClass().getMethod(
  108. setMethodName,String.class);
  109. setMethod.invoke(dtos[dtoNow],value.toString());
  110. }
  111. }
  112. }
  113. }
  114. dtoNow++;
  115. }
  116. //返回值
  117. returndtos;
  118. }
  119. }
  120. 当然这里的DTO是一个普通的JavaBean类。我们可以建立一个基类,然后建立我们要的JavaBean子类来继承于该基类,将子类扔进来反射,我们就可以得到一个绑定好数据的子类。诚然,我这里对数据类型判别的也不多,不是和ResultSet中一直的,统统变成了String,这里可以根据需要自行修改。
  121. 注意:这里如果要绑定,则必须JavaBean中的属性名称和ResultSet中的列名一致,反射也需要有一个参照对象不是么,不然绑定到哪里去呢?呵呵……
  122. 原理么,就是拿ResultSet中的列名和JavaBean中的属性名配对,然后赋值。
其实反射也不是什么高深莫测的东西。反射就是我们对一个未知对象进行操作,由于它是未知的,所以我们需要从类型等方面下手,使用该对象共有的方法和属性,引用自该对象,从而得到我们想要的结果。

 

本文简单列举了一个利用反射将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

Java代码 复制代码 收藏代码
  1. 一般做法是将ResultSet封装成一个个javabean然后将javabean放入list集合中返回。
  2. 类似于:
  3. publicclasstest{
  4. DBdbx=newDB();
  5. publicstaticListresultSetToList(Stringsql)throwsSQLException{
  6. DBdbx=newDB();
  7. ResultSetrs=dbx.executeQuery(sql);
  8. ResultSetMetaDatamd=rs.getMetaData();
  9. for(inti=0;i<md.getColumnCount();i++){
  10. System.out.println(md.getColumnName(i));
  11. System.out.println("-----------------");
  12. }
  13. Listlist=newArrayList();
  14. while(rs.next()){
  15. UserBeanbean=newUserBean();
  16. intuserid=rs.getInt("userid");
  17. Stringusername=rs.getString("username");
  18. bean.setUserid(userid+"");
  19. bean.setUsername(username);
  20. list.add(bean);
  21. System.out.println(userid+""+username);
  22. }
  23. returnlist;
  24. }
  25. }
一般做法是将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; 
} 
}

另外一种方法

Java代码 复制代码 收藏代码
  1. packagecom.service;
  2. importjava.lang.reflect.Method;
  3. importjava.sql.ResultSet;
  4. importjava.sql.ResultSetMetaData;
  5. importjava.util.ArrayList;
  6. importjava.util.List;
  7. importcom.entity.Student;
  8. publicclassService{
  9. publicListtoList(ResultSetrs,Classcls)
  10. {
  11. try
  12. {
  13. Listlst=newArrayList();
  14. //用于获取列数、或者列类型
  15. ResultSetMetaDatameta=rs.getMetaData();
  16. Objectobj=null;
  17. while(rs.next())
  18. {
  19. //获取formbean实例对象
  20. obj=Class.forName(cls.getName()).newInstance();//用Class.forName方法实例化对象和new创建实例化对象是有很大区别的,它要求JVM首先从类加载器中查找类,然后再实例化,并且能执行类中的静态方法。而new仅仅是新建一个对象实例
  21. //循环获取指定行的每一列的信息
  22. for(inti=1;i<=meta.getColumnCount();i++)
  23. {
  24. //当前列名
  25. StringcolName=meta.getColumnName(i);
  26. //将列名第一个字母大写(为什么加+""ne?是大写字母比小写字母多个字节?)
  27. colName=colName.replace(colName.charAt(0)+"",newString(colName.charAt(0)+"").toUpperCase());
  28. //设置方法名
  29. StringmethodName="set"+colName;
  30. System.out.println(methodName);
  31. //获取当前位置的值,返回Object类型
  32. Objectvalue=rs.getObject(i);
  33. //利用反射获取对象(反射概念很模糊?不太懂)
  34. Methodmethod=obj.getClass().getMethod(methodName,value.getClass());
  35. method.invoke(obj,value);//感觉这段类似于obj.setMethodName(value)......对于静态方法的反射可以写成method.invoke(null,value),而不能把第一个参数省略,如果方法没有参数的话,第二个参数可以为空
  36. }
  37. lst.add(obj);
  38. }
  39. returnlst;
  40. }
  41. catch(Exceptionex)
  42. {
  43. ex.printStackTrace();
  44. returnnull;
  45. }
  46. }
  47. }
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;
        }
        
    }
}

Java代码 复制代码 收藏代码
  1. 使用BeanUtils类简化request和resultset转换
  2. 2009060120:02
  3. 当提交表单时,如果没有使用Struts等框架的话,你的代码可能是这样
  4. Useruser=newUser();
  5. user.setUsername(request.getParameter("username"));
  6. user.setPassword(request.getParameter("password"));
  7. user.setEmail(request.getParameter("email"));
  8. 如果表单项比较多,每次都要这样写是不是很烦?
  9. OK,使用commons-beanutils吧。你只需要这样写
  10. try{
  11. Mapparams=request.getParameterMap();
  12. BeanUtils.populate(user,params);
  13. }catch(Exceptione){
  14. //TODOAuto-generatedcatchblock
  15. e.printStackTrace();
  16. }
  17. 那么处理ResultSet时,如果没有Hibernate等框架,你的代码可能是这样
  18. if(rs.next()){
  19. Useruser=newUser();
  20. user.setId(rs.getLong("id"));
  21. user.setUsercode(rs.getString("usercode"));
  22. user.setSex(rs.getString("sex"));
  23. user.setPassword(rs.getString("password"));
  24. user.setPhone(rs.getString("phone"));
  25. user.setEmail(rs.getString("email"));
  26. users.add(user);
  27. }
  28. 是不是也有点烦?OK,这样来写吧
  29. ResultSetDynaClassrsdc=newResultSetDynaClass(rs);
  30. Iteratorrows=rsdc.iterator();
  31. ArrayListlists=newArrayList();
  32. while(rows.hasNext()){
  33. Useruser=newUser();
  34. DynaBeanrow=(DynaBean)rows.next();
  35. BeanUtils.copyProperties(user,row);
  36. lists.add(user)
  37. }
  38. 如何,是否让你的工作更加有效率了呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值