viernes, 4 de marzo de 2011

Convertir un ResultSet a un ArrayList (Java)

Saludos.

Esta clase sirve para facilitar la interpretación entre un ResultSet a un ArrayList, además de que evitar que se tengan "try" por todos lados y se puedan administrar más facilmente.

Haciendo mucho mas sencillo el manejo de las consultas dentro de la aplicación.

Esta clase provee las siguientes funciones:
  • Select
  • SelectMatch
  • Insert
  • (Update disponible muy pronto)
Al instanciar un objecto de esta clase se pueden enviar los parámetros necesarios para realizar la conexión.

Instanciación:
Query qry = new Query("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/temporal", "root", "daniel");
ó solo = new Query(); y enviar los parametros por medio de los seters y geters disponibles.

Ejemplo 1:
Con el siguiente fragmento de código podemos saber si existe un registro
ideal para cuando deseamos hacer un ingreso que debe de ser único.
Query qry=new Query();
if (consulta.SelectMatch("tableName","ColumnName","parametro") )
...
else
...
Ejemplo 2:
Con el siguiente fragmento se hace una consulta que devuelve un resultado para mostrar en la interfáz gráfica.
ComboBox1.removeAllItems();
ArrayList Resultado=new ArrayList();
Query consulta=new Query();
Resultado=consulta.Select("* FROM CHASIS",2);
if (Resultado!=null)
for (int x=0;xComboBox1.addItem((Resultado.get(x))[0]+") "+(Resultado.get(x))[1]);
Se puede observar que lo que hace este código es:
  1. Borrar el contenido del ComboBox.
  2. Se crea un ArrayList de tipo arreglo de String.
  3. Se crea un objeto de tipo Query.
  4. Se ejecuta el método Query.Select, que devuelve como resultado un ArrayList, este método recibe un String y un entero. En el String va el código SQL necesario y el entero es para indicar el número de columnas que devolverá la consulta.
  5. Se verifica que la consulta haya devuelto resultados.
  6. En este punto ya es posible recorrer el ArraList para guardarlo por ejemplo en un ComboBox.
Ejemplo 3:
Query consulta=new Query();
if (consulta.SelectMatch("Tabla", "NOMBRE", txtNombre.getText())==false){
consulta=new Query();
if ( consulta.Insert(Tabla+" (NOMBRE) VALUES('"+txtNombre.getText()+"')") ){
    ...//Si fue insertado correctamente
}else{
    ...
}
}else{
...//Si ya existe
}
  • Se crea una Variable de tipo Query
  • Se ejecuta el método Query.SelectMatch(), este método recible como parámetros el nombre de la tabla, el nombre del campo a comparar y el parametro contra el cual se debe comparar el nombre del campo.
  • se puede observar que se compara que el valor ingresado (parametro 3) no existe en "Tabla", si no existe se procede a insertar el registro en la base de datos.
  • se reinicia la variable consulta
  • se ejecuta el método Query.Insert(), que recibe como parámetro el código SQL para ma misma.
Espero les sea de utilidad.

Definición de la clase "Query".
package administrador;

import java.sql.*;
import java.util.ArrayList;
import javax.swing.JOptionPane;
/**
 *
 * @author Daniel
 */
public class Query {
    private String DRIVER="com.mysql.jdbc.Driver";//mySQL
    private String RUTA="jdbc:mysql://localhost/temporal";//Prueba";//mySQL
    private String USER="root";
    private String PASSWORD="daniel";
    private Connection CONEXION;

    public Query(){
        
    }
    public Query(String Driver, String Ruta, String User, String Password){
        DRIVER=Driver;
        RUTA=Ruta;
        USER=User;
        PASSWORD=Password;
    }
    public boolean Connect(){
        try{
            Class.forName(DRIVER);
            CONEXION = DriverManager.getConnection(RUTA,USER,PASSWORD);
            Statement sentencia=null;
            sentencia=CONEXION.createStatement();
            return true;
        }catch(ClassNotFoundException ex){
            JOptionPane.showMessageDialog(null, "Driver no disponible. "+ex,"Error",JOptionPane.ERROR_MESSAGE);
            return false;
        }catch(SQLException ex){
            JOptionPane.showMessageDialog(null, "Conexion a la base de datos no disponible. \n"+ex,"Error",JOptionPane.ERROR_MESSAGE);
            return false;
        }
    }
    public ArrayList<String[]> Select(String SQL, int NumColumnas){
        if (Connect()){
            try{
                ArrayList<String[]> matResultado=new ArrayList<String[]>();
                String Fila[]=new String [NumColumnas];

                Class.forName(DRIVER);
                CONEXION = DriverManager.getConnection(RUTA,USER,PASSWORD);

                Statement sentencia=null;
                sentencia = CONEXION.createStatement();
                ResultSet resultado = sentencia.executeQuery("SELECT "+SQL);
                while (resultado.next())
                {
                    Fila=new String[NumColumnas];
                    for (int x=0;x<NumColumnas;++x){
                        Fila[x]=resultado.getObject(x+1).toString();
                    }
                    matResultado.add(Fila);
                }
                if (matResultado.isEmpty()) {return null;}
                return matResultado;
            }catch(Exception ex){}
        }
        return null;
    }
    /**
     * @return "true" si IDname=IDvalue en tableName
     * ejemplo: SELECT IDname FROM tableName WHERE IDname='IDvalue';
     */
    public boolean SelectMatch(String tableName, String IDname, String IDvalue){
        if (Connect()){
            try{
                ArrayList<String> matResultado=new ArrayList<String>();

                Class.forName(DRIVER);
                CONEXION = DriverManager.getConnection(RUTA,USER,PASSWORD);

                Statement sentencia=null;
                sentencia = CONEXION.createStatement();
                ResultSet resultado = sentencia.executeQuery("SELECT "+IDname+" FROM "+tableName+" WHERE "+IDname+"='"+IDvalue+"'");
                while (resultado.next())
                {
                    matResultado.add(resultado.getObject(1).toString());
                }
                if (matResultado.isEmpty()) {return false;}
                return true;
            }catch(Exception ex){}
        }
        return false;
    }
    public boolean Insert(String SQL){
        if (Connect()){
            try{
                Class.forName(DRIVER);
                CONEXION = DriverManager.getConnection(RUTA,USER,PASSWORD);

                Statement sentencia=null;
                sentencia = CONEXION.createStatement();
                sentencia.execute("INSERT INTO "+SQL);
                return true;
            }catch(Exception ex){}
        }
        return false;
    }
    public void setDriver(String Drv){
        DRIVER=Drv;
    }
    public void setRuta(String Rut){
        RUTA=Rut;
    }
    public void setUser(String Usr){
        USER=Usr;
    }
    public void setPass(String Pas){
        PASSWORD=Pas;
    }
    public String getDriver(){
        return DRIVER;
    }
    public String getRuta(){
        return RUTA;
    }
    public String getUser(){
        return USER;
    }
    public String getPass(){
        return PASSWORD;
    }
}

6 comentarios:

  1. Interesante la clase.
    Una pregunta, porque no hay "close()" de los statement, resultaset y connection?
    No convendria agregar los cierre en los finally y un connection.close() en el finalize?

    ResponderEliminar
  2. Buenas, me parece interesante esta clase... pero da error en varias partes.... en el public ArrayList Select, a partir del while da errores. Un saludo Daniel

    ResponderEliminar
  3. for (int x=0;xComboBox1.addItem((Resultado.get(x))[0]+") "+(Resultado.get(x))[1]);

    creo que el for ese esta mal, concretamente por la x antes del combobox1

    ResponderEliminar
  4. hola buenas.
    tengo una pregunta como podria pasar el valor de un String a un ResultSet

    ResponderEliminar