最近开发公司的一个项目,因项目不是很大的项目,所以仅仅采用了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对象组成的。