JDBC Metadatos

Los metadatos son información sobre los datos, esta vez no vamos a consultar los datos de una BD, lo que deseamos obtener es información de como se estructura la base de datos en si, es decir, las tablas que posee, las columnas que conforman cada una de las tablas, los procedimientos almacenados, etc., o incluso si lo deseamos podemos obtener información sobre el servidor de datos.

Para nuestra demostración crearemos una aplicación que podrá conectarse a una base de datos y obtener la información de sus tablas y el respectivo nombre y tipo de cada una de las columnas de conforman las tablas.

Obtener información general

Lo primero que haremos será obtener información cómo: nombre del servidor de datos, nombre y versión del driver utilizado, datos de conexión y tipos soportados por la base de datos, podemos obtener mucho más información pero de momento con esto será suficiente para comprender los conceptos.

String url = "jdbc:mysql://localhost:3306/prueba";
String username = "root";
String password = "123456";

try (Connection connection = DriverManager.getConnection(url, username, password)) {
    
    DatabaseMetaData meta = connection.getMetaData();
    
    System.out.println("DatabaseProductName:    " + meta.getDatabaseProductName());
    System.out.println("DatabaseProductVersion: " + meta.getDatabaseProductVersion()
    System.out.println("UserName:               " + meta.getUserName());
    System.out.println("URL:                    " + meta.getURL());
    System.out.println("DriverName:             " + meta.getDriverName());
    System.out.println("DriverVersion:          " + meta.getDriverVersion());
    
    ResultSet rs = meta.getTypeInfo();
    
    System.out.println("TypeInfo: ");
    while (rs.next()) {
        System.out.println("\t" + rs.getString(1));
    }
}

Debemos obtener un DatabaseMetaData usando el objeto Connection, este nos permitirá usar los respectivos métodos getXXX() para obtener la información deseada, al final vemos una llamada a getTypeInfo() este devuelve un ResultSet que contiene la información de los tipos soportados por la base de datos.

DatabaseProductName:    MySQL
DatabaseProductVersion: 5.7.19-log
UserName:               root@localhost
URL:                    jdbc:mysql://localhost:3306/prueba
DriverName:             MySQL-AB JDBC Driver
DriverVersion:          mysql-connector-java-5.1.23 ( Revision: ${bzr.revision-id} )
TypeInfo: 
  BIT
  BOOL
  TINYINT
  TINYINT UNSIGNED
  ...

Nos conectamos al servidor y obtenemos la información deseada, puedes cambiar los datos para utilizar otros servidor, solo recuerda agregar el respectivo driver.

Obtener bases de datos

Ahora obtendremos la información de las bases de datos que se encuentren en el servidor al que nos conectamos, para esto usaremos la función getCatalogs() la cuál nos retorna un ResultSet con la información de las bases de datos.

DatabaseMetaData metadata = connection.getMetaData();
ResultSet rs = metadata.getCatalogs();

while (rs.next()) {
    System.out.println(rs.getString("TABLE_CAT"));
}

Usamos el texto TABLE_CAT para recuperar cada uno de los nombres de las BD, el resultado para mí es:

information_schema
mysql
performance_schema
prueba
sakila
sys
world

Es importante mencionar que estamos visualizando no solo las BD creadas por nosotros, también se muestran las del sistema.

Información de la Tablas y Columnas

De un modo similar podemos obtener información de las tablas que contiene una BD en especifico, si la URL de conexión establece la BD se mostrarán las tablas de la misma, si no la indicamos en la URL podemos hacerlo al invocar el método getTables(), ejemplo:

DatabaseMetaData metadata = connection.getMetaData();
ResultSet rs = metadata.getTables("sakila", null, null, new String[] {"TABLE"});

while (rs.next()) {
    System.out.println(rs.getString("TABLE_NAME"));
}

El primer parámetro del método getTables("sakila", ... , new String[] {"TABLE"}) hace referencia a la BD que deseamos consultar, el último indica como se devuelve el resultado, luego usamos el texto TABLE_NAME para obtener dichos resultados.

actor
address
category
city
country
customer
...

De igual manera obtenemos la información de las columnas que componen una determinada tabla, lo hacemos del siguiente modo:

DatabaseMetaData metadata = connection.getMetaData();
ResultSet rs = metadata.getColumns("sakila", null, "actor", null);

while (rs.next()) {
    System.out.println(
            rs.getString("COLUMN_NAME") + ", "
            + rs.getString("TYPE_NAME") + ", "
            + rs.getString("COLUMN_SIZE"));
}

Con el método getColumns() indicamos la BD y la tabla que deseamos consultar, podemos obtener gran variedad de información usando los textos respectivos, visita la documentación para ver todas las opciones, nosotros obtenemos, nombre de columna, tipo y tamaño.

actor_id, SMALLINT UNSIGNED, 5
first_name, VARCHAR, 45
last_name, VARCHAR, 45
last_update, TIMESTAMP, 19

Aplicando lo aprendido, crearemos una GUI usando JavaFX que nos permitirá conectarnos a un servidor de datos, consultar sus tablas, seleccionar la que deseemos y ver la información de sus columnas.

JDBC Metadatos con JavaFX

No requiere gran explicación, solo introduce los datos de conexión, presiona el botón actualizar y selecciona la base de datos que desees explorar, al presionar sobre la tabla en seguida se muestra su información en la tabla.

Puedes conectarte a cualquier base de datos, solo ten en cuenta que debes agregar los driver correspondientes, y tener un usuarios con el que conectarte.

Descargar proyectos: metadatos-jdbc-consola.zip | metadatos-jdbc-javafx.zip

Comentarios

Temas relacionados

Entradas populares de este blog

tkinter Grid

Controles y Contenedores JavaFX 8 - I

Conectar SQL Server con Java

Histogramas OpenCV Python