フィールド名と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機能を使用できます。
投稿していないJDBCメタデータメソッドを使用しているようです。私はあなたが見ているものはJDBCと一緒に列の名前であると信じています type constant そこから列タイプを導出することができます。 Java.sql API を見て、より多くのメタデータを取得する方法を読んでください。
「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
...
JDBCType
&SQLType
Java 8および JDBC 4.2 の時点でAPIが改善され、 JDBCType
および SQLType
、そして他のいくつかの例と同じ精神で、次のように単純に使用できます:
String typeName = JDBCType.valueOf(-5).getName();
しかし、もちろん、最初に数値型を使用する理由。習慣をつけて、数値からenum
で定義されているJDBCType
定数に切り替えます。
String typeName = JDBCType.BIGINT.getName();
etvoilà!
ただし、DDLで使用するのに十分なものを用意するには十分ではない場合があります。ベンダー固有の翻訳を実装する必要がある場合があります。たとえば、Oracleの場合、VARCHAR
をVARCHAR2
に変換することを検討する必要があるかもしれません。
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 "?";
}
現在のResultSetMetaData
の- ResultSet
オブジェクトが必要です。 getMetaData()
で取得できます。列を反復処理し、foreach列にメソッドを呼び出します
あなたのResultSetMetaData
の。
i
は、列番号を表します(1から開始)。
Apache DdlUtils Library には、このための便利なクラスがあります。 https://db.Apache.org/ddlutils/api/org/Apache/ddlutils/model/TypeMap.html
String typeName = TypeMap.getJdbcTypeName(typeCode)
ライブラリは他のDDLニーズにも役立ちますが、最近あまり注目されていないようです。
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の方が多少便利です(しかし、結局、閉じた列挙型ではありません)。