java - 一般如何从 ResultSet 中获取值?

标签 java generics jdbc resultset

我需要从 ResultSet 中检索值,以通过反射使用它们来调用构造函数。 我尝试使用 Class.cast(Object),但我总是得到一个 InvalidCastException

这是我的:

    Object[] args = new Object[count];
    Class<?>[] arr = co.getParameterTypes(); 
    for(i = 0; i<args.length; i++){

        args[i] = arr[i].cast(rs.getObject(i+1));
    }

    Object t;

    try {
        t = co.newInstance(args);
    } catch (Exception e) {
        throw new RuntimeException(e); 
    }

    return (T)t;

co 是构造函数,rs 是我已有的 ResultSet

最佳答案

即使你能让它工作,也有一个长期的维护噩梦,对象的构造函数中的参数顺序可能与 ResultSet 中的列顺序不匹配(表在 RDB 中)。例如,如果您的 Person 对象有一个采用 firstName、lastName 的构造函数,则 DB 表中列的顺序可能不匹配。它可以是 LAST_NAME、FIRST_NAME,甚至是 FIRST_NAME、SOME_COLUMN_YOU_DONT_CARE_ABOUT、LAST_NAME。

在我看到的更一般地处理这个问题的代码中,他们使用域对象(例如 Person)上的反射来获取属性名称(在我的例子中,他们查看了 setter,而不是构造函数,YMMV),然后尝试使用 ResultSet.getMetaData() 将它们与 ResultSet 列名匹配。

关于java - 一般如何从 ResultSet 中获取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17383501/

相关文章:

oracle - 使用瘦 JDBC 客户端通过 LDAP/OID 查找解决 Oracle SID 的问题

java - 尽管类在 switch block 中实例化,但它只能调用接口(interface)方法

java - 如何使用 .key 文件对 apk 进行签名?

java - Android应用程序的新闻部分

java - 将泛型类型参数标记为 Java 8 中的功能接口(interface)

c# - 尝试使用 Dapper.SimpleCRUD 插入泛型时出错

java - 在 ListView 中通过 onitemclicklistner 从 Hashmap 中删除值

Java 使用泛型类型

jdbc - 无法基于 Microsoft Azure SQL 数据库表在 Microsoft Azure Databricks 中创建表

java - 从 jdbc/postgresql 获取新创建表的列元数据