Java web基操 --将mysql结果集包装为特定的类对象
mysql结果集的傻瓜式读取:
在获得某种表的结果集后,有get***一个个的去读取表中数据。这样意味着每种表都需要一个不一样的方法去实现读取,毫无疑问,这样的代码复用率极低。
利用泛型与反射:
/**
* 将结果集读取为类对象的一个list集合
* @param result 集合
* @param rs mysql结果集
* @param clazz 要转换成的类
* @return 转换后的集合
*/
public static <T>List<T> listObject(List<T> result, ResultSet rs, Class<T> clazz) {
try{
while (rs.next()) {
//反射获得对应类的一个对象
T t = clazz.getConstructor().newInstance();
//获取类所有的成员变量
Field[] fields = clazz.getDeclaredFields();
//如果使用了继承的话,再加如下代码
/**
//获取父类所有的成员变量
Field[] superFields = clazz.getSuperclass().getDeclaredFields();
//将本类与父类的Filed数组相加
private static Field[] addFields(Field[] f1, Field[] f2) {
List<Field> l = new ArrayList<Field>();
for (Field f : f1) l.add(f);
for (Field f : f2) l.add(f);
return l.toArray(new Field[f1.length + f2.length]);
}
*/
//遍历Field数组,调用类对应的setter方法
for (Field field : fields) {
//获取字段
String temp = field.getName();
//将字段首字母改为大写,在前面加上set字符串,即为对应的setter方法(代码规范的话)
String setterMethodName = getSetterMethodName(temp);
//利用反思就可以获取到setter方法的Method对象
Method setterMethod = clazz.getMethod(setterMethodName, field.getType());
//利用getSqlName(自定义)方法将字段转换为mysql字段的格式(mysql的规范格式是使 用下划线),接下来就可以读取结果集里的值了
var value = rs.getObject(getSqlName(field.getName()));
//调用setter方法,将读取到的值赋给对象
setterMethod.invoke(t, value);
}
//将对象加到list,一次循坏结束
result.add(t);
}
//不要忘记最后还要把结果集关了
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 获得setter方法的名称
* @param fieldName 属性变量的名称
* @return setter 方法的名称
*/
private static String getSetterMethodName(String fieldName) {
String begin = fieldName.substring(0, 1).toUpperCase();
String end = fieldName.substring(1);
return "set" + begin + end;
}
/**
*
* @param fieldName 属性名称
* @return 属性在mysql里对应的名称
*/
public static String getSqlName(String fieldName) {
//定义一个可变字符串
StringBuilder str = new StringBuilder();
char c;
for (int i = 0, len = fieldName.length(); i < len;i++) {
// 找到大写字符
c = fieldName.charAt(i);
if (c >= 'A' && c <= 'Z') {
//添加‘_’并把大写字符转换为小写字符添加
str.append("_").append((c+"").toLowerCase());
}
else {
str.append(c);
}
}
return str.toString();
}