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

时间:2014-08-21 20:30:19

标签: java jdbc

使用getObject方法从ResultSet对象检索列时,JDBC驱动程序会选择该类。我正在寻找一种方法来选择在运行时检索列的类。

在下面的示例中,使用变量T作为整数创建类型Class1。

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的参考。

2 个答案:

答案 0 :(得分:1)

您可能必须编写自己的代码。您可能必须执行所收到数据的转换。为了避免切换/大小写,你可以使用像Hibernate这样的精确ORM工具,这将允许你的Pojo具有类似于表列的精确名称,并且它们会自动使用列中的数据填充Pojo。在此之后,您可以为每列编写数据转换代码。像Hibernate这样的ORM工具,MyBatis会为你做映射。

答案 1 :(得分:0)

JB Nizet为Java 1.7提供了答案:http://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html#getObject-int-java.lang.Class-

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

我是如何解决的

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

中的方法
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;
  }
}