Ejemplo: CRUD Alumnos (parte 3)

Terminamos de diseñar el formulario para gestionar los alumnos. Ahora se pide confirmar que queremos borrar alumnos, se guardan los datos en el sistema, y la barra de estado funciona correctamente.

Hay una versión nueva de este curso. Haz clic aquí para revisar JDBC, la versión actualizada de este curso.

En esta ocasión, nos centramos en completar la funcionalidad de una aplicación Java para gestionar registros de alumnos, con una interfaz gráfica que permita guardar, modificar y borrar datos en una base de datos. Partimos de un panel que ya estaba parcialmente implementado, pero que necesitaba que el botón de guardar realmente almacenase los datos y que el botón de borrar eliminase registros tras una confirmación.

Para comenzar, abordamos la lógica del botón guardar. La idea es que, al pulsarlo, se extraigan los datos introducidos en los campos y se inserte un nuevo alumno o se actualice uno existente en la base de datos. Para distinguir si un alumno es nuevo o modificado, utilizamos el identificador del alumno: si el ID es null, se trata de un alumno nuevo y se realiza un insert; si no, se hace un update. Esto se basa en que al añadir un alumno nuevo, el objeto alumno se inicializa con ID null.

Un detalle importante que descubrimos es que el campo de fecha de nacimiento, implementado con un JFormattedTextField, no actualiza su valor hasta que pierde el foco. Por eso, al pulsar guardar sin que el campo haya perdido el foco, el valor obtenido era null. Para solucionar esto, antes de obtener el valor con getValue(), llamamos a commitEdit(), que fuerza la actualización del contenido del campo. Esto implica manejar excepciones, ya que commitEdit() puede lanzar una ParseException.

Con esta corrección, al crear un alumno nuevo y pulsar guardar, obtenemos un objeto alumno con todos los datos correctamente capturados y con ID null. Si editamos un alumno existente y modificamos su nombre, al guardar el ID permanece, indicando que se trata de una actualización.

El siguiente paso es implementar la lógica para guardar o modificar el alumno en la base de datos. Si el alumno es nuevo, llamamos al método insertar del DAO; si es existente, usamos modificar. Tras guardar, limpiamos los campos del formulario, reseteamos el objeto alumno a null y actualizamos la tabla que muestra los alumnos. Para que la tabla refleje los cambios, es necesario llamar a fireTableDataChanged() en el modelo de la tabla, lo que notifica a la vista que debe redibujarse.

En cuanto a la funcionalidad de borrar, creamos un método que primero muestra un cuadro de diálogo de confirmación con JOptionPane.showConfirmDialog(), preguntando al usuario si está seguro de eliminar el alumno seleccionado. Si el usuario confirma, obtenemos el alumno seleccionado y llamamos al método eliminarAlumno del DAO. Luego actualizamos el modelo y la tabla para reflejar la eliminación. Es importante tener en cuenta que, en un caso real, habría que gestionar las relaciones en cascada, por ejemplo, si el alumno está matriculado en asignaturas, para evitar datos huérfanos.

Para mejorar la experiencia de usuario, añadimos una barra de estado que muestra mensajes como actualizando modelo o eliminando datos. Esto se hace creando métodos de apoyo que actualizan el texto de la barra de progreso antes de realizar operaciones de carga, guardado o borrado de datos. Aunque en un entorno local estas operaciones son muy rápidas y el cambio apenas se percibe, esta práctica es útil para aplicaciones con operaciones más lentas.

Finalmente, mencionamos que esta misma estructura y lógica se aplicará para gestionar otros registros, como profesores y asignaturas, en futuros desarrollos. Así, consolidamos un patrón para manejar CRUDs con interfaz gráfica y base de datos, facilitando la ampliación y mantenimiento de la aplicación.

Lista de reproducción
  1. 1
    Presentación de JDBC
    4 minutos
  2. 2
    Instalando MySQL
    7 minutos
  3. 3
    Creando tablas
    9 minutos
  4. 4
    Agregando el driver JAR
    7 minutos
  5. 5
    Estableciendo la conexión
    8 minutos
  6. 6
    Statement y ResultSet
    9 minutos
  7. 7
    Bobby Tables y PreparedStatement
    8 minutos
  8. 8
    Transacciones y MySQL
    6 minutos
  9. 9
    Transacciones, commits y rollbacks (parte 1)
    7 minutos
  10. 10
    Transacciones, commits y rollbacks (parte 2)
    6 minutos
  11. 11
    Ejemplo: Crear modelos
    9 minutos
  12. 12
    Ejemplo: Crear los DAO (parte 1)
    10 minutos
  13. 13
    Ejemplo: Crear los DAO (parte 2)
    12 minutos
  14. 14
    Ejemplo: Crear los DAO (parte 3)
    13 minutos
  15. 15
    Ejemplo: DAO Manager
    12 minutos
  16. 16
    Ejemplo: CRUD Alumnos (parte 1)
    15 minutos
  17. 17
    Ejemplo: CRUD Alumnos (parte 2)
    14 minutos
  18. 18
    Ejemplo: CRUD Alumnos (parte 3)
    13 minutos
  19. 19
    Ejemplo: CRUD Profesores
    25 minutos
  20. 20
    Ejemplo: CRUD Asignaturas
    alrededor de 1 hora
  21. 21
    Ejemplo: Login (final adelantado)
    17 minutos
  22. 22
    Conectar a PostgreSQL en Java con JDBC
    8 minutos
  23. 23
    Conectar a PostgreSQL en Kotlin con JDBC
    7 minutos
  24. 24
    Conectar a PostgreSQL en Java con JDBC (con NetBeans)
    10 minutos