Ejemplos java y C/linux

Tutoriales

Enlaces

Licencia

Creative Commons License
Esta obra está bajo una licencia de Creative Commons.
Para reconocer la autoría debes poner el enlace http://www.chuidiang.org

DataBaseMetaData y ResultSetMetaData con java y MySQL

En ocasiones necesitamos hacer aplicaciones en Java que trabajen contra una base de datos desconocida, de la que no sabemos qué tablas tiene, ni qué columnas cada tabla. Es, por ejemplo, el caso de aplicaciones que permiten visualizar el contenido (o incluso modificar el mismo) de una base de datos cualquiera de una forma genérica. En este tipo de aplicaciones, a veces también dejamos que el usuario escriba sus propias sentencias SELECT, que nuestro programa luego ejecuta y debe mostrar los resultados.

En java, las clases DataBaseMetaData y ResultSetMetaData permiten, respectivamente, analizar la estructura de una base de datos (qué tablas tiene, que columnas cada tabla, de qué tipos, etc) o de un ResultSet de una consulta, para averiguar cuántas columnas tiene dicho ResulSet, de qué columnas de base de datos proceden, de qué tipo son, etc.

En este artículo vamos a ver un ejemplo sencillo de cómo usar ambas clases. No vamos a detallar toda la posible información que se puede obtener a través de estas dos clases ni a ser demasiado exhaustivos. Sólo es un ejemplo sencillo para comprender lo básico.

Tienes los fuentes completos de este ejemplo en EjemploDataBaseMetaData.java y EjemploResultSetMetaData.java.

DataBaseMetaData

Para ver qué catálogos, esquemas, tablas, tipos de tablas, columnas de las tablas y demás de una base de datos, tenemos la clase DataBaseMetaData. Una vez establecida la conexión, podemos obtener la instancia correspondiente de dicha clase con el método getDataBaseMetaData() de la Connection,

Class.forName("com.mysql.jdbc.Driver");
Connection conexion = DriverManager.getConnection(
   "jdbc:mysql://localhost/hibernate", "usuario", "password");

DataBaseMetaData metaDatos = conexion.getMetaData();

donde "jdbc:mysql://localhost/hibernate" es la cadena de conexión con la base de datos y "usuario" y "password" son el nombre y la password de un usuario válidos de la base de datos. En metaDatos tendremos la instancia de DataBaseMetaData.

Mirando en la API de DataBaseMetaData veremos que hay montones de métodos para interrogar a la base de datos sobre montones de cosas. Vamos aquí a limitarnos a preguntarle por las tablas que tiene. Para ello, hacemos el siguiente trozo de código:

ResultSet rs = metaDatos.getTables(null, null, "%", null);

donde los cuatro parámetros que hemos pasado son:

En el ResultSet obtenido tendremos una fila por cada tabla que cumpla los patrones que hemos puesto en los parámetros. Las columnas de ese ResultSet podemos verlas en la API del método DataBaseMetaData.getTables(). En nuestro ejemplo, para saber el catálogo y nombre de la tabla, debemos fijarnos en las columnas 1 y 3. El código para escribir en pantalla las tablas, sería

while (rs.next()) {
   // El contenido de cada columna del ResultSet se puede ver
   // en la API, en el metodo getTables() de DataBaseMetaData.
   // La columna 1 es TABLE_CAT
   // y la 3 es TABLE_NAME

   String catalogo = rs.getString(1);
   String tabla = rs.getString(3);
   System.out.println("TABLA=" + catalogo + "." + tabla);
}

Un posible siguiente paso sería, para cada tabla, obtener las columnas que la componen: su nombre y tipo. Para ello, podemos usar el método getColumns() de DataBaseMetaData.

ResultSet rs = metaDatos.getColumns(catalogo, null, tabla, null);

en el que los parámetros de la llamada son:

El contenido del ResultSet será una fila por cada columna de la tabla. Las columnas del ResultSet se pueden ver en la API del método DataBaseMetaData.getColumns(). En nuestro caso, si queremos el nombre de la columna y el nombre del tipo de dato de la columna, debemos hacer caso a las columnas 4 y 6 del ResultSet.

ResultSet rs = metaDatos.getColumns(catalogo, null, tabla, null);
while (rs.next()) {
   // El contenido de cada columna del ResultSet se puede ver en
   // la API de java, en el metodo getColumns() de DataBaseMetaData
   // La 4 corresponde al TABLE_NAME
   // y la 6 al TYPE_NAME
   String nombreColumna = rs.getString(4);
   String tipoColumna = rs.getString(6);
   System.out.println(" COLUMNA, nombre=" + nombreColumna
      + " tipo = " + tipoColumna);
}

Por supuesto, hay muchos más métodos en DataBaseMetaData para obtener muchas más cosas sobre la base de datos, pero como esto es un tutorial simple, nos conformamos con esta pequeña tontería.

ResultSetMetaData

Si no tenemos muy claro qué campos nos devuelve una consulta (quizás porque la consulta la ha escrito directamente el usuario desde una caja de texto), o queremos hacer algún trozo de código general capaz, por ejemplo, de meter cualquier ResultSet en un JTable, nos puede resultar de utilidad la clase ResultSetMetaData.

Pero como este es un ejemplo muy tonto, hagamos una consulta acorde al ejemplo, algo tan tonto como

Statement st = conexion.createStatement();
ResultSet rs = st.executeQuery("select * from person");

A partir del ResultSet, podemos obtener el ResultSetMetaData, al que podremos interrogar sobre lo que queramos.

ResultSetMetaData rsmd = rs.getMetaData();

Vamos a preguntarle, primero, cuántas columnas tiene el ResultSet. Y luego, en un bucle, preguntaremos por el nombre de cada columna, a qué tabla pertenece y de qué tipo es. El bucle puede ser como este

for (int i = 1; i <= numeroColumnas; i++) {
   System.out.println("columna=" + rsmd.getTableName(i) + "."
      + rsmd.getColumnName(i) + " --> "
      + rsmd.getColumnTypeName(i));
}

y podría darnos un resultado similar a éste

columna=person.PERSON_ID --> BIGINT
columna=person.age --> INT
columna=person.firstname --> VARCHAR
columna=person.lastname --> VARCHAR

Y con esto lo dejamos de momento. Puedes seguir mirando más cosas de Java.

Estadísticas y comentarios

Numero de visitas desde el 4 Feb 2007: