Obtener MetaDatos de una Base de Datos en Java
viernes, septiembre 6, 2013 at 12:20AM
JonathanMelgoza in base, databasemetadata, datos, java, java, metadatos, obtener, resultsetmetadata

En este Articulo veremos como obtener metadatos tanto de una conexion a una base de datos, como de un Resultset cualquiera. Los metadatos son datos estructurados que describen caracteristicas de otros datos, que son en los que nos enfocamos normalmente. Algunos ejemplos de metadatos a los que nos referimos que podemos obtener son: nombre de producto, version de driver, tablas y numero de tablas, columnas y numero de columnas/filas, llaves primarias y foraneas, tipos de datos, etc. 

Para obtener este tipo de informacion haremos uso de 2 Clases: DatabaseMetaData y ResultSetMetaData. DatabaseMetaData es una clase que nos permite analizar y obtener informacion sobre la estructura de una base de datos a la que estemos conectados, por su parte, ResultSetMetaData obtiene Metadatos de una consulta a traves de un ResultSet.

Ejemplo


import java.sql.*;
import java.util.logging.*;

/**
 *
 * @author JonathanMelgoza
 */
public class Main {
    static Connection conexion;
    static Statement st;
    static String host="localhost", base_de_datos="empleados", usuario="root", contraseña="root";
    static DatabaseMetaData metadatos;
    static ResultSetMetaData rsmetadatos;
    
    public static void main(String args[]){
        try {
            //INIT
            Class.forName("com.mysql.jdbc.Driver");
            conexion = DriverManager.getConnection("jdbc:mysql://"+host+"/"+base_de_datos, usuario, contraseña);
            st = conexion.createStatement();
            
            /*DatabaseMetaData
             * Obteniendo Informacion sobre una base de datos
            */
            System.out.println("Obteniendo Informacion sobre una base de datos");
            metadatos = conexion.getMetaData();
            //Nombre de producto
            System.out.println("Nombre de Producto: "+metadatos.getDatabaseProductName());
            //Version de producto
            System.out.println("Version de Producto: "+metadatos.getDatabaseProductVersion());
            //Nombre de driver
            System.out.println("Nombre de Driver: "+metadatos.getDriverName());
            //Version de driver
            System.out.println("Version de Driver: "+metadatos.getDriverVersion());
            //Tablas
            ResultSet rst;
            ResultSet rsc;
            rst = metadatos.getTables(null, null, null, null);
            String tabla="";
            while(rst.next()){
                tabla = rst.getObject(3).toString();
                System.out.println("Nombre de Tabla: "+tabla);
                //primary key si existe
                ResultSet rsp = metadatos.getPrimaryKeys(null, null, tabla);
                if(rsp.next())
                    System.out.println("Primary Key: "+rsp.getObject(4));
                rsp.close();
                //columnas y tipos
                rsc = metadatos.getColumns(null, null, tabla, null);
                while(rsc.next()){
                    System.out.println("    Columna "+rsc.getString(4));
                    System.out.println("    Tipo "+rsc.getInt(5));
                }
                rsc.close();
            }
            rst.close();
            
            /*ResultSetMetaData
             * Obteniendo Informacion sobre una consulta con un ResultSet
            */
            System.out.println("\nObteniendo Informacion sobre una consulta con un ResultSet");
            ResultSet rs = st.executeQuery("select * from personas,ciudades");
            rsmetadatos =  rs.getMetaData();
            //obteniendo numero de columnas
            int col = rsmetadatos.getColumnCount();
            System.out.println("Columnas: "+col);
            for(int i=1;i<=col;i++){
                System.out.println("Nombre de Columa: "+rsmetadatos.getColumnName(i));
                System.out.println("Tipo de Dato: "+rsmetadatos.getColumnTypeName(i));
                System.out.println("Pertenece a la tabla: "+rsmetadatos.getTableName(i)+"\n");
            }
            
            
        } catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Resultado

Mas Informacion

En este Articulo nos enfocamos solo en algunos metodos que consideramos mas utiles de los muchos que poseen estas 2 clases, si te interesa conocer todos los metodos disponibles, a continuacion te dejo algunos recursos donde puedes encontrarlos.

Obten mas Informacion de DatabaseMetaData en:

http://docs.oracle.com/javase/7/docs/api/java/sql/DatabaseMetaData.html

Obten mas Informacion de ResultSetMetaData en:

http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSetMetaData.html

 

Article originally appeared on javaHispano (http://www.javahispano.org/).
See website for complete article licensing information.