JDBC获取数据表中的内容创建对象并存到集合中(无对应实体类——使用匿名内部类)

我们打算拿到数据库中某一数据表中的内容,但我们并不知道该数据表的列名和行数时怎么办?

使用元数据,获取数据表的行数(实例数)、列数(属性的个数)、列名(属性名)

我们拿到数据表中的内容,并根据每一行的内容创建一个对象,但我们并不知道需要什么类型的对象。

1、使用泛型 2、使用反射创建对象,因为需要在运行中获取泛型的具体类型,然后创建此类型的对象

没有创建对应的实体类时该怎么办?

使用匿名内部类,或,每一个属性:值作为Map的元素存储,有多少值Map中就有多少元素,再用List存储Map

其中getConnection()和closeResource()方法时提供好的获取数据库链接和关闭资源的方法,无关紧要,不做展示。
具体实现详见代码及注释,注释详见上一篇博客

public class GetCollection {
    public static <T> List<T> method(Class<T> clazz) throws Exception {
        List<T> list = new ArrayList<>();
        //定义sql取别名,则匿名内部类中的成员变量名需要和别名一致
        String sql = "SELECT did,AVG(salary) avg,MAX(salary) max FROM t_employee GROUP BY did;";
        Connection connection = GetConnection.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        ResultSet resultSet = preparedStatement.executeQuery();
        ResultSetMetaData metaData = resultSet.getMetaData();
        int count = metaData.getColumnCount();
        while (resultSet.next()) {
            T t = clazz.newInstance();
            for (int i = 1; i <= count; i++) {
                Object object = resultSet.getObject(i);
                String columnLabel = metaData.getColumnLabel(i);
                Field declaredField = clazz.getDeclaredField(columnLabel);
                declaredField.set(t, object);
            }
            list.add(t);
        }
        return list;
    }
}

class Demo {
    public static void main(String[] args) throws Exception {
        List method = GetCollection.method(new Object() {
            int did;
            double avg;
            double max;

            @Override
            public String toString() {
                return "$classname{" +
                        "did=" + did +
                        ", avg=" + avg +
                        ", max=" + max +
                        '}';
            }
        }.getClass());
        method.forEach(System.out::println);
    }
}

输出结果:
$classname{did=1, avg=19945.471538461537, max=130990.0}
$classname{did=2, avg=11708.5, max=18978.0}
$classname{did=3, avg=70223.0, max=130990.0}
$classname{did=4, avg=12332.0, max=16788.0}
$classname{did=5, avg=11065.5, max=15099.0}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的Y同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值