javabean注意事项之用Integer替换你的int

来源:互联网 发布:安阳市网络教育平台 编辑:程序博客网 时间:2024/06/13 21:56

 话不多说,上代码!

1、一开始,我的javabean是这样的

[java] view plain copy
  1. public class User  
  2. {  
  3.     private String uniqueid;  
  4.     private String username;  
  5.     private String password;  
  6.     private String email;  
  7.     private String phone;  
  8.     private int hits;  
  9.     private String headPicUrl;  
  10.     private String createDate;  
  11.       
  12.       
  13.     public User(){}  
  14.     public String getUniqueid()  
  15.     {  
  16.         return uniqueid;  
  17.     }  
  18.     public void setUniqueid(String uniqueid)  
  19.     {  
  20.         this.uniqueid = uniqueid;  
  21.     }  
  22.     public String getUsername()  
  23.     {  
  24.         return username;  
  25.     }  
  26.     public void setUsername(String username)  
  27.     {  
  28.         this.username = username;  
  29.     }  
  30.     public String getPassword()  
  31.     {  
  32.         return password;  
  33.     }  
  34.     public void setPassword(String password)  
  35.     {  
  36.         this.password = password;  
  37.     }  
  38.       
  39.     public String getEmail()  
  40.     {  
  41.         return email;  
  42.     }  
  43.     public void setEmail(String email)  
  44.     {  
  45.         this.email = email;  
  46.     }  
  47.     public String getPhone()  
  48.     {  
  49.         return phone;  
  50.     }  
  51.     public void setPhone(String phone)  
  52.     {  
  53.         this.phone = phone;  
  54.     }  
  55.     public String getCreateDate()  
  56.     {  
  57.         return createDate;  
  58.     }  
  59.     public void setCreateDate(String createDate)  
  60.     {  
  61.         this.createDate = createDate;  
  62.     }  
  63.       
  64.     public int getHits()  
  65.     {  
  66.         return hits;  
  67.     }  
  68.     public void setHits(int hits)  
  69.     {  
  70.         this.hits = hits;  
  71.     }  
  72.     public String getHeadPicUrl()  
  73.     {  
  74.         return headPicUrl;  
  75.     }  
  76.     public void setHeadPicUrl(String headPicUrl)  
  77.     {  
  78.         this.headPicUrl = headPicUrl;  
  79.     }  
  80.       
  81.   
  82. }  
我测试的时候,是以下语句

[html] view plain copy
  1. public class UserDaoImplTest  
  2. {  
  3.     public static void main(String[] args)  
  4.     {  
  5.         UserDaoImpl uuu = new UserDaoImpl();  
  6.         User u = uuu.find("xiaoming");  
  7.         System.out.println(u.getUniqueid());  
  8.               
  9.     }  
  10.   
  11. }  
然后报错

其实还是拿到了xiaoming这个user。但是在生成bean的时候出了一点问题。问题的原因根据报错显而易见,就是我们最爱的int,本来多么可爱的一个人啊,我们最爱的int,名字可爱,只有三个字母写起来方便,又代表整型,简单干练。总之int也许是所有程序员最喜欢的类型。

但是在这里,它并不可爱。

我们追根溯源去找问题的根本于是我们找到了他

[html] view plain copy
  1. public User find(String username)  
  2.     {  
  3.         String sql = "select * from t_user where binary username=?";  
  4.         Map<String,Object> map =SQLutil.queryForMap(sql, username);  
  5.         return SQLutil.queryForBean(map, User.class);  
  6.     }  
我们又找到了他们
[html] view plain copy
  1. public static List<Map<String,Object>> queryForMapList(String sql,Object...objects)  
  2.     {  
  3.         List<Map<String,Object>> result = new ArrayList<Map<String,Object>>();  //建立一个存放结果的List  
  4.         Connection conn = DButil.getConnection();   //建立与数据库的连接  
  5.         PreparedStatement pStam = null;  
  6.         ResultSet rs = null;  
  7.         try  
  8.         {  
  9.             pStam = DButil.prepareStatement(conn, sql);    
  10.             for(int i=0;i<objects.length;i++) //对sql语句里的 ?进行填充  
  11.             {  
  12.                 pStam.setObject(i+1, objects[i]);  
  13.             }  
  14.             rs = pStam.executeQuery(); //拿到查询结果  
  15.             while(rs.next())  
  16.             {  
  17.                 ResultSetMetaData rsmd = rs.getMetaData();  //拿到查询结果的字段  
  18.                 int count = rsmd.getColumnCount();          //字段数量  
  19.                 Map<String,Object> map = new HashMap<String,Object>();  //一个存放数据的map,key=字段名称,value=字段的内容  
  20.                 for(int i=0;i<count;i++)  
  21.                 {  
  22.                     map.put(rsmd.getColumnName(i+1), rs.getObject(rsmd.getColumnName(i+1)));  
  23.                 }  
  24.                 result.add(map);//将存放一条数据的map放进List  
  25.             }  
  26.               
  27.         } catch (SQLException e)  
  28.         {  
  29.             e.printStackTrace();  
  30.         }finally  
  31.         {  
  32.             DButil.closeResultSet(rs);  
  33.             DButil.closePreparedStatement(pStam);  
  34.             DButil.closeConnection(conn);  
  35.         }  
  36.         return result;  
  37.     }  
  38.     public static <T>T queryForBean(Map<String,Object> map,Class<T> clazz,Object...objects)  
  39.     {  
  40.         T obj = null;  
  41.         Field field = null;  
  42.         try  
  43.         {  
  44.             obj = (T) clazz.newInstance();  //实例化clazz的一个对象  
  45.         } catch (InstantiationException e)  
  46.         {  
  47.             // TODO Auto-generated catch block  
  48.             e.printStackTrace();  
  49.         } catch (IllegalAccessException e)  
  50.         {  
  51.             // TODO Auto-generated catch block  
  52.             e.printStackTrace();  
  53.         }     
  54.         if(map == null)  
  55.             return null;        //map为空,则返回为空  
  56.         for(String columnName:map.keySet())//遍历map的key  
  57.         {  
  58.             Method method = null;  
  59.             String propertyName = columnName; //属性名称为key值  
  60.   
  61.             try  
  62.             {  
  63.                 field = clazz.getDeclaredField(propertyName);//得到该属性名称在clazz中的字段  
  64.             } catch (NoSuchFieldException e)  
  65.             {  
  66.                 // TODO Auto-generated catch block  
  67.                 e.printStackTrace();  
  68.             } catch (SecurityException e)  
  69.             {  
  70.                 // TODO Auto-generated catch block  
  71.                 e.printStackTrace();  
  72.             }  
  73.     String fieldType = field.toString().split(" ")[1]; //得到声明字段的类</span>  
  74.             Object value = map.get(columnName);  
  75.             if(value == null)  
  76.             {  
  77.                 continue;  
  78.             }  
  79.             String setMethodName ="set"+StringUtil.upperCaseFirstCharacter(propertyName);//拼接set方法的函数名  
  80.             String valueType = value.getClass().getName();//value的类型,也就是数据库里相应表内容的数据类型  
  81.               
  82.             if(!fieldType.equalsIgnoreCase(valueType)) //根据数据所属的类完成Object到该类的转换  
  83.             {  
  84.                 if(fieldType.equalsIgnoreCase("java.lang.Integer"))  
  85.                 {  
  86.                     value =Integer.parseInt(String.valueOf(value));  
  87.                 }  
  88.                 else if(fieldType.equalsIgnoreCase("java.lang.String"))  
  89.                 {  
  90.                     value = String.valueOf(value);  
  91.                 }  
  92.                 else if(fieldType.equalsIgnoreCase("java.util.Date"))  
  93.                 {  
  94.                     valueType = "java.lang.Date";  
  95.                     String datestr = String.valueOf(value);  
  96.                     Timestamp ts = Timestamp.valueOf(datestr);  
  97.                     Date date = new Date(ts.getTime());  
  98.                     value = date;  
  99.                 }  
  100.             }  
  101.             try  
  102.             {  
  103.                 method = clazz.getDeclaredMethod(setMethodName, Class.forName(fieldType));  
  104.                 method.invoke(obj, value); //就是调用set方法赋值的意思。。。。  
  105.             } catch (NoSuchMethodException e)  
  106.             {  
  107.                 // TODO Auto-generated catch block  
  108.                 e.printStackTrace();  
  109.             } catch (SecurityException e)  
  110.             {  
  111.                 // TODO Auto-generated catch block  
  112.                 e.printStackTrace();  
  113.             } catch (ClassNotFoundException e)  
  114.             {  
  115.                 // TODO Auto-generated catch block  
  116.                 e.printStackTrace();  
  117.             } catch (IllegalAccessException e)  
  118.             {  
  119.                 // TODO Auto-generated catch block  
  120.                 e.printStackTrace();  
  121.             } catch (IllegalArgumentException e)  
  122.             {  
  123.                 // TODO Auto-generated catch block  
  124.                 e.printStackTrace();  
  125.             } catch (InvocationTargetException e)  
  126.             {  
  127.                 // TODO Auto-generated catch block  
  128.                 e.printStackTrace();  
  129.             }  
  130.               
  131.         }  
  132.         return obj;  
  133.     }  
  134.       
  135.     public static Map<String,Object> queryForMap(String sql,Object...objects)  
  136.     {  
  137.         List<Map<String,Object>> mapList=queryForMapList(sql,objects);  
  138.         if(mapList.size() != 1)  
  139.         {  
  140.             return null;  
  141.         }  
  142.         else return mapList.get(0);  
  143.     }  

看我标注的语句

[html] view plain copy
  1. String fieldType = field.toString().split(" ")[1]; //得到声明字段的类</span>  
正常的时候Filed类的 toString方法返回的是像下面这样的

private Java.lang.Integer com.yck.reflect.User.hits

但是你用int时,返回的是
private int com.yck.reflect.User.hits

找不到int类,所以报错