
package ejerciciojdbc8;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;

public class EjercicioJDBC8 {

    public static void main(String[] args) {
        try {
              //    CONEXION MySQL
              Class.forName("com.mysql.jdbc.Driver");
              Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/biblioteca", "root", "");  
/*              
              //    CONEXION Oracle
              Class.forName("oracle.jdbc.driver.OracleDriver");
              Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "tiger");  
*/
              System.out.println("--------------------------------------------------");
              System.out.println("INFORMACIÓN OBTENIDA DEL DatabaseMetaData");     
              System.out.println("--------------------------------------------------");
              DatabaseMetaData databaseMetaData = connection.getMetaData();             
              System.out.println("Gestor de Base de Datos : " + databaseMetaData.getDatabaseProductName());
              System.out.println("Driver : " + databaseMetaData.getDriverName());
              System.out.println("Máximo número de columnas en tabla : " + databaseMetaData.getMaxColumnsInTable());
              System.out.println("Máximo número de columnas en SELECT : " + databaseMetaData.getMaxColumnsInSelect());
              
              System.out.println("----------");
              System.out.println("PROCEDURES");
              System.out.println("----------");
              ResultSet procedimientos = databaseMetaData.getProcedures(null, null, "%");
              while (procedimientos.next()) {
                 System.out.println(procedimientos.getString(3));
              } 
              System.out.println("---------");
              System.out.println("FUNCTIONS");
              System.out.println("---------");
              ResultSet funciones = databaseMetaData.getFunctions(null, null, "%");
              while (funciones.next()) {
                 System.out.println(funciones.getString(3));
              }                           
 
              String tiposObjetosBD[] = {"TABLE", "VIEW"};
              // ResultSet objetosBD = databaseMetaData.getTables(null ,null, "L%", tiposObjetosBD);   // Limitamos a aquellos cuyo nombre empieza por 'L'. Recomendable en la prueba con Oracle por el gran número de objetos.
              ResultSet objetosBD = databaseMetaData.getTables(null ,null, "%", tiposObjetosBD);  // Se puede utilizar en MySQL.
              while (objetosBD.next()) 
              {
                 String nombreObjeto = objetosBD.getString(3);
                 System.out.println("----------------------------------");
                 System.out.println("NOMBRE DEL OBJETO : " + nombreObjeto);
                 if (objetosBD.getString(4).compareTo("TABLE") == 0)
                 {
                    ResultSet columnasTabla = databaseMetaData.getColumns(null, null, nombreObjeto, "%");
                    while (columnasTabla.next()) {      
                       System.out.println("----------------------------------");
                       System.out.println("Nombre columna : " + columnasTabla.getString(4));
                       System.out.println("Código tipo SQL : " + columnasTabla.getString(5));
                       System.out.println("Tipo SQL : " + columnasTabla.getString(6));
                    }            
                    System.out.println("----------------------------------");
                    System.out.println("CLAVE PRIMARIA :");
                    ResultSet clavesPrimarias = databaseMetaData.getPrimaryKeys(null, null, nombreObjeto);
                    while (clavesPrimarias.next()) {                    
                       System.out.println(clavesPrimarias.getString(4));
                    } 
                    System.out.println("----------------------------------");
                    System.out.println("CLAVES AJENAS SOBRE ESTA TABLA:");
                    ResultSet clavesAjenas = databaseMetaData.getExportedKeys(null, null, nombreObjeto);
                    while (clavesAjenas.next()) {                         
                       System.out.println("tabla :   " + clavesAjenas.getString(7));
                       System.out.println("columna : " + clavesAjenas.getString(8));
                       System.out.println("nombre restriccion : " + clavesAjenas.getString(12));
                    }   
                    System.out.println("----------------------------------");databaseMetaData.getURL();
                    System.out.println("----------------------------------");
                    System.out.println("CLAVES AJENAS PRESENTES EN ESTA TABLA:");
                    ResultSet clavesAjenas2 = databaseMetaData.getImportedKeys(null, null, nombreObjeto);
                    while (clavesAjenas2.next()) {   
                       System.out.println("columna : " + clavesAjenas2.getString(8));
                       System.out.println("nombre restricción : " + clavesAjenas2.getString(12));
                    }                       
                 }                
              }

              System.out.println("--------------------------------------------------");
              System.out.println("INFORMACIÓN OBTENIDA DEL ResultSetMetaData");
              System.out.println("--------------------------------------------------");
              String sql = "SELECT * FROM libros";
              Statement statement = connection.createStatement();
              ResultSet resultSet = statement.executeQuery(sql);   
              //    Columnas del ResultSet
              ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
              for (int i=1; i<= resultSetMetaData.getColumnCount(); i++) {
                  System.out.println("nombre columna :             " + resultSetMetaData.getColumnName(i));
                  System.out.println("clase que mapea en Java :    " + resultSetMetaData.getColumnClassName(i));
                  System.out.println("tipo SQL :                   " + resultSetMetaData.getColumnTypeName(i));                 
                  System.out.println("código del tipo SQL :        " + resultSetMetaData.getColumnType(i));
                  System.out.println("tabla origen de la columna : " + resultSetMetaData.getTableName(i));
                  System.out.println("--------------------------------------------------");
              }                 
              connection.close();
         } catch(Exception e){
            e.printStackTrace();           
         }     
    }  
}
