当前位置: 首页 > 知识库问答 >
问题:

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

子车凌龙
2023-03-14

使用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的方法,该方法接受列参数和类型映射参数。此类型映射仅用于UDT(用户定义的类型)。我需要这个功能应用到基本的SQL类型。我知道我可以使用switch/case语句来实现这个问题的解决方案,但是我正在努力避免这样做。这可能吗?

编辑

我应该提到我在1.6Java。看起来这可能已经在1.7中解决了。感谢JB Nizet的参考。

共有2个答案

谷泳
2023-03-14

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是所需的类型,然后制作了调用Class1中getCol列方法的特定于类型的方法:

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;
  }
}
况浩邈
2023-03-14

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

 类似资料:
  • 问题内容: 我正在寻找一个表的链接,该表包含SQL类型(java.sql.Types)与Java类型之间的映射。 你知道我在哪里可以找到吗? 问题答案: 该 JDBC 4.x的规范 ,通过提供JSR 221 ,提供在标题为附录B中该信息 数据类型转换表 。 请参阅包含从Java对象类型到JDBC类型的映射的表。当调用JDBC API的不同方法时,将有不同的表用于映射。例如,在方法期间使用的映射存在

  • 问题内容: 我正在使用Java 8的可完成的Future,并且希望能够处理将来抛出的异常并将其转换为其他异常。 一旦发生异常,我尝试过的所有复合材料似乎都会短路。 例如,使用scala future,我可以执行以下操作: 并且我希望能够在将来的Java复合块中模仿它。这可能吗? 问题答案: 您可以使用。例如 如果完成并带有异常,则将完成并带有潜在转换的异常。否则,它将具有相同的成功结果值。 关于我

  • 问题内容: 我需要将obj 映射到一个类及其中的数组,并且它也应该具有所有子级数据。(也嵌套数组列表),我需要再次将更新的数据列表转换为 我的json字符串是 问题答案: 首先, 您需要创建要在其中映射JSON的类。 幸运的是,有一个网站,可以为你做它在这里 其次,您可以使用Google Gson库进行轻松映射 1.添加 依赖项 。 2.从您的对象到JSON。 3.从JSON到object。 有关

  • 问题内容: 我有一个Postgres表,其中包含type列。在JDBC代码中,我使用了String数组,但是有一个异常告诉我这两个不匹配。如果这些类型之间没有映射,您可以为字符串数组建议Postgres类型吗? 这是代码: 问题答案: 要了解多维PostgreSQL数组类型,请考虑手册中的以下引号: 当前实现也不执行声明的维数。无论大小或维数如何,特定元素类型的数组都被认为是同一类型。因此,仅声明

  • 问题内容: 背景 将列数据类型映射到其对应的Java类。 问题 查询从数据库返回元信息: 例如,此查询返回(自引用): 其中“ dictionary”是架构名称,“ resource_bundle”是object_name,“ column_name”是column_name。 要做类似的事情会很棒: 并返回以下查询: 然后使用JDBC发现已映射到。 问题 在PostgreSQL中,如何给定架构名

  • 我正在spring应用程序中使用graphql java工具。我有这样一个实体: 在GraphQL模式中,我想要一个不同的类型: 当然,由于模式解析异常,启动此操作将不起作用。所以我认为在模式解析之间放置一些东西来实现从到的映射是可能的。 这有可能吗? 编辑 抱歉,它不会给出架构解析异常。它将简单地将字节放入字符串中。但是我不能用这个字符串来创建图像。 澄清 对不起,我想我的问题还不够清楚。我不需