论坛首页 Java企业应用论坛

Java泛型初体验之-一个通用的将表中记录生成对应javabean的集合类

浏览 3908 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-21  
OO

前段时间写一个RSS聚合系统,需要大量用到从数据库中将表中符合条件的记录取出来生成相应的javabean的集合,于是结合泛型和反射机制写了一个较通用的封装类。源代码如下:

java 代码
  1. /**  
  2.  * 根据传入的javabean对象和ResultSet产生一个具体javaBean的Collection  
  3.  */  
  4.   
  5. import java.util.*;   
  6. import java.sql.*;   
  7. import java.lang.reflect.*;   
  8.   
  9. public class BeanCollectionBuilder{   
  10.        
  11.     private BeanCollectionBuilder(){}   
  12.        
  13.     /**  
  14.      * 得到一个jvaBean的Colleciton  
  15.      * @param bean 要生成的javaBean  
  16.      * @param rs 记录集  
  17.      * @return 一个具体javaBean的Collection  
  18.      */  
  19.     public static <T> Collection<T> getBeanCollection(T object,ResultSet rs){   
  20.         Collection<T> collection = null;   
  21.         Class bean = object.getClass();   
  22.         Method[] methods = bean.getMethods();//获得bean的方法   
  23.         List<Method> setMethodList = new ArrayList<Method>();//构造一个List用来存放bean中所有set开头的方法   
  24.         //获得Bean中所有set方法   
  25.         for (int i = 0;i < methods.length;i++){   
  26.             Method method = methods[i];   
  27.             if (method.getName().startsWith("set")){   
  28.                 setMethodList.add(method);   
  29.             }   
  30.         }   
  31.   
  32.         ResultSetMetaData meta = null;   
  33.         try{   
  34.             meta = rs.getMetaData();   
  35.             //如果记录集中的字段不等于Bean中的属性值,抛出异常   
  36.             if (setMethodList.size() != meta.getColumnCount()){   
  37.                 throw new IllegalArgumentException("传入的JavaBean与ResultSet不一致");   
  38.             }   
  39.             //将得到的set方法构建一个Method Array   
  40.             Method[] setMethodArray = new Method[setMethodList.size()];   
  41.             setMethodList.toArray(setMethodArray);   
  42.             int count = setMethodArray.length;   
  43.             //构建一个String数组用来存放对应的ResultSet中的字段   
  44.             String[] field = new String[count];   
  45.             for (int i = 0;i < count;i++){   
  46.                 field[i] = setMethodArray[i].getName().substring(3).toLowerCase();   
  47.             }   
  48.             //将ResultSet中的每一条记录构建一个JavaBean实例,然后添加到Collection中   
  49.             collection = new ArrayList<T>();   
  50.             while(rs.next()){   
  51.                 T o = (T)bean.newInstance();   
  52.                 for (int i = 0;i < count;i++){   
  53.                     Object[] param = new Object[]{rs.getObject(field[i])};   
  54.                     setMethodArray[i].invoke(o,param);   
  55.                 }   
  56.                 collection.add(o);      
  57.             }   
  58.         }   
  59.         catch(Exception e){   
  60.             throw e;   
  61.         }   
  62.         finally{      
  63.             return collection;//最后返回这个Collection   
  64.         }   
  65.     }   
  66.   
  67. }  
   发表时间:2007-04-21  
学习了一下,如果使用纯jdbc开发的话,是很有用的,但有一个问题,这样必须要column的名字和field的名字一致.如果能改进的话就好了.

把代码简化了一下,呵呵,共同学习

	public static <T> Collection<T> getBeanCollection(T object, ResultSet rs) {

		Collection<T> collection = null;

		Class clazzT = object.getClass();
		Method[] methods = clazzT.getMethods();//获得bean的方法    
		List<Method> setterMethodList = new ArrayList<Method>();//构造一个List用来存放bean中所有set开头的方法    

		//获得Bean中所有set方法    
		for (Method method : methods) {
			if (method.getName().startsWith("set")) {
				setterMethodList.add(method);
			}
		}

		ResultSetMetaData meta = null;
		try {
			meta = rs.getMetaData();

			//如果记录集中的字段不等于Bean中的属性值,抛出异常    
			if (setterMethodList.size() != meta.getColumnCount()) {
				throw new IllegalArgumentException("传入的JavaBean与ResultSet不一致");
			}

			//将ResultSet中的每一条记录构建一个JavaBean实例,然后添加到Collection中    
			collection = new ArrayList<T>();

			while (rs.next()) {
				T o = (T)clazzT.newInstance();
				
				for (Method m : setterMethodList) {
					m.invoke(o, rs.getObject(m.getName().substring(3).toLowerCase()));
				}
				collection.add(o);
			}
		} catch (Exception e) {
			e.printStackTrace();
//			throw e;
		} 
		
		return collection;//最后返回这个Collection    
	}
0 请登录后投票
   发表时间:2007-04-21  
引用
这样必须要column的名字和field的名字一致.如果能改进的话就好了.

如果需要不一致的话,就必须付出额外的代价了,例如XML配置,我个人还是比较推崇简单的惯例优先原则。这段代码是很久以前写的,感谢wangcheng用jdk5.0的新语法进行了简化,这样清爽多了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics