Obtener los nombres de las columnas de una tabla MySQL con Java

Estándar
mejor_modo

No mas 50 lineas de .getString(“nombre_columna”)

La forma mas común de manejar una base de datos MySQL en Java es usar los objectos Statement y ResultSet para enviar comandos a la misma y obtener el resultado de la consulta, si lo hay. En lo general este metodo funciona muy bien y le da pleno acceso a todas las funcionalidades del MySQL, ya que cada comando que use en MySQL Workbench va a funcionar sin problemas.

El unico inconveniente en este método es precisamente crear los comandos a enviar, pues sera muy comun que tenga que estar concatenando una cantidad muy grande de cadenas de texto y variables con los datos, en especial para los comandos INSERT INTO y UPDATE y si a eso le suma tablas con una enorme cantidad de datos no ha de extrañarle funciones de mas de 50 lineas en las que al menos 30 son solo repeticiones de sql = sql + “campo='” + dato + “‘, “; una y otra y otra vez, por fortuna hay una forma de automatizar la creación de ese comando y la consulta de datos.

SHOW COLUMNS FROM

El comando SHOW COLUMNS FROM <tabla> de MySQL le presenta la información sobre las columnas de la tabla, incluido el nombre de las columnas y como esta es una consulta normal de MySQL podemos ejecutarla desde Java y obtener el resultado.

Ahora, si ya tenemos los nombres de las columnas, en una forma en la que podemos iterar con un ciclo, no deberia ser dificil crear automaticamente la consulta, ¿verdad?, para nada el ejemplo a continuación presentara como hacer esto, con comentarios para detallar que ocurre.

package nombrecampos;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;

public class NombreCampos {   

  public static void main(String[] args) {
    try {
      Connection conexion;
      Statement consulta;            
      ResultSet data;
      ArrayList nombreCampos = new ArrayList<>();
      HashMap<String, Integer> datos = new HashMap<>();
            
      String user = "tecnico";
      String pass = "acceso1987";
            
      // Conectamos con la base de datos

      Class.forName("com.mysql.jdbc.Driver");

      conexion=DriverManager.getConnection(
        "jdbc:mysql://127.0.0.1:3306/pruebas"+"?"
        +"user=" + user + "&" + "password=" + pass + "");
        
      // Obtenemos los nombres de los campos de 
      //la tabla pruebas.prueba

  
      String comandoCampos = "SHOW COLUMNS FROM pruebas.prueba";
      consulta = conexion.createStatement();
      data = consulta.executeQuery(comandoCampos);
            
      while(data.next() == true) {
          
        // El campo Field es el que contiene el nombre 
        // de la columna
        
        System.out.println("Obtenemos el campo " 
        + data.getString("Field"));
          
        nombreCampos.add(  data.getString("Field") );
       }
       consulta.close();
         
       // Como prueba de que podemos usar esos nombres para
       // crear los comandos MySQL obtendremos los datos y 
       // los almacenamos el el HashMap
            
       consulta = conexion.createStatement();
       String comandoDatos = "SELECT * FROM pruebas.prueba;";
       data = consulta.executeQuery(comandoDatos);
            
        while(data.next() == true ) {
          for(String campo : nombreCampos ){
            datos.put( campo , data.getInt(campo));
            }
          }
            
          // Vemos que los datos se obtuvieran bien
          
          System.out.println("Valor de puerto_red " 
                              + datos.get("puerto_red"));

          System.out.println("Valor de isla " 
                              + datos.get("isla"));
            
          consulta.close();
            
          // Ahora cambiaremos unos valores y crearemos el 
          // comando para actualizar
          // la informacion en la base de datos
            
          datos.put("puerto_serial", 10);
          datos.put("puerto_impresora", 9);
          datos.put("puerto_red", 8);
          datos.put("red_enabled", 0);
            
          // Creamos el comando de actualizacion
          
          String comandoActualizacion="UPDATE pruebas.prueba " 
                                      + "SET ";
            
          // Usaremos un ciclo para agregar todos 
          // los campos y sus nuevos valoes
          int i;
          for(i=0; i < nombreCampos.size()-1; i++) {
            String campo = nombreCampos.get(i);            
            comandoActualizacion = comandoActualizacion 
              + campo + "=" + datos.get(campo) + ", ";
          }
            
          // El ultimo campo lo ponemos fuera del ciclo para
          // NO dejar una coma al final, o MySQL regresara error
          String campo = nombreCampos.get(i);
          comandoActualizacion = comandoActualizacion 
              + campo + "=" + datos.get(campo);
            
          // Mostramos el comando y lo ejecutamos
          System.out.println(comandoActualizacion);
          consulta = conexion.createStatement();

          consulta.executeUpdate(comandoActualizacion);            
        
      } catch (ClassNotFoundException ex) {
         System.err.println("Error de driver");
         ex.printStackTrace();
      } catch (SQLException ex) {
         System.err.println("Error de acceso a base de datos");
         ex.printStackTrace();
      }
  }    
}

Las anotaciones de los comentarios (espero) dejen en claro lo que esta ocurriendo en el codigo, lo que aqui hacemos es basicamente lo siguiente:

  1. Nos conectamos a la base de datos
  2. Obtenemos los nombres de las columnas de esa tabla
  3. Las almacenamos en un ArrayList que podamos iterar despues
  4. Usando ese ArrayList sacamos los datos de la tabla con .getInteger, sin tener que escribir los nombres de los campos uno por uno y los guardamos en un HashMap
  5. Mostramos y modificamos ese HashMap
  6. Con ayuda del arrayList creamos el comando UPDATE, de nuevo no tenemos que escribir los nombre de los campos
  7. Actualizamos la base de datos.

Como muestra a continuación estan unas capturas de la base de datos antes de correr el programa, la salida del programa y la base de datos despues de correr el programa.

01_antes

Figura 1 – Base de datos antes de correr el programa

02_salida

Figura 2 – Salida del programa

03_final

Figura 3 – Base de datos despues de correr el programa

Ahora si bien es cierto que puede actualizar la base de datos solo basandose en la posición de la columna, ese metodo me parece muy inseguro, ya que se modifica la tabla podria causar errores, este metodo, al basarse en los nombres de columna, no se vera afectado si agrega un campo nuevo al inicio.

Anuncios