Liberando código: framework para trabajar con Base de Datos y Swing


Las preguntas frecuentes a la hora de escribir aplicaciones con Java son ¿Como conectarse a una base de datos? y ¿como llenar una grilla u hoja de datos?. La primera pregunta talvés es de respuesta sencilla, basta con tener el controlador JDBC (driver) apropiado para la base de datos y colocarlo en el CLASSPATH, pasar unos parámetros de conexión, enviar la sentencia SQL de manipulación de datos, recoger el resultado y tratarlos para ser presentados o generar más información.

Para aplicaciones sencilla basta con algunas líneas de código para abrir y cerrar una conexión. El listado de código siguiente recibe los parámetros necesarios y retorna una conexión a la fuente de datos.

public Connection getConnection(String url, String username, String password) throws SQLException {

try{

Class.forName(“oracle.jdbc.driver.OracleDriver”).newInstance(); //El driver thihn para oracle

this.con = DriverManager.getConnection(url, username, password);
} catch (java.lang.ClassNotFoundException cnfe){
System.out.println(“Error al crear la clase: ” + cnfe.getMessage());
} catch (java.lang.InstantiationException ie){
System.out.println(“Error de instanciación de clase:” + ie.getMessage());

} catch (java.lang.IllegalAccessException iae){

System.out.println(“Error de Acceso a la clase:” + iae.getMessage());

}
return this.con;

}

Esto esta bien para una aplicación sencilla, donde no se requieran más de 10 conexiones. Incluso podríamos olvidar cerrarlas, el recogedor de basura de Java se encargaría de liberar los recursos ocupados por conexiones olvidadas. Pero para aplicaciones mayores la memoria representa un recurso valioso incluso si se cuenta con el mecanismo de recolección de basura, original, de Java.

Aquí es importante introducir el concepto de bandeja de conexiones (connections pool), que no es otra cosa que un mecanismo de reutilización de conexiones y por tanto de optimización de uso de recursos. En este esquema, las conexiones se crean, se reutilizan y/o se destruyen en función de los requerimientos en tiempo de ejecución de la aplicación.

La experiencia en el desarrollo de aplicaciones para el mundo real con Java, han permitido experimentar las bondades de utilizar una bandeja de conexiones. Fruto de esta experiencia es el framework cuyo código fuente libero a continuación, mismo que fue empleado en el desarrollo de COMUNA, Software de Gestión de Micro finanza, desarrollado para la Fundación DECOF.

El framework contiene algunas clases útiles para gestionar conexiones a bases de datos, y algunos componentes Swing de los cuales hablaré en otro artículo.

La clase que implementa una bandeja de conexiones es com.caciquelabs.db.DBUtils, esta clase se configura con la clase com.caciquelabs.db.DBOptions, que permite establecer todos los parámetros necesarios para establecer una conexión de datos.

El listado de código siguiente muestra como emplear las clases mencionadas:

/*
* Main.java
*
* Created on 30 de julio de 2007, 04:28 PM
*
* Ejemplo sencillo de uso del framework
*/

package easydb;

import com.caciquelabs.db.DBOptions;
import com.caciquelabs.db.DBUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
*
* @author jolug
*/
public class Main {

/** Creates a new instance of Main */
public Main() {
}

/**
* @param args the command line arguments
*/
public static void main(String[] args) {

// TODO code application logic here
//Establecer los parámetros de configuración
//También puede emplearse un archivo de recursos.
DBOptions dboptions = new DBOptions();
dboptions.setDriverClassName(“org.postgresql.Driver”);
dboptions.setDatabaseURL(“jdbc:postgresql://127.0.0.1:5432/banqo”);
dboptions.setDatabaseUser(“banqo”);
dboptions.setDatabasePassword(“banqo”);
DBUtils dbutils = new DBUtils();
dbutils.setDBOptions(dboptions);
try {//JDBC objects

Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
StringBuffer sql = new StringBuffer(512);
sql.append(“SELECT * FROM person”); //Sentencia de manipulación de datos
connection = dbutils.getConnection(); //Aqui trabaja la bandeja de conexiones
statement = connection.prepareStatement(sql.toString());
resultSet = statement.executeQuery();

while (resultSet.next()) {

System.out.print(resultSet.getString(1));
System.out.print(“:”);
System.out.print(resultSet.getString(2));
System.out.print(“:”);
System.out.print(resultSet.getString(3));
System.out.print(“:”);
System.out.print(resultSet.getString(4));
System.out.print(“:”);
System.out.print(resultSet.getString(5));
System.out.print(“:”);
System.out.print(resultSet.getString(6));
System.out.print(“:”);
System.out.print(resultSet.getString(7));
System.out.print(“:”);
System.out.println(resultSet.getString(8));

}

} catch (SQLException ex) {

ex.printStackTrace();

} finally {

dbutils.closeResultSet(resultSet);
dbutils.closeStatement(statement);
dbutils.closeConnection(connection);

}

}

}

El ejemplo muestra como establecer una conexión a una base de datos PostgreSQL empleando las clases utilitarias del framework. Adicionalmente al paquete de clases del framework, es necesario agregar al CLASSPATH el driver de conexión, en este caso el de driver JDBC para PortgreSQL; y las librerias Log4j y MyVietnam.

En el archivo adjunto se encuentra el código fuente del framework como proyecto NetBeans, y la clase de ejemplo de uso. También las librerías relacionadas. Usted debe descargar el driver para la base de datos que usted use.

En resumen, las clases utilitarias del framework permiten ocultar la complejidad de las conexiones a bases de datos con Java, al mismo tiempo que optimiza el uso de recursos a través del uso de una bandeja de conexiones.

Espero este código sea de utilidad para futuros proyectos.

9 comentarios en “Liberando código: framework para trabajar con Base de Datos y Swing

  1. Arturo dijo:

    Una pregunta: recien leo tu blog me parece interesante por ser de una persona con experiencia.

    Dime, tu pool de conexiones si no entendi mal funciona con aplicaciones SWING no es asi?? eso quiere decir que puedo compartir las conexiones del pool entre las aplicaciones dentro de la misma PC, o del mismo programa?? y en el caso de varias PC en una red interna como funciona esto??

  2. Arturo dijo:

    Yo tambien estoy haciendoun framework que me facilite el trabajo con swing para la generacion automatica de Interfaces basados en la metadata obtenida de una base de datos, revisare tu codigo para ver que puedo aprender de ahi, si uso algo de lo tuyo, entonces te aviso

  3. Arturo dijo:

    Yo también estoy haciendo un framework que me facilite el trabajo con swing para la generación automática de Interfaces basados en la meta data obtenida de una base de datos, revisare tu código para ver que puedo aprender de ahí, si uso algo de lo tuyo, entonces te aviso

  4. Otro ejemplo para trabajar con base de datos mysql y java.

    public class Conexion {

    public String driver;
    public String url;
    public String usuario;
    public String pass;
    public boolean nuevoRegistro;
    public Connection con;
    public Statement stmt;
    public ResultSet rs;

    public Conexion() {
    driver = “com.mysql.jdbc.Driver”;
    url = “jdbc:mysql://192.168.168.1:3306/tpv”;
    usuario = “logitecno”;
    pass = “logi2008”;
    con = null;
    stmt = null;
    nuevoRegistro = false;
    }

    public void iniciar() {
    try {
    Class.forName(driver).newInstance();
    con = DriverManager.getConnection(url, usuario, pass);
    stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
    System.out.println(“Conexión realizada con exito a “+url);
    } catch (Exception e) {
    System.out.println(“Error en la conexión a la base de datos.”);
    System.out.println(e.getMessage());
    }
    }
    public void destruir() {
    if(con !=null){
    try{
    con.close();
    }
    catch(Exception e){}
    }
    }

    public void consulta(String tabla) throws SQLException {
    rs = stmt.executeQuery(“select * from “+tabla);
    }

    public void iralfinal() throws SQLException {
    rs.last();
    }
    public void iralsiguiente() throws SQLException {
    rs.next();
    }
    public void iralanterior() throws SQLException {
    rs.previous();
    }
    public void iralprimero() throws SQLException {
    rs.first();
    }
    public void nuevo() throws SQLException {
    nuevoRegistro = true;
    rs.moveToInsertRow();
    }
    public void cancela() throws SQLException {
    nuevoRegistro = false;
    rs.cancelRowUpdates();
    }
    public void borrar() throws SQLException {
    rs.deleteRow();
    rs.last();
    }
    // Aceptamos los datos que recibimos de los formularios
    public void okClientes(String nombre, String apellidos, String direccion, String dni, String nacionalidad,
    String cp, String localidad, String provincia, String telefono, String movil, String correo,
    String pagina, String cuenta) throws SQLException {
    rs.updateString(“nombre”, nombre);
    rs.updateString(“apellidos”, apellidos);
    rs.updateString(“direccion”, direccion);
    rs.updateString(“dni”, dni);
    rs.updateString(“nacionalidad”, nacionalidad);
    rs.updateString(“cp”, cp);
    rs.updateString(“localidad”, localidad);
    rs.updateString(“provincia”, provincia);
    rs.updateString(“telefono”, telefono);
    rs.updateString(“movil”, movil);
    rs.updateString(“correo”, correo);
    rs.updateString(“pagina”, pagina);
    rs.updateString(“cuenta”, cuenta);

    if (nuevoRegistro) {
    rs.insertRow();
    rs.last();
    System.out.println(“El nuevo registro ha sido almacenado”);
    } else {
    rs.updateRow();
    System.out.println(“El registro ha sido modificado”);
    }
    }

    }

    Esta sería la clase Conexion, el método iniciar sirve para conectarse a la base de datos. Ahora sólo hay que pasarle esta conexion a los formularios donde visualicemos los datos.

    public class Clientes extends JInternalFrame {

    Conexion c;
    Metodos m;

    public Clientes (Conexion c) throws SQLException {
    this.c = c;
    m = new Metodos();
    initComponents();
    c.consulta(“clientes”);
    c.iralfinal();
    sacarDatos(c.rs);
    }

    private void sacarDatos(ResultSet rs) throws SQLException {
    // Si vale 0 es porque la tabla no tiene datos
    if (rs.getRow()!=0) {
    id.setText(“”+rs.getInt(“id”));
    nombre.setText(rs.getString(“nombre”));
    apellidos.setText(rs.getString(“apellidos”));
    direccion.setText(rs.getString(“direccion”));
    dni.setText(rs.getString(“dni”));
    nacionalidad.setText(rs.getString(“nacionalidad”));
    cp.setText(rs.getString(“cp”));
    localidad.setText(rs.getString(“localidad”));
    provincia.setSelectedItem(rs.getString(“provincia”));
    telefono.setText(rs.getString(“telefono”));
    movil.setText(rs.getString(“movil”));
    correo.setText(rs.getString(“correo”));
    pagina.setText(rs.getString(“pagina”));
    cuenta.setText(rs.getString(“cuenta”));
    // Ocultamos los botones si no existen registros
    primero.setEnabled(!rs.isFirst());
    anterior.setEnabled(!rs.isFirst());
    siguiente.setEnabled(!rs.isLast());
    ultimo.setEnabled(!rs.isLast());
    } else {
    System.out.println(“No hay registros”);
    }
    }

    Espero que también sirva de ejemplo, no es muy dificil de entender, faltan cosas pero el concepto es esto.

    c.iralfinal(); el método iralfinal() está en la clase conexion y lo unico que hace es situar el rs al final, yo lo hago con métodos para hacer la llamada a ese método desde el formulario luego, aunque no le veo mucha utilidad, porque se podría hacer desde el mismo formulario. c.rs.last();

    Espero que este ejemplo os sea util. Salu2

  5. Hola a todos perdón por no contestar oportunamente.
    Arturo, en efecto el código que libero es bastante básico pero muy útil, es parte del core de un proyecto de desarrollo profesional. Claro eres bienvenido a reutilizar código, así funciona la industria del software, del buen software.

    Acerca de Swing…
    El código liberado incluye algunos componentes, por ejemplo: un Combo de datos, una lista de datos y una tabla de datos, sencillos de usar basta con configurar la cola de conexiones y establecer la sentencia SQL de consulta. Espero la puedas probar.

  6. Dannychelys dijo:

    estos aritulos estan muy buenos pero tengo problemas al conectar un jframe de netbeans con mysql no logro realizar una clase llamada conexion apesar del ejemplo anterior si puedes explicar mas detallado donde se colocan las partes del codigo te agradeceria estoy en primer año de sistemas y empece con esto ayuda

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s