最近开发公司的一个项目,因项目不是很大的项目,所以仅仅采用了spring MVC框架,但是数据库很多表中的字段至少15个,这样当每次将数据库表中的数据取出来放入javabean中时,写setXXX方法总是要写很多遍,而且容易出错,很是麻烦,所以采用了反射和泛型的方式,自动给javabean赋值。当然有个缺点,就是数据库中的字段名要跟javabean中的字段名相同,并且字段类型要相同。如果想做成更好的话,可以采用配置文件的方式,在此就不写了。代码如下:
// 根据传过来的对象和ResultSet自动给对象赋值
public static <T> List<T> getBean(ResultSet rs, T object) throws Exception { Class<?> classType = object.getClass(); ArrayList<T> objList = new ArrayList<T>(); //SqlRowSet srs = jdbcTemplate.queryForRowSet(sql); Field[] fields = classType.getDeclaredFields();//得到对象中的字段 while (rs.next()) { //每次循环时,重新实例化一个与传过来的对象类型一样的对象 T objectCopy = (T) classType.getConstructor(new Class[] {}).newInstance(new Object[] {}); for (int i = 0; i < fields.length; i++) { Field field = fields[i]; String fieldName = field.getName(); Object value = null; //根据字段类型决定结果集中使用哪种get方法从数据中取到数据 if (field.getType().equals(String.class)) { value = rs.getString(fieldName); if(value==null){ value=""; } } if (field.getType().equals(int.class)) { value = rs.getInt(fieldName); } if (field.getType().equals(java.util.Date.class)) { value = rs.getDate(fieldName); } // 获得属性的首字母并转换为大写,与setXXX对应 String firstLetter = fieldName.substring(0, 1).toUpperCase(); String setMethodName = "set" + firstLetter + fieldName.substring(1); Method setMethod = classType.getMethod(setMethodName, new Class[] { field.getType() }); setMethod.invoke(objectCopy, new Object[] { value });//调用对象的setXXX方法 } objList.add(objectCopy); } if(rs != null){ rs.close(); } return objList; }上面方法的使用如类为User:
User user = new User();
List<User> list = getgetBean(resultSet , user);//将得到list集合,里面是有user对象组成的。