Java web基操 --将mysql结果集包装为特定的类对象

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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值