jdbc: obtenga el nombre de tipo SQL de java.sql.Type código
jython (7)
Tengo una matriz con nombres de campo y códigos de tipo jdbc. (Esos códigos int que puedes encontrar en
http://download.oracle.com/javase/1.4.2/docs/api/constant-values.html#java.sql.Types.BIT
Yo uso un controlador de nivel 4.
No puedo averiguar cómo pedirle al controlador los nombres correspondientes al tipo de SQL (DDL). Sería útil en jdbc y en dialectos nativos.
yo tengo
(CustomerId, 1) (CustomerName, -8)
y yo quiero
(customerId, INT) (customerId, VARCHAR (200))
¿Dónde puedo encontrar funciones que me ayuden con eso? Estoy usando jdbc en jython a través de zxJDBC, así que puedo usar todas las funciones de Java API 2.0 de java y python.
Java 8 y JDBCType
posteriores: JDBCType
y SQLType
Con las mejoras en las API, a partir de Java 8 y JDBC 4.2 , tenemos JDBCType
y SQLType
, y con el mismo espíritu que algunos de los otros ejemplos se pueden usar de la siguiente manera:
String typeName = JDBCType.valueOf(-5).getName();
Pero, por supuesto, ¿por qué usar los tipos numéricos para empezar? Haga un hábito y cambie de numérico a las constantes de enum
definidas en JDBCType
:
String typeName = JDBCType.BIGINT.getName();
et voilà!
Sin embargo, eso podría no ser suficiente para tener algo lo suficientemente bueno para usar en un DDL ... es posible que necesite implementar una traducción específica del proveedor. Como ejemplo, es posible que deba considerar la posibilidad de traducir VARCHAR
a VARCHAR2
en el caso de Oracle.
Necesita el objeto ResultSetMetaData
de su ResultSet
actual. Puedes obtenerlo con getMetaData()
. Iterar sobre las columnas y llamar a la columna foreach el método
de su ResultSetMetaData
.
i
representa el número de columna (comenzando por 1).
Para responder específicamente "Obtenga el nombre de tipo SQL de java.sql.Type código", si está utilizando una versión de java que puede hacer reflexión, aquí hay un pequeño método de utilidad que hace prácticamente lo mismo:
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;
}
Añadir import java.lang.reflect.Field;
a sus declaraciones de importación. Una vez que tenga eso en su lugar, simplemente utilícelo de la siguiente manera:
...
Map<Integer, String> jdbcMappings = getAllJdbcTypeNames();
String typeName = jdbcMappings.get(-5); // now that will return BIGINT
...
Parece que estás usando algunos métodos de metadatos JDBC que no has publicado. Creo que lo que está viendo es el nombre de la columna junto con la constante de tipo JDBC a partir de la cual puede derivar el tipo de columna. Eche un vistazo a la API java.sql para leer más sobre cómo obtener más metadatos.
Spring tiene un útil ayudante Enum llamado JdbcTypesEnum
, pero es bastante extraño, ya que esto no es parte de JDBC propiamente dicho. Sin embargo, en lugar de usar
rs = connection.getMetaData().getColumns();
...
int dataType = rs.getInt("DATA_TYPE");
yo usaría
String typeName = rs.getString("TYPE_NAME");
Al recuperar el tipo de columna. Por ejemplo, al inspeccionar una tabla de base de datos H2 con un tipo especial VARCHAR_IGNORECASE
o UUID
:
dataType vs. typeName
UUID: -2=BINARY vs. "UUID"
VARCHAR_IGNORECASE: 12=VARCHAR vs. "VARCHAR_IGNORECASE"
Pero tenga en cuenta que no puede cubrir el rango de tipo de la cadena para todas las bases de datos, en este caso, el int sería algo más práctico (pero después de todo no es un tipo Enum cerrado).
Apache DdlUtils Library tiene una clase de conveniencia para esto: https://db.apache.org/ddlutils/api/org/apache/ddlutils/model/TypeMap.html
String typeName = TypeMap.getJdbcTypeName(typeCode)
La biblioteca también le ayuda con otras necesidades de DDL, pero parece que últimamente no recibe mucha atención.
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 "?";
}