当前位置: 首页 > 面试题库 >

将数据库类型映射到具体的Java类

洪鸿
2023-03-14
问题内容

背景

将列数据类型映射到其对应的Java类。

问题

查询从数据库返回元信息:

SELECT
  rb.object_schema,
  rb.object_name,
  rb.column_name
FROM
  dictionary.resource_bundle rb

例如,此查询返回(自引用):

dictionary, resource_bundle, column_name

其中“ dictionary”是架构名称,“ resource_bundle”是object_name,“
column_name”是column_name。

要做类似的事情会很棒:

SELECT
  rb.object_schema,
  rb.object_name,
  rb.column_name,
  rb.column_type
FROM
  dictionary.resource_bundle rb

并返回以下查询:

dictionary, resource_bundle, column_name, varchar

然后使用JDBC发现varchar已映射到java.lang.String

问题

  1. 在PostgreSQL中,如何给定架构名称,对象名称(保证为表或视图)和列名称,如何确定用于存储数据的类型?
  2. 以与数据库无关的方式(利用JDBC),如何确定数据库用于给定数据类型的映射?

问题答案:

答案比使用getMetaData方法要复杂得多,因为方法返回的整数类型getMetaData和完整的类名没有直接映射。该解决方案需要两段代码:

  • 实现一种获取java.sql.Types常量整数值的方法。
  • 创建一个将该值转换为类名的方法。

Java类型方法

以下方法检索元信息:

  public String getJavaType( String schema, String object, String column )
    throws Exception {
    String fullName = schema + '.' + object + '.' + column;
    DatabaseMetaData metaData = getConnection().getMetaData();
    ResultSet columnMeta = metaData.getColumns( null, schema, object, column );
    String javaType = null;

    if( columnMeta.first() ) {
      int dataType = columnMeta.getInt( "DATA_TYPE" );
      javaType = SQLTypeMap.convert( dataType );
    }
    else {
      throw new Exception( "Unknown database column " + fullName + '.' );
    }

    return javaType;
  }

静态转换方法

常量整数值必须转换为类名。这可以通过以下方式完成:

import java.sql.Types;

/**
 * Converts database types to Java class types.
 */
public class SQLTypeMap {
    /**
     * Translates a data type from an integer (java.sql.Types value) to a string
     * that represents the corresponding class.
     * 
     * @param type
     *            The java.sql.Types value to convert to its corresponding class.
     * @return The class that corresponds to the given java.sql.Types
     *         value, or Object.class if the type has no known mapping.
     */
    public static Class<?> toClass(int type) {
        Class<?> result = Object.class;

        switch (type) {
            case Types.CHAR:
            case Types.VARCHAR:
            case Types.LONGVARCHAR:
                result = String.class;
                break;

            case Types.NUMERIC:
            case Types.DECIMAL:
                result = java.math.BigDecimal.class;
                break;

            case Types.BIT:
                result = Boolean.class;
                break;

            case Types.TINYINT:
                result = Byte.class;
                break;

            case Types.SMALLINT:
                result = Short.class;
                break;

            case Types.INTEGER:
                result = Integer.class;
                break;

            case Types.BIGINT:
                result = Long.class;
                break;

            case Types.REAL:
            case Types.FLOAT:
                result = Float.class;
                break;

            case Types.DOUBLE:
                result = Double.class;
                break;

            case Types.BINARY:
            case Types.VARBINARY:
            case Types.LONGVARBINARY:
                result = Byte[].class;
                break;

            case Types.DATE:
                result = java.sql.Date.class;
                break;

            case Types.TIME:
                result = java.sql.Time.class;
                break;

            case Types.TIMESTAMP:
                result = java.sql.Timestamp.class;
                break;
        }

        return result;
    }
}

注意,不同的数据库在映射上可以有不同的变化。



 类似资料:
  • 给定一组C++概念: 但是样板文件穿过屋顶:)

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

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

  • 问题内容: 有没有一种方法可以将JSON数据对象映射到可观察数组,然后又将可观察数组的每一项初始化为特定类型的视图模型? 我已经在这里查看了所有敲除的文档以及敲除和映射示例,但找不到适合我所追求的答案。 因此,我有以下JSON数据: 我有以下视图模型: 使用给定的数据结构并使用基因剔除的映射插件,是否有可能使生成的StateViewModel包含由2个CityViewModel填充的observa

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

  • 问题内容: 我在这里有一个复杂的json 我正在尝试在我的模型类“ ChromeJsonModel”中映射它,例如: 但是我收到以下错误。 我为什么会在哪里出问题? 问题答案: 您拥有非常复杂的有效负载,其中相同的属性可能具有一个或多个对象。默认情况下不会处理这种情况,因此我们需要为此类属性实现自定义反序列化器。下面我创建了代表您的有效负载的简单模型: 如您所见,它是-es属性。让我们为这些属性实