黑马程序员技术交流社区

标题: 写了一段代码,主要是解决ResultSet 对象 往bean中赋值的问... [打印本页]

作者: yuZhe_toString    时间: 2014-5-16 13:02
标题: 写了一段代码,主要是解决ResultSet 对象 往bean中赋值的问...
本帖最后由 yuZhe_toString 于 2014-5-29 15:28 编辑

由于jdbc遍历的时候需要手动将结果集中的值set给bean对象中,如下段代码
while(rs.next()){
    bean.setID(rs.getString("ID"));
    。。。。。。
}
这样非常麻烦,所以写了一段程序解决这个问题,如果大家有好的改进方法可以提出来。
楼主通过反射出数据bean中的属性信息,并把每条属性信息存入BeanInformation中,然后把BeanInformation对象放入一个Map里。BeanInformation代码如下:

  1. public class BeanInformation {


  2.         private String fieldName;         //属性名称        
  3.         private String methodName;        //方法名称
  4.         private Class type;                        //属性类型
  5.         
  6.         
  7.         public String getFieldName() {
  8.                 return fieldName;
  9.         }
  10.         public void setFieldName(String fieldName) {
  11.                 this.fieldName = fieldName;
  12.         }
  13.         public String getMethodName() {
  14.                 return methodName;
  15.         }
  16.         public void setMethodName(String methodName) {
  17.                 this.methodName = methodName;
  18.         }
  19.         public Class getType() {
  20.                 return type;
  21.         }
  22.         public void setType(Class type) {
  23.                 this.type = type;
  24.         }
  25. }



  26. 下面是解析bean属性的代码,和对bean的赋值


  27. import java.lang.reflect.Field;
  28. import java.lang.reflect.InvocationTargetException;
  29. import java.sql.ResultSet;
  30. import java.sql.ResultSetMetaData;
  31. import java.sql.SQLException;
  32. import java.util.ArrayList;
  33. import java.util.HashMap;
  34. import java.util.List;
  35. import java.util.Map;


  36. public class VOTools {
  37.         
  38.         private Class className;                //bean的字节码
  39.         private ResultSet rs;                        //ResultSet结果集
  40.         
  41.         //VOTools的第一种构造函数
  42.         public VOTools(ResultSet rs,String className){
  43.                 try {
  44.                         this.className = Class.forName(className);
  45.                         this.rs = rs;
  46.                 } catch (ClassNotFoundException e) {
  47.                         e.printStackTrace();
  48.                 }
  49.         }
  50.         
  51.         //VOTools的第二种构造函数
  52.         public VOTools(ResultSet rs,Class className){
  53.                 this.className = className;
  54.                 this.rs = rs;
  55.         }
  56.         
  57.         //返回List,list中存放的是已被赋值好的bean
  58.         public List getBeanList () throws SecurityException,NoSuchMethodException,IllegalArgumentException,InvocationTargetException{
  59.                 return  getBeanList(this.rs,this.className);
  60.         }
  61.         
  62.         //获取单个bean
  63.         public Object getBean() throws Exception{
  64.                 Object obj = null;
  65.                 List<Object> list = getBeanList(this.rs,this.className);
  66.                 if(list!=null && list.size()==1){
  67.                         obj = list.get(0);
  68.                 }
  69.                 return obj;
  70.         }
  71.         
  72.         //获取bean中的属性信息
  73.         private Map<String,BeanInformation> getBeanInformationToMap(Class className){
  74.                 //创建Map key为属性名   value为该属性的属性解析对象
  75.                 Map<String,BeanInformation> beanInformationToMap = new HashMap<String, BeanInformation>();
  76.                 Class beanClass = null;
  77.                 try {
  78.                         beanClass = className;
  79.                         //获取传入的bean的所有属性
  80.                         Field[] beanField = beanClass.getDeclaredFields();
  81.                         //循环遍历
  82.                         for(int i=0;i<beanField.length;i++){
  83.                                 //创建bean解析对象
  84.                                 BeanInformation bean = new BeanInformation();
  85.                                 //获取属性名,并大写存入BeanInformation里
  86.                                 bean.setFieldName(beanField.getName().toUpperCase());
  87.                                 //获取方法set方法名
  88.                                 bean.setMethodName("set"+beanField.getName().substring(0, 1).toUpperCase().concat(beanField.getName().substring(1)));
  89.                                 //获取属性类型
  90.                                 bean.setType(beanField.getType());
  91.                                 //将BeanInformation存入map
  92.                                 beanInformationToMap.put(bean.getFieldName(), bean);
  93.                         }
  94.                 } catch (Exception e) {
  95.                         e.printStackTrace();
  96.                 }
  97.                 return beanInformationToMap;
  98.         }
  99.         
  100.         //遍历ResultSet结果集,并赋值
  101.         private List getBeanList(ResultSet result,Class beanName)throws SecurityException,NoSuchMethodException,IllegalArgumentException,InvocationTargetException{
  102.                 Map<String,BeanInformation> beanInformationMap =  getBeanInformationToMap(beanName);
  103.                 List list = new ArrayList();
  104.                 ResultSetMetaData resm;
  105.                 try {
  106.                         //获取结果集信息
  107.                         resm = result.getMetaData();
  108.                         while(result.next()){
  109.                                 Class classz = beanName;
  110.                                 //反射实例化对象
  111.                                 Object obj = classz.newInstance();
  112.                                 //循环结果集的列
  113.                                 for(int i=0;i<resm.getColumnCount();i++){
  114.                                         //获取结果集每列的名称
  115.                                         String key = resm.getColumnName(i+1).toUpperCase();
  116.                                         //如果这个名称在之前解析的bean中能匹配上 就对其进行赋值
  117.                                         if(beanInformationMap.get(key) != null){
  118.                                                 //获取方法名
  119.                                                 String methodName = beanInformationMap.get(key).getMethodName();
  120.                                                 //获取属性类型
  121.                                                 Class type = beanInformationMap.get(key).getType();
  122.                                                 //类型匹配
  123.                                                 if(type.equals(String.class)){
  124.                                                         //反射赋值
  125.                                                         classz.getMethod(methodName,type).invoke(obj, new Object[]{result.getString(key)});
  126.                                                 }else if(type.equals(int.class) || type.equals(Integer.class)){
  127.                                                         classz.getMethod(methodName,type).invoke(obj, new Object[]{result.getInt(key)});
  128.                                                 }else if(type.equals(double.class) || type.equals(Double.class)){
  129.                                                         classz.getMethod(methodName,type).invoke(obj, new Object[]{result.getDouble(key)});
  130.                                                 }else if(type.equals(char.class) || type.equals(Character.class)){
  131.                                                         classz.getMethod(methodName,type).invoke(obj, new Object[]{result.getCharacterStream(key)});
  132.                                                 }
  133.                                         }
  134.                                         //String value = result.getString(key);
  135.                                 }
  136.                                 
  137.                                 list.add(obj);
  138.                         }
  139.                         
  140.                 } catch (InstantiationException e) {
  141.                         e.printStackTrace();
  142.                 } catch (IllegalAccessException e) {
  143.                         e.printStackTrace();
  144.                 } catch (SQLException e) {
  145.                         e.printStackTrace();
  146.                 }finally{
  147.                         try {
  148.                                 this.rs.close();
  149.                         } catch (SQLException e) {
  150.     rs = null;
  151.     e.printStackTrace();
  152.                         }
  153.                 }
  154.                 return list;
  155.         }
  156.         
  157.         
  158. }
复制代码



作者: yuZhe_toString    时间: 2014-5-16 13:25
由于代码过长,字数以超,所以格式不好控制。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2