如何从ResultSet中获取值一般?

时间:2013-06-29 18:36:19

标签: java generics jdbc resultset

我需要从ResultSet检索值,以便通过reflexion使用它们来调用构造函数。 我正在尝试使用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

1 个答案:

答案 0 :(得分:1)

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

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