【发布时间】:2014-08-22 23:39:00
【问题描述】:
当使用 getObject 方法从 ResultSet 对象中检索列时,类由 JDBC 驱动程序选择。我正在寻找一种方法来选择在运行时检索列的类。
在下面的示例中,类型 Class1 是使用作为整数的变量 T 创建的。
Class Class1<T>
{
public T getColumn(DataSource ds)
{
T value = null;
Connection con = null;
try
{
con = ds.getConnection();
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("select 1 from dual");
rs.next();
Object o = rs.getObject(1); // I want an Integer but a BigDecimal is created!
value = (T) o; // ClassCastException here!
rs.close();
st.close();
}
finally
{
if (con != null) { con.close(); }
}
return i;
}
}
ResultSet 类提供了一个名为 getObject 的方法,该方法接受一个列参数和一个类型 Map 参数。此类型 Map 仅用于 UDT(用户定义类型)。我也需要将此功能应用于基本 SQL 类型。我知道我可以使用 switch/case 语句来解决这个问题,但我试图避免这种情况。这可能吗?
编辑
我应该提到我使用的是 Java 1.6。看起来这可能已在 1.7 中解决。感谢 JB Nizet 的参考。
【问题讨论】:
-
我想知道演员 (T) 是如何工作的。由于类型擦除,我希望演员表不起作用。甚至还有一个常见的解决方法:将所需的类型作为类对象传递给方法。见stackoverflow.com/questions/14524751/…
-
您是否有理由不使用更高级别的 API 进行数据访问?
-
JB - 谢谢,但我忘了提到我使用的是 Java 1.6.Ben,你能说得更具体点吗?
-
您能否提供一个示例,说明为什么直到运行时才知道列类型?看来您应该始终在编译时知道列的类型。