jdbc:从java.sql.Type代码中获取SQL类型名称

时间:2011-06-22 09:34:30

标签: java jdbc jython

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

中找到的那些int代码

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

我使用4级驱动程序。

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

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

我想要

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

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

8 个答案:

答案 0 :(得分:34)

要专门回答“从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
...

答案 1 :(得分:25)

Java 8及更高版本:JDBCType&amp; SQLType

随着API的改进,从Java 8和JDBC 4.2开始,我们有JDBCTypeSQLType,并且与其他一些示例一样,可以简单地用作如下:

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

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

String typeName = JDBCType.BIGINT.getName();

etvoilà!

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

答案 2 :(得分:12)

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 "?";
}

答案 3 :(得分:7)

您需要当前ResultSet的{​​{3}}对象。您可以使用getMetaData()获取它。迭代列并调用foreach列方法

  1. ResultSetMetaData
  2. getColumnType(i)
  3. getColumnClassName(i)
  4. ResultSetMetaData

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

答案 4 :(得分:3)

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

答案 5 :(得分:1)

Spring有一个方便的助手Enum叫JdbcTypesEnum,但确实很奇怪,这不是JDBC本身的一部分。但是,而不是使用

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

我会用

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

检索列类型时。例如,在使用特殊H2 databaseUUID类型检查VARCHAR_IGNORECASE表时:

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

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

答案 6 :(得分:1)

equal to有一个便利类: Apache DdlUtils Library

String typeName = TypeMap.getJdbcTypeName(typeCode)

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

答案 7 :(得分:0)

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