web-dev-qa-db-ja.com

jdbc:Java.sql.TypeコードからSQLタイプ名を取得する

フィールド名と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)(CustomerName、-8)

そして私は欲しい

(customerId、INT)(customerId、VARCHAR(200))

それを助ける関数はどこにありますか?私はzyJonでzxJDBCを介してjdbcを使用しているため、すべてのJavaおよびpython DB API 2.0機能を使用できます。

31
AndreasT

投稿していないJDBCメタデータメソッドを使用しているようです。私はあなたが見ているものはJDBCと一緒に列の名前であると信じています type constant そこから列タイプを導出することができます。 Java.sql API を見て、より多くのメタデータを取得する方法を読んでください。

2
joostschouten

「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
...
35

Java 8以降:JDBCTypeSQLType

Java 8および JDBC 4.2 の時点でAPIが改善され、 JDBCType および SQLType 、そして他のいくつかの例と同じ精神で、次のように単純に使用できます:

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

しかし、もちろん、最初に数値型を使用する理由。習慣をつけて、数値からenumで定義されているJDBCType定数に切り替えます。

String typeName = JDBCType.BIGINT.getName();

etvoilà!

ただし、DDLで使用するのに十分なものを用意するには十分ではない場合があります。ベンダー固有の翻訳を実装する必要がある場合があります。たとえば、Oracleの場合、VARCHARVARCHAR2に変換することを検討する必要があるかもしれません。

28
YoYo
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 "?";
}
12
Gill

現在のResultSetMetaDataの-​​ ResultSet オブジェクトが必要です。 getMetaData()で取得できます。列を反復処理し、foreach列にメソッドを呼び出します

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

あなたのResultSetMetaDataの。

iは、列番号を表します(1から開始)。

8
alexvetter

Apache DdlUtils Library には、このための便利なクラスがあります。 https://db.Apache.org/ddlutils/api/org/Apache/ddlutils/model/TypeMap.html

String typeName = TypeMap.getJdbcTypeName(typeCode)

ライブラリは他のDDLニーズにも役立ちますが、最近あまり注目されていないようです。

1
konfusius

Springには JdbcTypesEnum と呼ばれる便利なヘルパーEnumがありますが、これはJDBC本体の一部ではないので、かなり奇妙です。ただし、代わりに

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

私は使うだろう

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

列タイプを取得するとき。たとえば、 H2データベース テーブルを特別な VARCHAR_IGNORECASE またはUUIDタイプ:

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

ただし、すべてのデータベースの文字列の型範囲をカバーすることはできないことに注意してください。この場合、intの方が多少便利です(しかし、結局、閉じた列挙型ではありません)。

1
eckes