Aplicacion Con Acceso a Bases de Datos Java MySql y Patrones de Diseño Parte 3

Despues de la larga espera (La Maestria quita tiempo jijijij). Aqui esta la parte 3 y el plus (por la espera) el cual muestra la funcionalidad en un app de consola....

Continuando con la aplicación en esta entraga aplicaremos una variante de el patron Data Access Object Core J2EE Patterns - Data Access Object, este es el diagrama de clase del la capa de acceso a datos propuesto.

De acuerdo con el diagrama, vamos a crear la clase correspondiente. La clase ArticuloDAO, que de acuerdo con el patron Data Access Object, es el encargado de encapsular la lógica de acceso a bases de datos. Aclarando solo mostrare una forma de hacerlo, de preferencia seguir las indicaciones, del enlace de arriba y considerar las notas que pondre al final.

Creación de la clase ArticuloDAO

1. Seleccionar el paquete com.ezjamvc.modelo.dao
2. Clic secundario
3. Nuevo
4. Clase java

Por lo tanto la codificación de la clase quedaria de la siguiente forma.

package com.ezjamvc.modelo.dao;

import com.ezjamvc.modelo.dto.ArticuloDTO;
import java.sql.Connection;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/*** @author asuncion */
public class ArticuloDAO {

    private static final String SQL_INSERT =
            "INSERT INTO Articulo ("
            + "claveArticulo, descripcion, precio, existencias"
            + ") VALUES (?, ?, ?, ?)";
    private static final String SQL_SELECT =
            "SELECT claveArticulo, descripcion, precio, existencias "
            + "  FROM Articulo where claveArticulo= ?";
    private static final String SQL_SELECT_All =
            "SELECT claveArticulo, descripcion, precio, existencias   "
            + "FROM Articulo";
    private static final String SQL_UPDATE =
            "UPDATE Articulo SET "
            + "descripcion = ?, precio = ?, existencias = ?"
            + " WHERE "
            + "claveArticulo = ? ";

    /* SQL to delete data */
    private static final String SQL_DELETE =
            "DELETE FROM Articulo WHERE "
            + "claveArticulo = ?";

    public void create(ArticuloDTO dto, Connection conn) throws SQLException {

        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(SQL_INSERT);
            ps.setString(1, dto.getClaveArticulo());
            ps.setString(2, dto.getDescripcion());
            ps.setDouble(3, dto.getPrecio());
            ps.setInt(4, dto.getExistencias());
            ps.executeUpdate();
        } finally {
            cerrar(ps);
            cerrar(conn);
        }
    }

    public ArticuloDTO load(ArticuloDTO dto, Connection conn) throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(SQL_SELECT);
            ps.setString(1, dto.getClaveArticulo());
            rs = ps.executeQuery();
            List results = getResults(rs);
            if (results.size() > 0) {
                return (ArticuloDTO) results.get(0);
            } else {
                return null;
            }
        } finally {
            cerrar(rs);
            cerrar(ps);
            cerrar(conn);
        }
    }

    public List loadAll(Connection conn) throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(SQL_SELECT_All);
            rs = ps.executeQuery();
            List results = getResults(rs);
            if (results.size() > 0) {
                return results;
            } else {
                return null;
            }
        } finally {
            cerrar(rs);
            cerrar(ps);
            cerrar(conn);
        }
    }

    public void update(ArticuloDTO dto, Connection conn) throws SQLException {
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(SQL_UPDATE);
            ps.setString(1, dto.getDescripcion());
            ps.setDouble(2, dto.getPrecio());
            ps.setInt(3, dto.getExistencias());
            ps.setString(4, dto.getClaveArticulo());
            ps.executeUpdate();
        } finally {
            cerrar(ps);
            cerrar(conn);
        }
    }

    public void delete(ArticuloDTO dto, Connection conn) throws SQLException {
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(SQL_DELETE);
            ps.setString(1, dto.getClaveArticulo());
            ps.executeUpdate();
        } finally {
            cerrar(ps);
            cerrar(conn);
        }
    }

    private List getResults(ResultSet rs) throws SQLException {
        List results = new ArrayList();
        while (rs.next()) {
            ArticuloDTO dto = new ArticuloDTO();
            dto.setClaveArticulo(rs.getString("claveArticulo"));
            dto.setDescripcion(rs.getString("descripcion"));
            dto.setPrecio(rs.getDouble("precio"));
            dto.setExistencias(rs.getInt("existencias"));
            results.add(dto);
        }
        return results;
    }

    private void cerrar(PreparedStatement ps) throws SQLException {
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
            }
        }
    }

    private void cerrar(ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
            }
        }
    }

    private void cerrar(Connection cnn) {
        if (cnn != null) {
            try {
                cnn.close();
            } catch (SQLException e) {
            }
        }
    }
}

Bueno despues de haber creado la clase ArticuloDAO, pues solo para no aburrirnos y ver que estamos haciendo y que realmente este funcionando, vamos a crear una clase java simple que utilice a ArticuloDAO y verificaremeos el funcionamiento de las operaciones CRUD en nuestra base de datos, insisto solo será para ver si todo lo que se codifico es funcional.

Lo primero es agregar a nuestro proyecto la libreria para poder conectar con MySql, por lo tanto en la estructura del proyecto buscamos Bibliotecas(Linraries) ==> le damos clic con el boton derecho del mouse y elegimos la opción Agregar Biblioteca, aparece el siguiente cuadro.

en el cual elegir la opción Driver MYSQL JDBC y con esto el proyecto ya podrá mantener comunicación con el servidor de bases de datos MySql.

La clase de prueba, la creere en la raiz del proyecto asi que basta con seleccionar el nodo paquetes de fuentes (sources packages) del proyecto, boton derecho ==>nuevo ==>clase java.

El codigo es el siguiente:

import com.ezjamvc.modelo.dao.ArticuloDAO;
import com.ezjamvc.modelo.dto.ArticuloDTO;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/** @author asuncion */
public class PruebaDAO {

    public PruebaDAO() {
    }

    public static void main(String[] args) {
        /*
         * Solo para probar el funcionamiento
         */

        Connection cnn = null;
        String user = "root";
        String pwd = "admin";
        String url = "jdbc:mysql://localhost:3306/EzjaMVC";
        String mySqlDriver = "com.mysql.jdbc.Driver";
        try {
            Class.forName(mySqlDriver);
            cnn = DriverManager.getConnection(url, user, pwd);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //Crear una Instacia del DTO
        ArticuloDTO dto = new ArticuloDTO();
        //Crear una instacia del DAO
        ArticuloDAO dao = new ArticuloDAO();
        try {
            //Agregar un registro nuevo
            //dto.setClaveArticulo("art100");
            //dto.setDescripcion("libreta");
            //dto.setExistencias(100);
            //dto.setPrecio(5000);
            //dao.create(dto, cnn);
           
            //Actualizar un registro existente
            //dto.setClaveArticulo("art100");
            //dto.setDescripcion("lap hp ");
            //dto.setExistencias(100);
            //dto.setPrecio(5000);
            //dao.update(dto, cnn);
           
                     
            //Mostrar un solo registro
            //dto.setClaveArticulo("art100");
            //dto = dao.load(dto, cnn);
            //System.out.println(dto);
       
        //Eliminar un registro
            //dto.setClaveArticulo("art100");
            //dao.delete(dto, cnn);
           
            //Listar los registros
             System.out.println(dao.loadAll(cnn));
        } catch (SQLException ex) {
            Logger.getLogger(PruebaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

El resultado aparece el la parte inferior del ide, de la siguiente forma

Segun sea el caso de las opciones que decomenten para ejecutar, seran los resultados que se obtendran en la bd. Nota, decomentar solo una acción a la vez, ya que en cada una de ellas se habre y se cierra la conexión al inicio y al final respectivamente.

Esta imagen muestra com en la base de datos se actualizan los datos de art100, despues se elimina, segun la secuencia, de como se comentaron las acciones, crear, actualizar, buscar eliminar y mostrar todos.

Eso es todo por esta ocacion en la proxima veremos lo que atañe al paquete facade y al delegate probablemente en una sola entrega depende de si me puedo escapar, saludos