Meta datos de la base de datos

De ChuWiki
Saltar a: navegación, buscar

Contenido

Viene de ResultSet scrollable y updatable

Meta Datos

Con java es posible interrogar a la base de datos sobre qué catálogos tiene, tablas, columnas, etc, etc. Esto puede ser útil para realizar aplicaciones o librerías que trabajen contra bases de datos sin saber a priori qué tablas y columnas hay. Un ejemplo concreto es cualquier aplicación que analice una base de datos para mostrar al usuario su contenido y estructura. Otro ejemplo es una librería que permita mostrar en un JTable el resultado de una consulta cualquiera. Vamos a ver unos ejemplos de algunas de las cosas que podemos obtener.

Lo primero, como siempre, es establecer la conexión con la base de datos.

Connection conexion = DriverManager.getConnection(
   "jdbc:mysql://172.30.211.200/pruebas",
   "usuario",
   "password");

Ahora podemos pedirle a la conexión la clase que conoce los meta datos de la base de datos con el método getMetaData().

DatabaseMetaData dbmd = conexion.getMetaData();

Y es a esta clase a la que podemos interrogar sobre todo lo que queramos respecto a la base de datos. Vamos a ver tres ejemplos concretos. El primero es para obtener todos los catálogos disponibles en la base de datos, uno de ellos es el "pruebas" al que nos hemos conectado en la url de conexión.

// Catalogos
ResultSet rs = dbmd.getCatalogs();
while ( rs.next() )
{
   System.out.println(rs.getObject(1));
}

La llamada a getCatalogs() nos devuelve un ResultSet con tantas filas como catálogos haya y una sola columna (la uno), en la que se almacena el nombre de cada catálogo. Vamos ahora a pedir para un catálogo concreto las tablas que tiene

// tablas
ResultSet rs = dbmd.getTables("pruebas", null, null, null);
while ( rs.next() )
{
   // La columna 3 del resultset es el nombre de la tabla
   System.out.println(rs.getObject(3));
}

La llamada a getTables() admite cuatro parámetros que básicamente son filtros para obtener sólo las tablas que cumplan determinados requisitos. En este ejemplo, el primer parámetro es el catálogo del que queremos saber las tablas. Los demás los hemos puesto a null para que nos den todas las tablas de ese catálogo. El resultado será un ResultSet con una fila por cada tabla y hasta 10 columnas, de las cuales la número 3 es el nombre de la tabla (la que mostramos en el ejemplo). Las columnas son las que se indican en la api de java.

Para cada tabla podemos pedir también el número de columnas por medio del método getColumns(). Al igual que getTables(), admite cuatro parámetros para filtrar el tipo de columnas que nos interesa

// columnas
ResultSet rs = dbmd.getColumns("pruebas", null, "tabla_prueba", null);
while ( rs.next() )
{
   // La columna 4 del resultset es el nombre de la columna en la tabla.
   System.out.println(rs.getObject(4));
}

Hemos puesto de catálogo "pruebas" y de tabla "tabla_prueba" que presuponemos existe en la base de datos. Los otros campos a null para obtener todas las columnas de la tabla. El resultado es un ResultSet con tantas filas como columnas y hasta 23 columnas indicando datos de cada una de las columnas. La columna 4 es la que nos da el nombre de la columna. Puedes ampliar la información en la api de java.

Finalmente, si hacemos una consulta cualquiera y obtenemos un ResultSet, también podemos analizar los meta datos de ese ResultSet, llamando a su método getMetaData()

Statement st = conexion.createStatement();
ResultSet rs = st.executeQuery("select * from tabla_prueba");
ResultSetMetaData rsmd = rs.getMetaData();

Una vez hecho esto, el siguiente trozo de código averiguará cuántas columnas tiene el resultado de la consulta y el nombre de cada una de las columnas.

System.out.println(rsmd.getColumnCount());
for (int i = 0; i < rsmd.getColumnCount(); i++)
{
   System.out.println(rsmd.getColumnName(i + 1));
}