java jdbc jython

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.



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).



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