Java通过反射根据结果集ResultSet生成对应的JavaBean对象

本文介绍了一种利用反射机制自动将数据库查询结果集(ResultSet)转换为JavaBean对象的方法,简化了数据处理流程,提高了代码效率。

在写读数据库时由于JavaBean的属性太多,依次调用setter方法比较麻烦,动手写了一个工具类,通过反射实现自动根据查询的结果集(ResultSet)的一行结果封装成相应的JavaBean对象。

当然,你的JavaBean需要与数据库中的表对应。代码如下:

码云:https://gitee.com/ren_hq/codes/p7wr2kin90hymd4casbv520

public class ResultSetToBean {
    /**
     * 根据一个 ResultSet 结果集(当前行)生一个成相应的数据实体
     * @param resultSet 结果集
     * @param objectClass 数据实体类型,一个 JavaBean 如:  User
     * @param <T>
     * @return 封装好的 Bean 对象
     * @throws SQLException
     */
    public static<T> Object copy(ResultSet resultSet, Class<T> objectClass)  {
        //通过反射创建 objectClass 对象
        Object obj = null;
        try {
            obj = objectClass.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        //objectClass 中所有属性
        Field[] fields = getAllFieldName(objectClass);
        try {
            for (Field f : fields) {
                //取出属性名称
                String fieldName = f.toString().substring(f.toString().lastIndexOf(".")+1);
                //判断int类型
                if (f.toString().indexOf("int") == -1) {
                    invokeSet(obj, fieldName, resultSet.getString(fieldName));
                } else {
                    invokeSet(obj, fieldName, resultSet.getInt(fieldName));
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return obj;
    }

    /**
     * 根据属性名获取get方法
     * @param objectClass
     * @param fieldName 属性名
     * @return
     */
    @SuppressWarnings("unchecked")
    private static Method getSetMethod(Class objectClass, String fieldName) {
        try {
            Class[] parameterTypes = new Class[1];
            Field field = objectClass.getDeclaredField(fieldName);
            parameterTypes[0] = field.getType();
            StringBuffer sb = new StringBuffer();
            sb.append("set");
            sb.append(fieldName.substring(0, 1).toUpperCase());
            sb.append(fieldName.substring(1));
            Method method = objectClass.getMethod(sb.toString(), parameterTypes);
            return method;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取所有属性
     * @param objectClass
     * @return Field[]
     */
    private static Field[] getAllFieldName(Class objectClass) {
        Field[] fields = objectClass.getDeclaredFields();
        for(Field f:fields){
            f.setAccessible(true);
        }
        return fields;
    }

    /**
     * 根据属性名执行相应set方法
     * @param o 执行对象
     * @param fieldName 属性名
     * @param value 属性值
     */
    private static void invokeSet(Object o, String fieldName, Object value) {
        Method method = getSetMethod(o.getClass(), fieldName);
        try {
            method.invoke(o, new Object[] { value });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

测试:

 

if (resultSet.first()) {
   //ResultSetToBean.copy() 通过反射根据给定的结果集当前行与Bean类型创建一个Bean
   user = (User) ResultSetToBean.copy(resultSet, User.class);
}
else {
   //未查到
   user = null;
}

 

转载请标注出处:https://blog.csdn.net/qq_37499840/article/details/89577293

参考:

1、https://dh189.iteye.com/blog/722573

2、https://blog.csdn.net/geekwangminli/article/details/10432357

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值