【问题标题】:jdbc: Get the SQL Type Name from java.sql.Type codejdbc:从 java.sql.Type 代码中获取 SQL 类型名称
【发布时间】:2011-09-20 05:38:57
【问题描述】:

我有一个包含字段名称和 jdbc 类型代码的数组。 (您可以在

中找到的那些 int 代码

http://download.oracle.com/javase/1.4.2/docs/api/constant-values.html#java.sql.Types.BIT

我使用的是 4 级驱动程序。

我不知道如何向驱动程序询问相应的 SQL (DDL) 类型名称。 它在 jdbc 和本地方言中很有用。

我有
(客户 ID,1) (客户名称,-8)

我想要

(customerId, INT) (customerId, VARCHAR(200))

在哪里可以找到对我有帮助的函数? 我通过 zxJDBC 在 jython 中使用 jdbc, 所以我可以使用所有 java 和 python DB API 2.0 功能。

【问题讨论】:

  • 除非您仍在使用 Java 1.4,否则我建议您使用 Javadocs for Java 6(或您正在使用的版本)
  • 在 Java 8 及更高版本(JDBC 4.2 及更高版本)中发生了变化。请参阅Answer by YoYo。

标签: java jdbc jython


【解决方案1】:

我也在搜索 SqlType,我在这个源代码中找到了它
http://www.docjar.com/html/api/java/sql/Types.java.html

【讨论】:

    【解决方案2】:

    Java 8 及更高版本:JDBCType & SQLType

    随着 API 的改进,从 Java 8 和 JDBC 4.2 开始,我们有了 JDBCType 和 SQLType,并且本着与其他一些示例相同的精神,可以简单地使用如下:

    String typeName = JDBCType.valueOf(-5).getName();
    

    当然,为什么要使用数字类型开头。养成习惯,从数字切换到JDBCType 中定义的enum 常量:

    String typeName = JDBCType.BIGINT.getName();
    

    瞧!

    但是,这可能不足以在 DDL 中使用足够好的东西……您可能需要实现供应商特定的翻译。例如,对于 Oracle,您可能需要考虑将 VARCHAR 转换为 VARCHAR2。

    【讨论】:

    • 这应该是答案。只是为了澄清上面关于 Oracle 的答案,例如 - 对于 VARCHAR2 类型的列,您将获得 VARCHAR 或对于 NUMBER,您将获得 NUMERIC 或对于 DATE,您将获得 TIMESTAMP
    【解决方案3】:

    您似乎正在使用一些尚未发布的 JDBC 元数据方法。我相信您所看到的是列的名称以及 JDBC type constant,您可以从中派生列类型。查看java.sql API 了解更多关于如何获取更多元数据的信息。

    【讨论】:

    • 问题中其实提到了Types类型。
    • "404 很抱歉,该页面不存在或不再可用。"这就是为什么用链接引用相关部分会得到更好的答案......
    • 这不是答案——只是重申存在问题。正确的答案将指向用户将 Types.INTEGER 等常量转换为字符串“INTEGER”的位置。
    【解决方案4】:

    您需要当前ResultSet 的ResultSetMetaData 对象。您可以通过getMetaData() 获得它。遍历列并调用 foreach 列的方法

    1. getColumnType(i)
    2. getColumnClassName(i)
    3. getColumnTypeName(i)

    你的ResultSetMetaData。

    i代表列号(从1开始)。

    【讨论】:

      【解决方案5】:

      Apache DdlUtils Library 有一个方便的类: https://db.apache.org/ddlutils/api/org/apache/ddlutils/model/TypeMap.html

      String typeName = TypeMap.getJdbcTypeName(typeCode)
      

      该库还可以帮助您满足其他 DDL 需求,但最近似乎没有得到太多关注。

      【讨论】:

        【解决方案6】:

        Spring 有一个方便的帮助器 Enum,称为 JdbcTypesEnum,但确实很奇怪,这不是 JDBC 的一部分。但是,而不是使用

        rs = connection.getMetaData().getColumns();
        ...
        int dataType = rs.getInt("DATA_TYPE");
        

        我会用

        String typeName = rs.getString("TYPE_NAME");
        

        在检索列类型时。例如,当检查具有特殊 VARCHAR_IGNORECASE 或 UUID 类型的 H2 database 表时:

                            dataType   vs. typeName
        UUID:               -2=BINARY  vs. "UUID"
        VARCHAR_IGNORECASE: 12=VARCHAR vs. "VARCHAR_IGNORECASE"
        

        但请注意,您不能涵盖所有数据库的字符串类型范围,在这种情况下,int 会更方便一些(但它毕竟不是封闭的 Enum 类型)。

        【讨论】:

          【解决方案7】:

          要专门回答“从 java.sql.Type 代码获取 SQL 类型名称”,如果您使用的是可以进行反射的 java 版本,这里有一个几乎可以做同样事情的小实用方法:

          public Map<Integer, String> getAllJdbcTypeNames() {
          
              Map<Integer, String> result = new HashMap<Integer, String>();
          
              for (Field field : Types.class.getFields()) {
                  result.put((Integer)field.get(null), field.getName());
              }
          
              return result;
          }
          

          将import java.lang.reflect.Field; 添加到您的导入声明中。一旦你有了它,只需按如下方式使用它:

          ...
          Map<Integer, String> jdbcMappings = getAllJdbcTypeNames();
          
          String typeName = jdbcMappings.get(-5); // now that will return BIGINT
          ...
          

          【讨论】:

          • 非常好。如果有人需要,我为 scala 调整了这个: import scala.collection.JavaConverters.asScalaBufferConverter; val sqlTypes = classOf[java.sql.Types].getFields.toList.map(x => (x.get(null).asInstanceOf[Int], x.getName())).toMap
          • 在 2017 年,公认的答案应该是 YoYo 的,但我也赞成这个答案的创造力。
          【解决方案8】:
          public static String getSqlTypeName(int type) {
              switch (type) {
              case Types.BIT:
                  return "BIT";
              case Types.TINYINT:
                  return "TINYINT";
              case Types.SMALLINT:
                  return "SMALLINT";
              case Types.INTEGER:
                  return "INTEGER";
              case Types.BIGINT:
                  return "BIGINT";
              case Types.FLOAT:
                  return "FLOAT";
              case Types.REAL:
                  return "REAL";
              case Types.DOUBLE:
                  return "DOUBLE";
              case Types.NUMERIC:
                  return "NUMERIC";
              case Types.DECIMAL:
                  return "DECIMAL";
              case Types.CHAR:
                  return "CHAR";
              case Types.VARCHAR:
                  return "VARCHAR";
              case Types.LONGVARCHAR:
                  return "LONGVARCHAR";
              case Types.DATE:
                  return "DATE";
              case Types.TIME:
                  return "TIME";
              case Types.TIMESTAMP:
                  return "TIMESTAMP";
              case Types.BINARY:
                  return "BINARY";
              case Types.VARBINARY:
                  return "VARBINARY";
              case Types.LONGVARBINARY:
                  return "LONGVARBINARY";
              case Types.NULL:
                  return "NULL";
              case Types.OTHER:
                  return "OTHER";
              case Types.JAVA_OBJECT:
                  return "JAVA_OBJECT";
              case Types.DISTINCT:
                  return "DISTINCT";
              case Types.STRUCT:
                  return "STRUCT";
              case Types.ARRAY:
                  return "ARRAY";
              case Types.BLOB:
                  return "BLOB";
              case Types.CLOB:
                  return "CLOB";
              case Types.REF:
                  return "REF";
              case Types.DATALINK:
                  return "DATALINK";
              case Types.BOOLEAN:
                  return "BOOLEAN";
              case Types.ROWID:
                  return "ROWID";
              case Types.NCHAR:
                  return "NCHAR";
              case Types.NVARCHAR:
                  return "NVARCHAR";
              case Types.LONGNVARCHAR:
                  return "LONGNVARCHAR";
              case Types.NCLOB:
                  return "NCLOB";
              case Types.SQLXML:
                  return "SQLXML";
              }
          
              return "?";
          }
          

          【讨论】:

          • 现在已经过时了。此功能已在实现SQLType 的新JDBCType 枚举中为您编码,如sibling Answer by YoYo 中所述。
          • 顺便说一句,结果可能用于创建准备好的语句,返回“?”可能会导致意外引入准备好的语句参数。最好抛出 IllegalArgumentException。
          猜你喜欢
          • 1970-01-01
          • 2015-05-09
          • 2017-04-25
          • 2011-02-04
          • 1970-01-01
          • 2018-06-01
          • 1970-01-01
          • 2016-06-11
          • 1970-01-01
          相关资源
          最近更新 更多