利用反射機制,將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.   
  3.     
  4.   
  5. 本文簡單列舉了一個利用反射將ResultSet的值自動賦值到POJO(JavaBean)對象的一個實例,便於大家學習。   
  6.   
  7.     
  8.   
  9. package demo;    
  10.   
  11. import java.lang.reflect.Array;    
  12. import java.lang.reflect.Method;    
  13. import java.sql.ResultSetMetaData;    
  14. import java.sql.ResultSet;    
  15.   
  16. /**   
  17.  * 綁定數據處理   
  18.  * Wrote by redria   
  19.  */    
  20. public class BindData {    
  21.     /**   
  22.      * 從ResultSet綁定到JavaBean   
  23.      *    
  24.      * @param ResultSet   
  25.      * @param DTO(JavaBean)   
  26.      * @return DTO   
  27.      */    
  28.     public static DTO bindDataToDTO(ResultSet rs, DTO dto) throws Exception {    
  29.   
  30.         //取得Method方法    
  31.         Method[] methods = dto.getClass().getMethods();    
  32.   
  33.         //取得ResultSet的列名    
  34.         ResultSetMetaData rsmd = rs.getMetaData();    
  35.         int columnsCount = rsmd.getColumnCount();    
  36.         String[] columnNames = new String[columnsCount];    
  37.         for (int i = 0; i < columnsCount; i++) {    
  38.             columnNames[i] = rsmd.getColumnLabel(i + 1);    
  39.         }    
  40.   
  41.         //遍歷ResultSet    
  42.         while (rs.next()) {    
  43.             //反射, 從ResultSet綁定到JavaBean    
  44.             for (int i = 0; i < columnNames.length; i++) {    
  45.                 //取得Set方法    
  46.                 String setMethodName = "set" + columnNames[i];    
  47.                 //遍歷Method    
  48.                 for (int j = 0; j < methods.length; j++) {    
  49.                     if (methods[j].getName().equalsIgnoreCase(setMethodName)) {    
  50.                         setMethodName = methods[j].getName();    
  51.                         Object value = rs.getObject(columnNames[i]);    
  52.   
  53.                         //實行Set方法    
  54.                         try {    
  55.                             //JavaBean內部屬性和ResultSet中一致時候   
  56.                             Method setMethod = dto.getClass().getMethod(    
  57.                                     setMethodName, value.getClass());    
  58.                             setMethod.invoke(dto, value);    
  59.                         } catch (Exception e) {    
  60.                             //JavaBean內部屬性和ResultSet中不一致時候,使用String來輸入值。   
  61.                             Method setMethod = dto.getClass().getMethod(    
  62.                                     setMethodName, String.class);    
  63.                             setMethod.invoke(dto, value.toString());    
  64.                         }    
  65.                     }    
  66.                 }    
  67.             }    
  68.         }    
  69.   
  70.         //戻り値    
  71.         return dto;    
  72.     }    
  73.   
  74.     /**   
  75.      *從ResultSet綁定到JavaBean數組   
  76.      *    
  77.      * @param ResultSet   
  78.      * @param DTO(JavaBean)   
  79.      * @return DTO數組   
  80.      */    
  81.     public static DTO[] bindDataToDTOS(ResultSet rs, DTO dto) throws Exception {    
  82.   
  83.         //取得Method    
  84.         Method[] methods = dto.getClass().getMethods();    
  85.   
  86.         //取得ResultSet的列名     
  87.         ResultSetMetaData rsmd = rs.getMetaData();    
  88.         int columnsCount = rsmd.getColumnCount();    
  89.         String[] columnNames = new String[columnsCount];    
  90.         for (int i = 0; i < columnsCount; i++) {    
  91.             columnNames[i] = rsmd.getColumnLabel(i + 1);    
  92.         }    
  93.   
  94.         //取得Class    
  95.         Class<? extends DTO> dtoClass = dto.getClass();    
  96.   
  97.         //取得record數    
  98.         rs.last();    
  99.         int rsCnt = rs.getRow();    
  100.         rs.beforeFirst();    
  101.   
  102.         //DTO[]初期化    
  103.         DTO[] dtos = (DTO[]) Array.newInstance(dtoClass, rsCnt);    
  104.   
  105.         int dtoNow = 0;    
  106.         //遍歷ResultSet    
  107.         while (rs.next()) {    
  108.             //DTO[]中DTO初期化    
  109.             dtos[dtoNow] = (DTO) dtoClass.newInstance();    
  110.             //反射, 從ResultSet綁定到JavaBean    
  111.             for (int i = 0; i < columnNames.length; i++) {    
  112.                 //取得Set方法    
  113.                 String setMethodName = "set" + columnNames[i];    
  114.                 //遍歷Method     
  115.                 for (int j = 0; j < methods.length; j++) {    
  116.                     if (methods[j].getName().equalsIgnoreCase(setMethodName)) {    
  117.                         setMethodName = methods[j].getName();    
  118.                         Object value = rs.getObject(columnNames[i]);    
  119.   
  120.                         //實行Set方法    
  121.                         try {    
  122.                             //JavaBean內部屬性和ResultSet中一致時候   
  123.                             Method setMethod = dto.getClass().getMethod(    
  124.                                     setMethodName, value.getClass());    
  125.                             setMethod.invoke(dtos[dtoNow], value);    
  126.                         } catch (Exception e) {    
  127.                             //JavaBean內部屬性和ResultSet中不一致時候,使用String來輸入值。   
  128.                             Method setMethod = dto.getClass().getMethod(    
  129.                                     setMethodName, String.class);    
  130.                             setMethod.invoke(dtos[dtoNow], value.toString());    
  131.                         }    
  132.                     }    
  133.                 }    
  134.             }    
  135.             dtoNow++;    
  136.         }    
  137.   
  138.         //返回值    
  139.         return dtos;    
  140.     }    
  141. }   
  142. 當然這裏的DTO是一個普通的JavaBean類。我們可以建立一個基類,然後建立我們要的JavaBean子類來繼承於該基類,將子類扔進來反射,我們就可以得到一個綁定好數據的子類。誠然,我這裏對數據類型判別的也不多,不是和ResultSet中一直的,統統變成了String,這裏可以根據需要自行修改。   
  143.   
  144.     
  145.   
  146. 注意:這裏如果要綁定,則必須JavaBean中的屬性名稱和ResultSet中的列名一致,反射也需要有一個參照對象不是麼,不然綁定到哪裏去呢?呵呵……   
  147.   
  148.     
  149.   
  150. 原理麼,就是拿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. 類似於:    
  4. public   class   test   {    
  5.   
  6. DB   dbx   =   new   DB();    
  7.   
  8. public   static   List   resultSetToList(String   sql)   throws   SQLException   {    
  9. DB   dbx   =   new   DB();    
  10. ResultSet   rs   =   dbx.executeQuery(sql);    
  11. ResultSetMetaData   md   =   rs.getMetaData();    
  12. for   (int   i   =   0;   i   <   md.getColumnCount();   i++)   {    
  13. System.out.println(md.getColumnName(i));    
  14. System.out.println( "----------------- ");    
  15. }    
  16. List   list   =   new   ArrayList();    
  17. while   (rs.next())   {    
  18. UserBean   bean   =   new   UserBean();    
  19. int   userid   =   rs.getInt( "userid ");    
  20. String   username   =   rs.getString( "username ");    
  21. bean.setUserid(userid   +   " ");    
  22. bean.setUsername(username);    
  23. list.add(bean);    
  24. System.out.println(userid   +   "   "+username);    
  25. }    
  26. return   list;    
  27. }    
  28. }  
一般做法是將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. package com.service;   
  2.   
  3. import java.lang.reflect.Method;   
  4. import java.sql.ResultSet;   
  5. import java.sql.ResultSetMetaData;   
  6. import java.util.ArrayList;   
  7. import java.util.List;   
  8.   
  9. import com.entity.Student;   
  10.   
  11. public class Service {   
  12.     public List toList(ResultSet rs,Class cls)   
  13.     {   
  14.         try  
  15.         {   
  16.                
  17.             List lst=new ArrayList();   
  18.             //用於獲取列數、或者列類型   
  19.             ResultSetMetaData meta=rs.getMetaData();   
  20.             Object obj=null;   
  21.             while(rs.next())   
  22.             {   
  23.                 //獲取formbean實例對象   
  24.                 obj=Class.forName(cls.getName()).newInstance();              //用Class.forName方法實例化對象和new創建實例化對象是有很大區別的,它要求JVM首先從類加載器中查找類,然後再實例化,並且能執行類中的靜態方法。而new僅僅是新建一個對象實例  
  25.                 //循環獲取指定行的每一列的信息   
  26.                 for(int i=1;i<=meta.getColumnCount();i++)   
  27.                 {   
  28.                     //當前列名   
  29.                     String colName=meta.getColumnName(i);   
  30.                     //將列名第一個字母大寫(爲什麼加+""ne ?是大寫字母比小寫字母多個字節?)  
  31.                     colName=colName.replace(colName.charAt(0)+""new String(colName.charAt(0)+"").toUpperCase());   
  32.                     //設置方法名   
  33.                     String methodName="set"+colName;   
  34.                     System.out.println(methodName);   
  35.                     //獲取當前位置的值,返回Object類型   
  36.                     Object value=rs.getObject(i);   
  37.                     //利用反射獲取對象(反射概念很模糊?不太懂)  
  38.                     Method method=obj.getClass().getMethod(methodName, value.getClass());   
  39.                     method.invoke(obj, value);                 //感覺這段類似於obj.setMethodName(value)......對於靜態方法的反射可以寫成method.invoke(null,value),而不能把第一個參數省略,如果方法沒有參數的話,第二個參數可以爲空  
  40.                 }   
  41.                 lst.add(obj);   
  42.             }   
  43.                
  44.             return lst;   
  45.         }   
  46.         catch(Exception ex)   
  47.         {   
  48.             ex.printStackTrace();   
  49.             return null;   
  50.         }   
  51.            
  52.     }   
  53. }  
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. 20090601日 20:02  
  3. 當提交表單時,如果沒有使用Struts等框架的話,你的代碼可能是這樣   
  4.   
  5.    User user=new User();   
  6.    user.setUsername(request.getParameter("username"));   
  7.    user.setPassword(request.getParameter("password"));   
  8.    user.setEmail(request.getParameter("email"));   
  9.   
  10. 如果表單項比較多,每次都要這樣寫是不是很煩?   
  11.   
  12. OK,使用commons-beanutils吧。你只需要這樣寫   
  13.   
  14. try {   
  15.     Map params=request.getParameterMap();   
  16.     BeanUtils.populate(user , params);   
  17.    } catch (Exception e) {   
  18.     // TODO Auto-generated catch block   
  19.     e.printStackTrace();   
  20.    }    
  21. 那麼處理ResultSet時,如果沒有Hibernate等框架,你的代碼可能是這樣   
  22.   
  23. if (rs.next()) {   
  24.     User user = new User();   
  25.     user.setId(rs.getLong("id"));   
  26.     user.setUsercode(rs.getString("usercode"));   
  27.     user.setSex(rs.getString("sex"));   
  28.     user.setPassword(rs.getString("password"));   
  29.     user.setPhone(rs.getString("phone"));   
  30.     user.setEmail(rs.getString("email"));   
  31.    users.add(user);   
  32. }   
  33.   
  34. 是不是也有點煩?OK,這樣來寫吧   
  35.   
  36. ResultSetDynaClass rsdc = new ResultSetDynaClass(rs);   
  37. Iterator rows = rsdc.iterator();   
  38. ArrayList lists = new ArrayList();   
  39. while (rows.hasNext()) {   
  40.      User user = new User();   
  41.      DynaBean row = (DynaBean) rows.next();   
  42.      BeanUtils.copyProperties(user, row);   
  43.      lists.add(user)   
  44. }   
  45.   
  46. 如何,是否讓你的工作更加有效率了呢?  

 

發佈了48 篇原創文章 · 獲贊 34 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章