我有一个包含字段名称和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功能。
答案 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)
JDBCType
&amp; SQLType
随着API的改进,从Java 8和JDBC 4.2开始,我们有JDBCType
和SQLType
,并且与其他一些示例一样,可以简单地用作如下:
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列方法
ResultSetMetaData
getColumnType(i)
getColumnClassName(i)
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 database或UUID
类型检查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