Este proyecto corresponde a la actividad AE-4 del Módulo 5, Clase 11, enfocada en la implementación de la capa de acceso a datos dentro de una aplicación web dinámica desarrollada en Java.
La actividad plantea el caso de la empresa ficticia DataTrack Solutions, una startup especializada en análisis de datos empresariales. En este contexto, se solicitó construir una aplicación web que permita gestionar información de clientes y transacciones, utilizando una base de datos MySQL y aplicando el patrón de diseño DAO.
El proyecto fue desarrollado desde cero en IntelliJ IDEA, utilizando Java, Maven, Apache Tomcat 11, JSP, JSTL, Servlets, JDBC y MySQL Workbench.
La finalidad principal fue comprender cómo una aplicación Java Web puede conectarse a una base de datos, separar responsabilidades mediante capas y mostrar los datos consultados en una página web dinámica.
La actividad solicitaba construir la capa de acceso a datos para una aplicación web dinámica de la empresa DataTrack Solutions.
El sistema debía permitir trabajar con dos elementos principales:
- Clientes.
- Transacciones asociadas a clientes.
Para cumplir con esto, se debía crear una base de datos, implementar la conexión desde Java, crear clases DTO, crear clases DAO, probar los métodos de acceso a datos desde un Servlet y mostrar los resultados en una página JSP utilizando JSTL.
Implementar una aplicación web dinámica en Java que utilice JDBC, DAO y DTO para gestionar clientes y transacciones almacenados en una base de datos MySQL.
Los objetivos desarrollados en este proyecto fueron:
- Crear una base de datos llamada
DataTrackDB. - Crear una tabla
Clientes. - Crear una tabla
Transacciones. - Relacionar las transacciones con los clientes mediante una llave foránea.
- Implementar una clase
ConexionDBpara conectar Java con MySQL mediante JDBC. - Aplicar el patrón Singleton en la conexión a la base de datos.
- Crear clases DTO para transportar datos entre capas.
- Crear clases DAO para separar la lógica de acceso a datos.
- Implementar operaciones CRUD para clientes.
- Implementar operaciones de creación y consulta para transacciones.
- Probar la implementación mediante un Servlet llamado
TestDAO. - Mostrar los datos en una página JSP utilizando JSTL.
- Agregar formularios para registrar clientes y transacciones desde la interfaz web.
- Aplicar diseño básico responsivo.
- Considerar buenas prácticas de seguridad y tratamiento responsable de datos.
Para desarrollar este proyecto se utilizaron las siguientes tecnologías y herramientas:
- Java
- Jakarta EE
- Apache Tomcat 11
- Maven
- MySQL
- MySQL Workbench
- JDBC
- Servlet
- JSP
- JSTL
- HTML
- CSS
- IntelliJ IDEA
- Git
- GitHub
La estructura principal del proyecto quedó organizada de la siguiente forma:
DataTrackDAO
│
├── src
│ └── main
│ ├── java
│ │ └── com.datatrack
│ │ ├── config
│ │ │ └── ConexionDB.java
│ │ │
│ │ ├── dao
│ │ │ ├── ClienteDAO.java
│ │ │ └── TransaccionesDAO.java
│ │ │
│ │ ├── dto
│ │ │ ├── ClienteDTO.java
│ │ │ └── TransaccionesDTO.java
│ │ │
│ │ └── servlet
│ │ └── TestDAO.java
│ │
│ └── webapp
│ ├── index.jsp
│ └── resultado.jsp
│
├── pom.xml
├── .gitignore
├── mvnw
└── mvnw.cmd
Organización por paquetes
El proyecto fue organizado en paquetes para separar responsabilidades.
Paquete config
Contiene la clase encargada de la conexión a la base de datos.
Paquete dto
Contiene las clases DTO, utilizadas para transportar datos entre las distintas capas del proyecto.
Paquete dao
Contiene las clases DAO, encargadas de realizar operaciones sobre la base de datos.
Paquete servlet
Contiene el Servlet principal de prueba.
Base de datos, contiene dos tablas principales:
- Clientes
-Transacciones
Tabla Clientes
La tabla Clientes almacena los datos básicos de cada cliente
Campos de la tabla Clientes
Campo Tipo de dato Descripción
id_cliente INT Identificador único del cliente. Es llave primaria y autoincremental.
nombre VARCHAR(100) Nombre del cliente.
email VARCHAR(100) Correo electrónico del cliente.
Tabla Transacciones
La tabla Transacciones almacena las transacciones asociadas a los clientes.
Campos de la tabla Transacciones
Campo Tipo de dato Descripción
id_transacciones INT Identificador único de la transacción. Es llave primaria y autoincremental.
id_cliente INT Identificador del cliente asociado a la transacción.
monto DECIMAL(10,2) Monto de la transacción.
fecha DATE Fecha de la transacción.
La tabla Transacciones se relaciona con la tabla Clientes mediante el campo id_cliente.
Relación entre tablas
La relación entre las tablas es la siguiente:
Un cliente puede tener muchas transacciones.
Cada transacción pertenece a un cliente existente.
Esta relación se implementó mediante una llave foránea.
Usuario de base de datos
Para evitar utilizar directamente el usuario root, se creó un usuario específico para este proyecto.
Este usuario tiene permisos limitados solamente sobre la base de datos DataTrackDB.
Los permisos asignados fueron:
SELECT
INSERT
UPDATE
DELETE
Esto permite que la aplicación pueda consultar, registrar, modificar y eliminar datos dentro de la base de datos del proyecto, sin afectar otras bases de datos.
Limpieza de datos de prueba
Durante las pruebas se generaron registros repetidos. Para limpiar la base de datos y reiniciar los identificadores
Se usa primero Transacciones y luego Clientes, ya que las transacciones dependen de los clientes por la llave foránea.
Configuración de Maven
El proyecto utiliza Maven para administrar dependencias y empaquetar la aplicación como archivo .war.
El archivo principal de configuración es:
pom.xml
En este archivo se configuraron las dependencias necesarias para trabajar con:
Servlets.
JSP.
JSTL.
MySQL Connector/J.
Empaquetado WAR.
Dependencias principales utilizadas
Servlet API
Permite trabajar con Servlets en Tomcat 11.
JSP API
Permite trabajar con páginas JSP
JSTL
Permite usar etiquetas como c:forEach, c:if, c:choose, entre otras
MySQL Connector/J
Permite conectar Java con MySQL mediante JDBC.
Conexión a la base de datos
La conexión se implementó en la clase:
ConexionDB.java
Ubicación:
src/main/java/com/datatrack/config/ConexionDB.java
Esta clase centraliza la conexión entre Java y MySQL utilizando JDBC.
También se aplicó el patrón Singleton, para mantener un único punto de acceso a la conexión y evitar crear conexiones innecesarias desde distintas partes de la aplicación.
Clase ConexionDB
La clase ConexionDB cumple las siguientes funciones:
Definir la URL de conexión.
Definir el usuario de base de datos.
Definir la contraseña del usuario.
Cargar el driver JDBC de MySQL.
Retornar una conexión activa.
Aplicar el patrón Singleton mediante un constructor privado y un atributo estático de conexión.
Esta clase permite que los DAO puedan obtener una conexión sin repetir código de conexión en cada clase.
Patrón Singleton
El patrón Singleton se aplicó en ConexionDB para centralizar la conexión a la base de datos.
Esto ayuda a:
Evitar duplicación de código.
Mantener un único punto de acceso a la conexión.
Mejorar la organización del proyecto.
Facilitar el mantenimiento del código.
Patrón DTO
DTO significa Data Transfer Object.
Los DTO permiten transportar datos entre capas sin incluir lógica de base de datos.
ClienteDTO
La clase ClienteDTO representa los datos de un cliente.
Esta clase incluye:
Constructor vacío.
Constructor con nombre y email.
Constructor con id, nombre y email.
Métodos getter y setter.
TransaccionesDTO
La clase TransaccionesDTO representa los datos de una transacción.
Esta clase incluye:
Constructor vacío.
Constructor para crear una transacción nueva.
Constructor para cargar una transacción desde la base de datos.
Métodos getter y setter.
Se utilizó BigDecimal para representar montos, ya que es una opción más adecuada para valores monetarios que double.
Se utilizó LocalDate para representar fechas de manera clara dentro de Java.
Patrón DAO
DAO significa Data Access Object.
El patrón DAO permite separar la lógica de acceso a datos del resto de la aplicación.
La idea principal es que el Servlet y las JSP no realicen consultas SQL directamente. Esa responsabilidad queda dentro de los DAO
Ventajas del patrón DAO
El uso del patrón DAO ayuda a:
Mantener el código más ordenado.
Separar la lógica de negocio de la lógica de base de datos.
Evitar repetir consultas SQL en distintas partes del proyecto.
Facilitar cambios futuros en la base de datos.
Mejorar la mantenibilidad del proyecto.
Hacer más clara la estructura por capas.
ClienteDAO
La clase ClienteDAO trabaja con la tabla Clientes
crearCliente
Permite insertar un nuevo cliente en la base de datos.
Utiliza una consulta SQL INSERT y recibe un objeto ClienteDTO.
actualizarCliente
Permite modificar el nombre y correo de un cliente existente.
Utiliza una consulta SQL UPDATE.
eliminarCliente
Permite eliminar un cliente según su identificador.
Utiliza una consulta SQL DELETE.
obtenerCliente
Permite buscar un cliente por su identificador.
Utiliza una consulta SQL SELECT.
listarClientes
Permite obtener todos los clientes registrados en la base de datos.
Este método fue agregado para mostrar la información en la página JSP.
TransaccionesDAO
La clase TransaccionesDAO trabaja con la tabla Transacciones.
crearTransaccion
Permite insertar una nueva transacción en la base de datos.
Recibe un objeto TransaccionesDTO.
obtenerTransaccionesPorCliente
Permite consultar las transacciones asociadas a un cliente específico.
listarTransacciones
Permite obtener todas las transacciones registradas.
Este método fue agregado para mostrar la información general en la página JSP.
Uso de PreparedStatement
En los DAO se utilizó PreparedStatement para ejecutar las consultas SQL.
Esto es importante porque:
Evita concatenar directamente datos ingresados por el usuario.
Reduce riesgos asociados a inyección SQL.
Permite enviar parámetros a las consultas de forma más segura y ordenada.
Mejora la legibilidad del código.
Servlet TestDAO
Este Servlet actúa como controlador principal de la aplicación.
Funciones del Servlet TestDAO
El Servlet TestDAO permite:
Ejecutar la prueba DAO.
Insertar datos iniciales si la tabla está vacía.
Consultar clientes desde la base de datos.
Consultar transacciones desde la base de datos.
Registrar clientes nuevos desde un formulario.
Registrar transacciones nuevas desde un formulario.
Enviar la información a la página resultado.jsp.
Métodos HTTP utilizados
El Servlet utiliza dos métodos principales:
doGet
Se utiliza para cargar la página y mostrar los datos registrados.
doPost
Se utiliza para recibir formularios enviados desde la página JSP.
El método doPost identifica qué acción se debe realizar mediante un campo oculto llamado accion.
Formularios implementados
En la página resultado.jsp se agregaron dos formularios:
Formulario para agregar cliente.
Formulario para agregar transacción.
index.jsp
La página index.jsp es la página inicial del proyecto.
Contiene:
Título del proyecto.
Breve descripción.
Botón para ejecutar la prueba DAO.
resultado.jsp
La página resultado.jsp es la vista principal donde se muestran los datos.
Contiene:
Mensaje de ejecución.
Formulario para agregar nuevo cliente.
Formulario para agregar nueva transacción.
Tabla de clientes registrados.
Tabla de transacciones registradas.
Sección de buenas prácticas aplicadas.
Uso de JSTL
En resultado.jsp se utilizó JSTL para mostrar los datos enviados desde el Servlet.
Funcionalidades implementadas
El proyecto permite realizar las siguientes acciones:
1. Visualizar clientes
Se muestran todos los clientes registrados en la tabla Clientes.
2. Visualizar transacciones
Se muestran todas las transacciones registradas en la tabla Transacciones.
3. Agregar cliente
El usuario puede registrar un nuevo cliente desde la página web.
Datos solicitados:
Nombre.
Email.
4. Agregar transacción
El usuario puede registrar una nueva transacción para un cliente existente.
Datos solicitados:
Cliente.
Monto.
Fecha.
5. Cargar datos iniciales
Si la tabla de clientes está vacía, el sistema carga clientes y transacciones de prueba.
6. Mostrar mensajes de resultado
La página muestra mensajes como:
Cliente registrado correctamente.
Transacción registrada correctamente.
Error al procesar la solicitud, si ocurre un problema.
Validaciones aplicadas
En el Servlet se agregaron validaciones básicas.
Para clientes:
El nombre no puede estar vacío.
El email no puede estar vacío.
Para transacciones:
Debe seleccionarse un cliente.
El monto no puede estar vacío.
La fecha no puede estar vacía.
El monto debe ser mayor a cero.
Diseño visual
Se agregó CSS directamente en las páginas JSP para mejorar la presentación visual.
El diseño incluye:
Encabezado principal.
Fondo claro.
Tarjetas para separar secciones.
Tablas ordenadas.
Botones visibles.
Formularios simples.
Campos de texto estilizados.
Diseño responsivo básico.
Responsividad
Se incluyeron media queries para mejorar la visualización en pantallas más pequeñas.
Buenas prácticas aplicadas
Durante el desarrollo del proyecto se aplicaron buenas prácticas básicas:
Separación del proyecto en paquetes.
Uso de patrón DAO.
Uso de patrón DTO.
Uso de clase de conexión centralizada.
Uso de patrón Singleton en la conexión.
Uso de PreparedStatement.
Uso de Maven para dependencias.
Uso de Tomcat para ejecutar la aplicación web.
Uso de JSP y JSTL para mostrar datos.
Uso de formularios para insertar datos.
Validación básica de entradas.
Creación de usuario de base de datos específico para el proyecto.
Permisos limitados para el usuario de base de datos.
Uso de .gitignore para evitar subir archivos innecesarios.
Organización del código para facilitar mantenimiento.
Consideraciones sobre seguridad
El proyecto trabaja con datos básicos como nombre, correo y transacciones.
Aunque es un proyecto académico, se aplicaron medidas básicas de seguridad:
No se usa directamente el usuario root desde Java.
Se creó un usuario específico para la aplicación.
El usuario tiene permisos limitados sobre una sola base de datos.
Se utiliza PreparedStatement para evitar concatenar datos directamente en SQL.
Se validan campos antes de insertar información.
No se solicitan datos sensibles innecesarios.
Consideraciones sobre cumplimiento legal en Chile
El proyecto considera buenas prácticas relacionadas con el tratamiento responsable de datos personales, ya que se trabaja con información como nombres y correos electrónicos.
Aunque se trata de una aplicación académica y con datos de prueba, se procuró:
Solicitar solo datos necesarios para el funcionamiento del sistema.
Evitar el uso de datos sensibles.
Utilizar un acceso controlado a la base de datos.
Aplicar medidas básicas de seguridad en consultas SQL.
Mantener una estructura clara que facilite futuras mejoras de seguridad.
En un sistema real, sería necesario complementar este trabajo con políticas de privacidad, control de acceso, registro de consentimiento, gestión de usuarios, auditoría y medidas adicionales de protección de datos.
Cómo ejecutar el proyecto
Requisitos previos
Para ejecutar el proyecto se necesita tener instalado:
Java.
IntelliJ IDEA.
Apache Tomcat 11.
MySQL Server.
MySQL Workbench.
Maven.
Aprendizaje obtenido
Con este proyecto reforcé el uso de la capa de acceso a datos en una aplicación Java Web.
Aprendí a conectar una aplicación Java con una base de datos MySQL utilizando JDBC, organizar el código mediante DAO y DTO, trabajar con Servlets, mostrar información en JSP utilizando JSTL y ejecutar el proyecto con Tomcat.
También pude comprender mejor la importancia de separar responsabilidades dentro de una aplicación. La conexión queda en una clase específica, las consultas SQL quedan dentro de los DAO, los datos se transportan mediante DTO, el Servlet coordina la lógica y la JSP se encarga de mostrar la información al usuario.
Además, durante el desarrollo resolví errores reales de configuración y conexión, lo que permitió comprender mejor cómo se relacionan IntelliJ IDEA, Tomcat, MySQL Workbench y el código Java.
Reflexión sobre el patrón DAO
El uso del patrón DAO mejora la organización del proyecto porque permite separar la lógica de acceso a datos del resto de la aplicación.
En lugar de escribir consultas SQL directamente en el Servlet o en la JSP, estas consultas quedan en clases específicas como ClienteDAO y TransaccionesDAO.
Esto hace que el proyecto sea más fácil de mantener, porque si en el futuro cambia la estructura de la base de datos o se necesita modificar una consulta, se puede hacer desde el DAO sin afectar directamente la vista o el Servlet.
Reflexión sobre el patrón DTO
El patrón DTO resultó útil porque permite transportar datos de forma ordenada entre las capas del proyecto.
Por ejemplo, un cliente se representa mediante ClienteDTO, que contiene su id, nombre y email. Una transacción se representa mediante TransaccionesDTO, que contiene su id, cliente asociado, monto y fecha.
Esto evita trabajar con datos sueltos en muchas partes del proyecto y permite que el código sea más claro.
Reflexión sobre la separación de capas
Separar la aplicación en capas ayuda a mantener una estructura más ordenada.
En este proyecto se identifican claramente las siguientes responsabilidades:
ConexionDB: conexión a la base de datos.
DTO: transporte de datos.
DAO: operaciones con la base de datos.
Servlet: control de solicitudes.
JSP: presentación visual de los datos.
Esta separación permite que cada parte tenga una responsabilidad específica y que el proyecto sea más fácil de entender y mejorar.
Observación personal sobre el desarrollo
Este proyecto fue desarrollado de manera individual, siguiendo las instrucciones de la actividad AE-4 del Módulo 5, Clase 11.
Mi principal forma de comunicación con los profesores es la escritura, por lo que este README fue elaborado de manera detallada para explicar claramente qué se hizo, cómo se organizó el proyecto, qué tecnologías se utilizaron, cómo se creó la base de datos, cómo se ejecuta la aplicación y qué aprendizajes se obtuvieron.
La intención de este documento es que el proyecto pueda ser comprendido al revisar el repositorio, incluso sin una explicación verbal adicional.
Estado actual del proyecto
El proyecto se encuentra funcional.
Actualmente permite:
Conectarse a MySQL.
Crear clientes.
Crear transacciones.
Listar clientes.
Listar transacciones.
Mostrar datos en JSP usando JSTL.
Ejecutarse en Tomcat 11.
Registrar datos desde formularios web.
Mantener una estructura organizada por capas.
Autoría
Trabajo desarrollado de forma individual para el Módulo 5, Clase 11, Actividad AE-4.
Proyecto académico orientado a la implementación de la capa de acceso a datos en una aplicación web dinámica Java.