Modelo PersonaDAO VO - eliizquierdo/material_programacion_avanzada2026 GitHub Wiki

📦 Proyecto: mini-crud0 (Fase 1) — ⬇️ Descargar ZIP · ☁️ Abrir en Codespace

Explicación del MODELO (DAO/VO) por dentro

Vamos a describir cómo organizamos la capa Modelo y por qué esta decisión nos va a facilitar el mantenimiento, la escalabilidad y la futura conexión a base de datos.

1) Paquete modelo.vo – Value Object (VO)

Qué es y para qué sirve:

Trabajaremos con clases simples que encapsulan datos y comportamientos mínimos asociados. Al usar VO, vamos a transportar información entre capas sin pasar muchos parámetros sueltos, y vamos a estabilizar la interfaz aunque más adelante agreguemos atributos.

Nuestra clase VO: PersonaVO

  • Tendrá dos atributos (como venimos usando): codigo (int) y nombre (String)
  • Incluye constructores, getters, setters y toString(). Con esto:
    • Vamos a crear objetos persona de forma clara (p.ej. new PersonaVO(101, "Ana"))
    • Vamos a mantener el contrato de datos estable aunque luego agreguemos, por ejemplo, email o fechaAlta

Beneficios inmediatos que tendremos:

  • Vamos a minimizar cambios en capas superiores cuando cambien los datos
  • Vamos a simplificar la creación y lectura de registros en cualquier controlador o DAO

2) Paquete modelo.dao – Data Access Object (DAO)

Qué es y para qué sirve:

El DAO centraliza el acceso a datos. En este tutorial, vamos a usar memoria (un ArrayList) para enfocarnos en el flujo MVC. Más adelante, vamos a cambiar la fuente de datos a una base real vía JDBC sin tocar el controlador ni las vistas; solo vamos a reemplazar o evolucionar el DAO.

Nuestra clase DAO: PersonaDAO

Mantendrá una lista ArrayList<PersonaVO> y expondrá operaciones básicas:

  • agregar(PersonaVO vo) → vamos a registrar una nueva persona
  • getLista() → vamos a recuperar todas las personas para la vista

Código completo del PersonaDAO:

El código lo dejamos a continuación, para tenerlo presente, en realidad ya lo hemos analizado en la unidad anterior, no tiene nada nuevo:

package modelo.dao;

import modelo.vo.PersonaVO;
import java.util.ArrayList;

public class PersonaDAO {
    private ArrayList<PersonaVO> lista;

    public PersonaDAO() {
        lista = new ArrayList<>();
    }

    public String agregar(PersonaVO p) {
        lista.add(p);
        return "Persona agregada correctamente.";
    }

    public ArrayList<PersonaVO> getLista() {
        return lista;
    }

    public boolean estaPersona(int cod) {
        for (PersonaVO p : lista) {
            if (p.getCodigo() == cod) {
                return true;
            }
        }
        return false;
    }

    public PersonaVO devolver(int pos) {
        if (pos >= 0 && pos < lista.size()) {
            return lista.get(pos);
        }
        return null;
    }

    public String eliminar(int codigo) {
        for (PersonaVO p : lista) {
            if (p.getCodigo() == codigo) {
                lista.remove(p);
                return "Persona eliminada.";
            }
        }
        return "Persona no encontrada.";
    }

    public int cantidad() {
        return lista.size();
    }

    public PersonaVO obtenerXCodigo(int cod) {
        for (PersonaVO p : lista) {
            if (p.getCodigo() == cod) {
                return p;
            }
        }
        return null;
    }

    public String actualizar(PersonaVO p) {
        for (int i = 0; i < lista.size(); i++) {
            if (lista.get(i).getCodigo() == p.getCodigo()) {
                lista.set(i, p);
                return "Persona actualizada.";
            }
        }
        return "Persona no encontrada.";
    }
}

¿Por qué así y no de otra forma?

  • Vamos a aislar la lógica de validación y persistencia. Cuando cambiemos a JDBC:
    • agregar() hará INSERT en la base
    • getLista() hará SELECT y mapeará filas a PersonaVO
    • El resto de la app no cambiará (controlador y vistas seguirán igual)

3) Evolución natural: pasar de memoria a JDBC

Cuando decidamos persistir en base de datos, vamos a mantener la interfaz de PersonaDAO, y solo vamos a cambiar su implementación:

agregar(PersonaVO vo):

  • Registrar el driver JDBC (si no lo maneja un pool)
  • Abrir conexión (DriverManager.getConnection(...) o DataSource)
  • Preparar PreparedStatement con INSERT INTO personas(codigo, nombre) VALUES (?, ?)
  • Ejecutar y cerrar recursos en finally o con try-with-resources

getLista():

  • Ejecutar SELECT codigo, nombre FROM personas ORDER BY codigo
  • Recorrer ResultSet, crear PersonaVO por fila, agregarlos a una lista y devolverla

4) Buenas prácticas que ya estamos aplicando (y reforzaremos)

  • Encapsulamiento de datos en PersonaVO
  • Separación de responsabilidades con PersonaDAO (acceso a datos) y el Servlet (flujo)
  • PRG (Post-Redirect-Get) en el controlador para evitar reenvíos
  • Rutas relativas robustas con ${pageContext.request.contextPath} (EL) en las vistas
  • Contrato estable (métodos agregar, getLista) que nos permitirá refactorizar a JDBC sin romper el resto

Continuemos con CONTROLADOR- PersonaControladorServlet2


📋 Palabras clave

PersonaDAO · PersonaVO · Value Object · Data Access Object · ArrayList · agregar · getLista · eliminar · actualizar · obtenerXCodigo · Modelo MVC · encapsulamiento


🧠 Autoevaluación — Mini-CRUD con MVC


← PersonaControladorServlet · 🏠 Inicio · PersonaControladorServlet2 →

⚠️ **GitHub.com Fallback** ⚠️