xiaoniao

          BeanWaper

          package ff;

          import java.lang.reflect.Field;
          import java.sql.Date;
          import java.sql.SQLException;
          import java.util.HashMap;
          import java.util.Iterator;
          import java.util.Map;
          import java.util.Set;
          import java.util.Vector;
          import java.sql.ResultSet;
          /**
           * BEAN 適用類 通過數據庫結果集包裝一個POJO,對它進行賦值
           * 適用于非使用ORM框架的軟件
           */
          public class BeanWaper {
           
           //傳入的POJO對象參數
           private Object obj;
           
           //數據庫結果集
           ResultSet result;
           
           //保存Field集合信息
           private Map fields = new HashMap();
           
           //預存儲數據類型
           private Map propertyType = new HashMap();
           
           public BeanWaper(Object user,ResultSet result){
            System.out.println("ABC");
            this.obj = user;
            this.result = result;
            //基本常用數據類型  可能不完整
            propertyType.put("int", Integer.valueOf(0));
            propertyType.put("long", Integer.valueOf(1));
            propertyType.put("String", Integer.valueOf(2));
            propertyType.put("byte", Integer.valueOf(3));
            propertyType.put("Date", Integer.valueOf(4));
            propertyType.put("double", Integer.valueOf(5));
            
            //補充 見 getDataBaseTypeValue(arg1,arg2,arg3)
            //propertyType.put("**", Integer.valueOf(6));
            //propertyType.put("**", Integer.valueOf(7));
            
           }
           
           /**
            * @see 封裝對象的字段名稱和數據類型對象,供數據庫取值時使用
            * @return
            */
           public Map getPropertyNamesAndType(){
            Field[] classFields = getFields();
            for(int flag = 0; flag < classFields.length; flag++ ){
             fields.put(getPropertyName(classFields[flag]),getPropertyType(classFields[flag]));
            }
            System.out.println("1.Fields信息:"+"\n"+fields.toString());
            return fields;
           }
           
           /**
            * @see 獲取所有字段的域
            * @return
            */
           public Field[] getFields(){
            System.out.println("2.獲取聲明了的Fields信息"+"\n"+obj.getClass().getDeclaredFields().toString());
            return obj.getClass().getDeclaredFields();
           }
           
           /**
            * @see 獲取指定字段域的數據類型
            * @param field指定字段域
            * @return
            */ 
           public String getPropertyType(Field field){
            StringSpilt spilt = new StringSpilt();
            String[] values = spilt.split(field.getType().toString(), ".");
            String propertyType = spilt.getLastString(values);
            System.out.println("3.獲取屬性類型信息:"+"\n"+propertyType);
            return propertyType;
           }
           
           /**
            * @see 通過傳入屬性數據類型,名稱,結果集,通過匹配從結果集中取出相應數據
            * @param type
            * @param name
            * @param result
            * @return
            * @throws NumberFormatException
            * @throws SQLException
            */
           public Object getDataBaseTypeValue(String type,String name,ResultSet result) throws NumberFormatException, SQLException{
            Object obj = null;
            int flag = ((Integer)propertyType.get(type)).intValue();
            switch(flag){
            case 0 : obj = Integer.valueOf(result.getInt(name)); break;
            case 1 : obj = Long.valueOf(result.getLong(name)); break;
            case 2 : obj = String.valueOf(result.getString(name)); break;
            case 3 : obj = Byte.valueOf(result.getByte(name)); break;
            case 4 : obj = (Date)result.getDate(name); break;
            case 5 : obj = Double.valueOf(result.getDouble(name)); break;
            //補充
            //case 6 : obj = String.valueOf(result.getString(name)); break;
            }
            System.out.println("4.打印獲取的數據庫值信息:"+"\n"+obj);
            return obj;
           }
           
           /**
            * @see 設置指定的BEAN類的值
            * @param clazz
            * @param value
            * @param field
            */
           public void setValue(Object clazz, Object value,Field field){
            try {
             field.set(clazz, value);
            } catch (IllegalArgumentException e) {
             e.printStackTrace();
             System.out.println("5.打印異常信息如下:"+"\n"+e);
            } catch (IllegalAccessException e) {
             e.printStackTrace();
             System.out.println("6.打印異常信息如下:"+"\n"+e);
            }
           }
           
           /**
            * @see 包裝指定的BEAN類,結果為傳入的BEAN將擁有設定的值
            * @param result
            * @throws NumberFormatException
            * @throws SQLException
            */
           public void waperBean(ResultSet result) throws NumberFormatException, SQLException{
            Map names_types = getPropertyNamesAndType();
            Set keys = names_types.keySet();
            Iterator ite = keys.iterator();
            while(ite.hasNext()){
             String name = (String) ite.next();
             String type = (String) names_types.get(name);
             Field field = null;
             try {
              field = obj.getClass().getDeclaredField(name);
             } catch (SecurityException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
              System.out.println("7.打印異常信息如下:"+"\n"+e);
             } catch (NoSuchFieldException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
              System.out.println("8.打印異常信息如下:"+"\n"+e);
             }
             setValue(obj,getDataBaseTypeValue(type,name,result),field);  
            } 
           }
           
           //獲取屬性名稱
           public String getPropertyName(Field field){
            return field.getName();
           }

           /**
            * 內部類  字符串分割類
            */
           public class StringSpilt {
            /**
               *
               * 分割字符串,原理:檢測字符串中的分割字符串,然后取子串
               *
               * @param original 需要分割的字符串
               *
               * @paran regex 分割字符串
               *
               * @return 分割后生成的字符串數組
               *
               */   
              public String[] split(String original,String regex)   
              {
               // 取子串的起始位置       
                  int startIndex = 0;       
                  // 將結果數據先放入Vector中       
                  Vector v = new Vector();       
                  // 返回的結果字符串數組       
                  String[] str = null;                       
                  // 存儲取子串時起始位置       
                  int index = 0;       
                  // 獲得匹配子串的位置       
                  startIndex = original.indexOf(regex);                       
                  // System.out.println("0" + startIndex);                       
                  // 如果起始字符串的位置小于字符串的長度,則證明沒有取到字符串末尾。       
                  // -1代表取到了末尾       
                  while(startIndex < original.length() && startIndex != -1)           
                  {           
                      String temp = original.substring(index,startIndex);                                  
                      // System.out.println(" " + startIndex);                                 
                      // 取子串           
                      v.addElement(temp);           
                      // 設置取子串的起始位置           
                      index = startIndex + regex.length();           
                      // 獲得匹配子串的位置           
                      startIndex = original.indexOf(regex,startIndex + regex.length());           
                  }       
                  // 取結束的子串       
                  v.addElement(original.substring(index));                    
                  // 將Vector對象轉換成數組       
                  str = new String[v.size()];       
                  for(int i=0;i<v.size();i++)           
                  {           
                      str[i] = (String)v.elementAt(i);           
                  }       
                   // 返回生成的數組       
                  return str; 
              }
             
              /**
               * 功能描述:獲取最后一個字符串
               * @author ZhouMingXing
               */
              public String getLastString(String[] values ){
               int length = values.length;
               if(length == 0){
                return null;
               }else{
                return values[length-1];
               }
              }
           }
           
           //測試用途
           public static void main(String[] args){
            MyBean user = new MyBean();  
            try {
             new BeanWaper(user,new java.sql.ResultSet()).waperBean(result);
             System.out.println("最后結果信息如下:"+"\n"+user.getId()+"  "+user.getName()+"  "+user.getNumber()+"  "+user.getMyBirthed()+"   "+user.getMyImage()+"   "+user.getPassword()+""+"");
            } catch (NumberFormatException e) {
             // TODO Auto-generated catch block
             System.out.println("9.打印異常信息如下:"+"\n"+e);
             
             e.printStackTrace();
            } catch (SQLException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
             System.out.println("10.打印異常信息如下:"+"\n"+e);
            }
           }
          }

          posted on 2007-04-30 08:49 小鳥 閱讀(270) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 北宁市| 宁波市| 澄迈县| 深泽县| 亚东县| 张家港市| 迁安市| 巩留县| 寿宁县| 夹江县| 克拉玛依市| 鹤山市| 隆德县| 丰原市| 山东| 甘洛县| 惠来县| 武夷山市| 修水县| 遂川县| 孝义市| 壤塘县| 松溪县| 兴城市| 北京市| 永州市| 安义县| 华亭县| 鹿邑县| 保亭| 郴州市| 伊吾县| 高淳县| 马关县| 望江县| 汉寿县| 城固县| 山丹县| 哈巴河县| 丰台区| 包头市|