javabean注意事项之用Integer替换你的int
来源:互联网 发布:安阳市网络教育平台 编辑:程序博客网 时间:2024/06/13 21:56
话不多说,上代码!
1、一开始,我的javabean是这样的
- public class User
- {
- private String uniqueid;
- private String username;
- private String password;
- private String email;
- private String phone;
- private int hits;
- private String headPicUrl;
- private String createDate;
-
-
- public User(){}
- public String getUniqueid()
- {
- return uniqueid;
- }
- public void setUniqueid(String uniqueid)
- {
- this.uniqueid = uniqueid;
- }
- public String getUsername()
- {
- return username;
- }
- public void setUsername(String username)
- {
- this.username = username;
- }
- public String getPassword()
- {
- return password;
- }
- public void setPassword(String password)
- {
- this.password = password;
- }
-
- public String getEmail()
- {
- return email;
- }
- public void setEmail(String email)
- {
- this.email = email;
- }
- public String getPhone()
- {
- return phone;
- }
- public void setPhone(String phone)
- {
- this.phone = phone;
- }
- public String getCreateDate()
- {
- return createDate;
- }
- public void setCreateDate(String createDate)
- {
- this.createDate = createDate;
- }
-
- public int getHits()
- {
- return hits;
- }
- public void setHits(int hits)
- {
- this.hits = hits;
- }
- public String getHeadPicUrl()
- {
- return headPicUrl;
- }
- public void setHeadPicUrl(String headPicUrl)
- {
- this.headPicUrl = headPicUrl;
- }
-
-
- }
我测试的时候,是以下语句- public class UserDaoImplTest
- {
- public static void main(String[] args)
- {
- UserDaoImpl uuu = new UserDaoImpl();
- User u = uuu.find("xiaoming");
- System.out.println(u.getUniqueid());
-
- }
-
- }
然后报错其实还是拿到了xiaoming这个user。但是在生成bean的时候出了一点问题。问题的原因根据报错显而易见,就是我们最爱的int,本来多么可爱的一个人啊,我们最爱的int,名字可爱,只有三个字母写起来方便,又代表整型,简单干练。总之int也许是所有程序员最喜欢的类型。
但是在这里,它并不可爱。
我们追根溯源去找问题的根本于是我们找到了他
- public User find(String username)
- {
- String sql = "select * from t_user where binary username=?";
- Map<String,Object> map =SQLutil.queryForMap(sql, username);
- return SQLutil.queryForBean(map, User.class);
- }
我们又找到了他们- public static List<Map<String,Object>> queryForMapList(String sql,Object...objects)
- {
- List<Map<String,Object>> result = new ArrayList<Map<String,Object>>(); //建立一个存放结果的List
- Connection conn = DButil.getConnection(); //建立与数据库的连接
- PreparedStatement pStam = null;
- ResultSet rs = null;
- try
- {
- pStam = DButil.prepareStatement(conn, sql);
- for(int i=0;i<objects.length;i++) //对sql语句里的 ?进行填充
- {
- pStam.setObject(i+1, objects[i]);
- }
- rs = pStam.executeQuery(); //拿到查询结果
- while(rs.next())
- {
- ResultSetMetaData rsmd = rs.getMetaData(); //拿到查询结果的字段
- int count = rsmd.getColumnCount(); //字段数量
- Map<String,Object> map = new HashMap<String,Object>(); //一个存放数据的map,key=字段名称,value=字段的内容
- for(int i=0;i<count;i++)
- {
- map.put(rsmd.getColumnName(i+1), rs.getObject(rsmd.getColumnName(i+1)));
- }
- result.add(map);//将存放一条数据的map放进List
- }
-
- } catch (SQLException e)
- {
- e.printStackTrace();
- }finally
- {
- DButil.closeResultSet(rs);
- DButil.closePreparedStatement(pStam);
- DButil.closeConnection(conn);
- }
- return result;
- }
- public static <T>T queryForBean(Map<String,Object> map,Class<T> clazz,Object...objects)
- {
- T obj = null;
- Field field = null;
- try
- {
- obj = (T) clazz.newInstance(); //实例化clazz的一个对象
- } catch (InstantiationException e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalAccessException e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- if(map == null)
- return null; //map为空,则返回为空
- for(String columnName:map.keySet())//遍历map的key
- {
- Method method = null;
- String propertyName = columnName; //属性名称为key值
-
- try
- {
- field = clazz.getDeclaredField(propertyName);//得到该属性名称在clazz中的字段
- } catch (NoSuchFieldException e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (SecurityException e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- String fieldType = field.toString().split(" ")[1]; //得到声明字段的类</span>
- Object value = map.get(columnName);
- if(value == null)
- {
- continue;
- }
- String setMethodName ="set"+StringUtil.upperCaseFirstCharacter(propertyName);//拼接set方法的函数名
- String valueType = value.getClass().getName();//value的类型,也就是数据库里相应表内容的数据类型
-
- if(!fieldType.equalsIgnoreCase(valueType)) //根据数据所属的类完成Object到该类的转换
- {
- if(fieldType.equalsIgnoreCase("java.lang.Integer"))
- {
- value =Integer.parseInt(String.valueOf(value));
- }
- else if(fieldType.equalsIgnoreCase("java.lang.String"))
- {
- value = String.valueOf(value);
- }
- else if(fieldType.equalsIgnoreCase("java.util.Date"))
- {
- valueType = "java.lang.Date";
- String datestr = String.valueOf(value);
- Timestamp ts = Timestamp.valueOf(datestr);
- Date date = new Date(ts.getTime());
- value = date;
- }
- }
- try
- {
- method = clazz.getDeclaredMethod(setMethodName, Class.forName(fieldType));
- method.invoke(obj, value); //就是调用set方法赋值的意思。。。。
- } catch (NoSuchMethodException e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (SecurityException e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (ClassNotFoundException e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalAccessException e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalArgumentException e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (InvocationTargetException e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- }
- return obj;
- }
-
- public static Map<String,Object> queryForMap(String sql,Object...objects)
- {
- List<Map<String,Object>> mapList=queryForMapList(sql,objects);
- if(mapList.size() != 1)
- {
- return null;
- }
- else return mapList.get(0);
- }
看我标注的语句- 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类,所以报错