¿Cómo implementamos la operación de lectura en nuestra aplicación?
En esta sección, aprenderemos a implementar la segunda operación del CRUD: la operación de lectura. Este proceso nos permitirá extraer todos los mensajes almacenados en nuestra base de datos y mostrarlos en nuestra aplicación. La operación de lectura es fundamental para cualquier sistema que requiera acceder a datos almacenados y presentarlos al usuario. A continuación, te mostraremos cómo puedes llevar a cabo esto en tu proyecto.
¿Cómo establecemos la conexión a la base de datos?
Para establecer una conexión a la base de datos en nuestra aplicación, seguimos estos pasos fundamentales:
Entrar al archivo de datos: Ingresar al archivo MensajesDAO que contiene los métodos necesarios para interactuar con la base de datos.
Preparar la conexión: Usar métodos previamente definidos para generar la conexión, lo cual puede implicar copiar y pegar instrucciones básicas de conexión.
Connection connection =// Crea tu conexión aquí
Manejo de errores: Implementar un bloque try-catch para manejar posibles errores durante el establecimiento de la conexión.
¿Cómo preparamos y ejecutamos la consulta SQL?
Una vez que tenemos la conexión lista, el siguiente paso es definir y ejecutar la consulta SQL que nos permitirá leer los datos deseados:
Preparar la declaración: Crear un objeto PreparedStatement que contendrá nuestra consulta SQL.
PreparedStatement ps =null;ResultSet rs =null;
Definir la consulta: Escribir la consulta SQL que necesitemos. Por ejemplo, para obtener todos los mensajes:
String query ="SELECT * FROM mensajes";
Ejecutar la consulta: Utilizar el método executeQuery para ejecutar la consulta y almacenar los resultados en un ResultSet.
Mostrar resultados: Imprimir cada campo obtenido para que el usuario pueda visualizar los mensajes almacenados.
Manejo de excepciones: Asegurarse de que cualquier excepción es capturada e informada adecuadamente para garantizar la estabilidad del sistema.
¿Cómo integramos este método en la capa de servicio?
Una vez que el método de lectura ha sido implementado y probado, debemos integrarlo en la capa de servicios para que pueda ser utilizado por nuestra aplicación:
Definir el método en la capa de servicio: Crear un método que llame al método leerMensajesDB desde la capa DAO.
Prueba del sistema: Ejecutar la aplicación y verificar que el flujo de datos desde la base de datos hasta la pantalla del usuario funciona adecuadamente.
Con estos pasos, hemos implementado exitosamente la operación de lectura en nuestro sistema. Practicar y repetir este proceso te ayudará a fortalecer tus habilidades en el manejo de bases de datos. ¡Sigue adelante y no dejes de aprender!
Lo hice un poco mas visual usando JFORM, y este fue el resultado...(en lo personal.....me gusto mucho)
Esta genial!
Quiero intentarlo tambien
wenardo :D
Buen día profesor. La capa DAO es la que está ejecutando la lectura de la base de datos y a su vez es la que está ejecutando los prints de los datos obtenidos. Estos prints deberían ser ejecutados por la capa de servicio para mantener la consistencia de lo que estamos programando. Para ello debemos generar en la capa DAO un arraylist de objetos mensajes y enviarlos a la capa de servicio, y aquí ejecutar el while para hacer los prints.
Por lo tanto, es falsa su afirmación que "hemos aprendido a leer los datos de una base de datos a través de nuestra capa DAO y enviarlos a nuestra capa de servicio". Solo los lee y imprime en la capa DAO.
Totalmente cierto, no entiendo, por qué estos videos no se revisan, corrigen o actualizan.
No me había percatado de eso. Muchas gracias, ya mandé los datos para imprimirlos desde MensajesService :)
No se ustedes muchachos... Pero para mi es emocionante ver este tipo de trabajos funcionando en mi computadora jejej.
Muy chevere la clase!!!
Gracias Profe!!!
Lamentablemente al momento de imprimir los datos en pantalla desde Mensajes DAO ha roto la metodologia en capas. Acaso no es Inicio.java la que interactua con el usuario?
Así es. Son cosas por mejorar. Nosotros lo podemos hacer.
y como quedaria el codigo?
Me parece o se repite la parte del video donde pone el codigo leerMensajesDAO
Asi es. Por eso muchos compañero mencionan que se puede usar el patron singleton en aplicaciones como esta.
si y yo lo reinici e 5 veces xq no entendia q hacia, de donde salio otro mensajeDAO jajajja
Esta fue mi solución para leer los diferentes mensajes dentro de la base de datos
Y en el apartado visual sería recorrer el Array de usuarios en mi caso.
Es muy importante siempre cerrar los objetos para que no quede ese espacio en memoria. Ahorita no ven la diferencia, pero en proyecto a gran escala cada objeto no cerrado adecuadamente hace lenta la aplicacion.
Lo cerramos con el metodo close.
Que tal amigo, en este caso no se estan cerrando por que se esta usando un bloque Try-with-resources, lo que permite evitar el bloque finally donde comunmente se cerrarian los recursos, Saludos jeje.
Y como se pueden cerrar los objetos?
Buenos compañeros, en realidad es una mala practica que hizo el profesor para agregar los prints en la cada DAO en lugar de agregarlos en la capa de servicio, acá les paso como debió ser en la capa DAO creando un arrayList
Y como hubiera sido en la capa de servicio
con el tema de cerrar las conexiones, no se porque razón omitió eso .
Atención producción. El procedimiento de creación de la clase leerMensajesDB se ha repetido nuevamente desde el minuto 1:29 generando la sensación de confusión.
pueden colocar numeros que correspondan al numero de la columna que son cuatro.
Un saludo para todas las personas que ven este video, actualicé el proyecto en mi repositorio de github con buenas prácticas.
Muchas gracias, lo fui a ver y me parece que si mejoró. Como otra mejora creo que se podría implementar la re-utilización de código ya que hay varias lineas que se repiten, como en la conexión.
Tengo una duda, no ahorraría código instanciar la conexión, el Ps y ResulSet al principio del código para evitar crearlos en cada uno de los métodos?
Si, se pueden instanciar en una clase aparte, en este caso se mostró de esa forma para que estudiantes que vienen de aprender lo básico en Java pueda tomar el concepto.
Sí, lo puedes hacer así sin problema. A veces por cuestiones didácticas se toman esas desiciones de código.
bue día equipo, quiero hacer mi aporte, aún estoy algo nuevo en Java, pero hay algo que me llamó la atención es el hecho de que imprime los mensajes en el Dao, yo por el contrario he decidio devolver un array list de mensajes para hacer fácil su manipulación en el service, por favor, denme su feedback para saber si todo quedó bien, gracias
Se le mezclaron las capas puede ser? La parte de mostrarlo no debería hacerlo en MensajesService?
En cierta ocasión del pasado, trabajando con PHP, aprendí un poquito acerca de algo llamado SQL Injection, que consiste básicamente en usar técnicas ingeniosas para inyectar código SQL en parámetros que espere tu aplicación, resultando en problemas de seguridad importantes. Mi pregunta es: ¿Manejar las sentencias directamente sobre el código Java no daría pie a que se puedan efectuar las inyecciones que menciono?
Si usa preparedStatement no porque los valores son escapados antes de llegarle al query. El problema de Sql Injection es cuando armas la consulta concatenando el query con los valores en preparedStatement no pasa eso porque se usa un placeholder:
select * from tabla where name = ?
En java como regla es siempre usar PreparedStatement y usar placeholders ?
¡Muchas gracias por tu ayuda, Fernando!
El objeto conexion, teniendo en cuenta que se usa en mas de un llamado...no seria mejor dejarlo static? para el alcance de los metodos de esa clase?
Y implementé un patrón de diseño singleton para poder solucionar eso.
Estupenda clase instructor Santiago, se entienden claramente los pasos a seguir para desarrollar el método de lectura de datos.
Me encanto esta clase!!!!!!!!!!
Seria mejor crear una solo variable de conexion y llamarla como variable global antes ir creando una variable local en cada metodo?
No es recomendable crear una variable de conexión como global. Es mejor crear una variable local en cada método para evitar problemas de concurrencia y asegurar la correcta gestión de la conexión.
Así es, en el repositorio de github le apliqué mejoras al código