将ResultSet结果集通过反射转换成对象LIST集合

说明:Lz新手,通过这个练习反射。(mysql数据库)

一,简单的创建一个数据库,并给上数据。
这里写图片描述

二、
1.创建一个Emp.java 。
2.创建和 数据库中各列名一样的属性,且为private类型。
3.有一个空构造器。
4.有get/set 方法,重写toString方法,hashCode和equals方法。

三、写一个测试类。

public class TestUser {
    public static void main(String[] args) {
           //查询所有信息,输出List集合
           queryAllUserInfo();
    }

    private static void queryAllUserInfo() {
        //创建一个List集合,来装emp
        List<Emp> list=new ArrayList<>();
        //声明链接,在后面获取链接
        Connection connection=null;
        PreparedStatement preparedStatement=null;
        ResultSet resultSet=null;
        String sql="select * from t_emp";
        try {
        //通过自己写的工具类获取链接
            connection=WyUtil.createConnection();
        //获取preparedstatement   
    preparedStatement=WyUtil.createPreparedStatement(connection, sql);        
            resultSet=preparedStatement.executeQuery();
            //自己写的一个resultToList方法,把resultSet的信息转换为Emp的对象,并将对象装进List集合
            list=WyUtil.resultToList(resultSet, Emp.class);

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
        //通过工具类关闭所有链接
            WyUtil.closeAll(connection, preparedStatement, resultSet);
        }
    //输出所有对象的信息
    System.out.println(list);   
    }

   //resultToList方法
public static <T> List<T> resultToList(ResultSet resultSet, Class<T> clazz) {  
          //创建一个 T 类型的数组
        List<T> list = new ArrayList<>();
        try {
             //通过反射获取对象的实例
            T t = clazz.getConstructor().newInstance();
            //获取resultSet 的列的信息
            ResultSetMetaData metaData = resultSet.getMetaData();
            //遍历resultSet
            while (resultSet.next()) {
                  //遍历每一列
                for (int i = 0; i < metaData.getColumnCount(); i++) {
                    //获取列的名字
                    String fName = metaData.getColumnLabel(i + 1);
                    //因为列的名字和我们EMP中的属性名是一样的,所以通过列的名字获得其EMP中属性
                    Field field = clazz.getDeclaredField(fName.toLowerCase());
                    //因为属性是私有的,所有获得其对应的set 方法。set+属性名首字母大写+其他小写
                    String setName = "set" + fName.toUpperCase().substring(0, 1) + fName.substring(1).toLowerCase();
                    //因为属性的类型和set方法的参数类型一致,所以可以获得set方法
                    Method setMethod = clazz.getMethod(setName, field.getType());
                    //执行set方法,把resultSet中的值传入emp中,  再继续循环传值
                    setMethod.invoke(t, resultSet.getObject(fName));
                }
                //把赋值后的对象 加入到list集合中
                list.add(t);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        // 返回list
    return list;
    }
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值