是否可以将基本JDBCSQL类型映射到Java类?

是否可以将基本JDBCSQL类型映射到Java类?,java,jdbc,Java,Jdbc,使用getObject方法从ResultSet对象检索列时,JDBC驱动程序将选择该类。我正在寻找一种方法来选择在运行时检索列的类 在下面的示例中,类型Class1是使用变量T作为整数创建的 Class Class1<T> { public T getColumn(DataSource ds) { T value = null; Connection con = null; try { con = ds.getConnection

使用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;
  }
}
Class1类
{
公共T getColumn(数据源ds)
{
T值=null;
连接con=null;
尝试
{
con=ds.getConnection();
语句st=con.createStatement();
结果集rs=st.executeQuery(“从双精度中选择1”);
rs.next();
Object o=rs.getObject(1);//我想要一个整数,但创建了一个BigDecimal!
value=(T)o;//这里是ClassCastException!
rs.close();
圣克洛斯();
}
最后
{
如果(con!=null){con.close();}
}
返回i;
}
}
ResultSet类提供了一个名为getObject的方法,该方法接受列参数和类型映射参数。此类型映射仅用于UDT(用户定义的类型)。我还需要将此功能应用于基本SQL类型。我知道我可以使用switch/case语句实现一个解决方案,但我正试图避免这种情况。这可能吗

编辑


我应该提到我使用的是Java1.6。看起来这个问题在1.7中已经解决了。谢谢您的参考。

您可能需要编写自己的代码。您可能需要对接收到的数据执行强制转换。为了避免切换/大小写,您可以使用精确的ORM工具,如Hibernate,这将允许您的Pojo具有与表列相同的精确名称,并且它们会自动使用列中的数据填充Pojo。在此之后,您可以为每列编写数据转换代码。MyBatis是一个类似Hibernate的ORM工具,它将为您进行映射

JB Nizet为Java 1.7提供了答案:

对于Java的早期版本,DolphinJava是正确的。我将不得不编写自己的代码

我是如何解决的

与上面使用Class1的示例一样,我创建了扩展Class1的子类,其中T是所需的类型,然后创建了特定于类型的方法,在Class1中调用getColumn方法:

public Class1<T>
{
  public Object getColumn(DataSource ds)
  {
    Object o        = 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);
      rs.close();
      st.close();
    }
    finally
    {
      if (con != null) { con.close(); }
    }

    return o;
  }
}

Class1Integer extends Class1<Integer>
{
  public Integer getIntegerColumn()
  {
    Object o  = getColumn(datasource);
    Integer i = new Integer(o);
    return i;
  }
}
公共类1
{
公共对象getColumn(数据源ds)
{
对象o=null;
连接con=null;
尝试
{
con=ds.getConnection();
语句st=con.createStatement();
结果集rs=st.executeQuery(“从双精度中选择1”);
rs.next();
对象o=rs.getObject(1);
rs.close();
圣克洛斯();
}
最后
{
如果(con!=null){con.close();}
}
返回o;
}
}
Class1整数扩展了Class1
{
公共整数getIntegerColumn()
{
对象o=getColumn(数据源);
整数i=新整数(o);
返回i;
}
}

我想知道演员阵容(T)是如何运作的。由于类型擦除,我希望强制转换不起作用。甚至还有一个常见的解决方法:将所需类型作为类对象传递到方法中。看到没有使用更高级别的API进行数据访问的原因了吗?JB-谢谢,但我忘了提到我使用的是Java 1.6.Ben,你能更具体一点吗?你能举个例子说明为什么直到运行时才知道列类型吗?似乎您应该在编译时始终知道列的类型。