Lo hice un poco mas visual usando JFORM, y este fue el resultado…(en lo personal…me gusto mucho)
Conocer y entender la persistencia de datos
¿Cómo empezar? Persistencia de datos y bases de datos relacionales
Conociendo algunas bases de datos relacionales: MySQL, PostgreSQL, Oracle
Diseñar y crear BD
Instalación de MySQL
Diseñando nuestra base de datos
Creando nuestra base de datos usando DDL
Instalación de Netbeans
Realizar operaciones CRUD y generar conexión
Creación del proyecto en Java
Conexión a MySQL desde Java
Control de versiones con Git y GitLab
Flujo y lógica de la aplicación
CRUD: inserción de datos
CRUD: lectura de datos
CRUD: eliminación de datos
CRUD: actualización de datos
Persistencia en API rest
API REST y métodos HTTP
Conociendo algunas APIs
Creación del proyecto y API KEY
Listando datos de APIs públicas
Mostrar datos de la API en la aplicación
Guardando datos en APIs públicas
Listar datos guardados
Mostrar favoritos
Eliminar datos de la API
Cierre del curso y próximos pasos
¿Qué aprender ahora?
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Santiago Bernal
Aportes 36
Preguntas 6
Lo hice un poco mas visual usando JFORM, y este fue el resultado…(en lo personal…me gusto mucho)
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.
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?
Esta fue mi solución para leer los diferentes mensajes dentro de la base de datos
dentro de la clase messagesServices
static void messagesList(){
System.out.println("---------------------------------");
System.out.println("MESSAGE");
ArrayList<Messages> messages = MessagesDAO.readMessage();
for (Messages message:messages) {
System.out.println("id: " + message.getMessageId());
System.out.println("Message: " + message.getMessage());
System.out.println("Author: " + message.getMessageAuthor());
System.out.println("Date: " + message.getMessageDate());
}
}
y dentro de la clase MessagesDAO
public static ArrayList<Messages> readMessage(){
ConnectionToDB connectionToDB = new ConnectionToDB();
ArrayList<Messages> messages = new ArrayList<Messages>();
try {
Connection connection = connectionToDB.getConnection();
String sql = "SELECT * FROM messages";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()){
Messages message = new Messages();
message.setMessageId(rs.getInt("id_message"));
message.setMessage(rs.getString("message"));
message.setMessageAuthor(rs.getString("autor"));
message.setMessageDate(rs.getDate("date"));
messages.add(message);
}
} catch (SQLException e){
e.printStackTrace();
System.out.println(e);
}
return messages;
}
Me parece o se repite la parte del video donde pone el codigo leerMensajesDAO
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.
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.
while(rs.next()){
System.out.println("ID: " + rs.getInt(1));
System.out.println("Mensaje: " + rs.getString(2));
System.out.println(“Autor: " + rs.getString(3));
System.out.println(“Fecha: " + rs.getString(4));
System.out.println(”\n”);
}
pueden colocar numeros que correspondan al numero de la columna que son cuatro.
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
Un saludo para todas las personas que ven este video, actualicé el proyecto en mi repositorio de github con buenas prácticas.
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
MessageDao
public static ArrayList<Message> getMessages() {
DBConnection dbConnection = new DBConnection();
ArrayList<Message> messages = new ArrayList<>();
try (Connection conn = dbConnection.getConnection()) {
PreparedStatement ps = null;
try {
ResultSet rs = null;
String query = "SELECT * FROM messages";
ps = conn.prepareStatement(query);
rs = ps.executeQuery();
while (rs.next()) {
Message message = new Message();
message.setId(rs.getInt("id"));
message.setMessage(rs.getString("message"));
message.setAuthor(rs.getString("author"));
messages.add(message);
}
} catch (SQLException ex) {
System.out.println(ex);
}
} catch (SQLException e) {
System.out.println(e);
}
return messages;
}
MessageService
public static void listMessages() {
ArrayList<Message> messages = MessageDAO.getMessages();
if (messages.size() == 0) {
System.out.println("no messages");
return;
}
for (Message message : messages) {
System.out.println("id: " + message.getId());
System.out.print("| author: " + message.getAuthor());
System.out.print("| message: " + message.getMessage());
}
}
Tal y como los compañeros dicen, separé puse los prints en Services y no en DAO, esta fue mi manera:
DAO:
public static ArrayList<Message> readMessagesDB() {
ArrayList<Message> allMessages = new ArrayList<>();
try (Connection connect = ConnectDatabase.getConnection()){
PreparedStatement ps = null;
ResultSet rs = null;
try {
String query = "SELECT * FROM messages";
ps = connect.prepareStatement(query);
rs = ps.executeQuery();
while (rs.next()) {
Message currentMessage = new Message();
currentMessage.setMessageID(rs.getInt("message_id"));
currentMessage.setMessage(rs.getString("message"));
currentMessage.setMessageAuthor(rs.getString("message_author"));
allMessages.add(currentMessage);
}
} catch (SQLException ex) {
System.out.println(ex);
}
} catch (SQLException e) {
System.out.println(e);
}
return allMessages;
}
Services:
public static void listMessage() {
ArrayList<Message> messagesList = DAOMessages.readMessagesDB();
for (Message currentMessage:messagesList) {
System.out.println("ID: " + currentMessage.getMessageID());
System.out.println("Message: " + currentMessage.getMessage());
System.out.println("Author: " + currentMessage.getMessageAuthor());
}
}
Se le mezclaron las capas puede ser? La parte de mostrarlo no debería hacerlo en MensajesService?
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?
Estupenda clase instructor Santiago, se entienden claramente los pasos a seguir para desarrollar el método de lectura de datos.
Me encanto esta clase!!!
Que lindo poder ir adquiriendo conocimientos nuevos!!
Acá muestro los datos con un JOptionPanel .😊
¡Hola tú!
Quizás viste que lo ideal es que se impriman los datos desde la capa del servicio, ya que como está en el vídeo está imprimiendo los datos desde la capa de DAO, así que cambié un poco el código para imprimir los datos desde la capa de servicio, así que lo realicé de esta forma por si te interesa:
MessageDAO
public static ArrayList readMessageDB(){
Database connection = new Database();
PreparedStatement ps = null;
ResultSet results = null;
ArrayList<Message> listReturn = new ArrayList<>();
try (Connection cnx = connection.GetConnection()){
String query = "SELECT * FROM MESSAGES";
ps = cnx.prepareStatement(query);
/* Este método es similar a executeUpdate, la diferencia es que Query no tiene transacción,
* es decir, solo se piden datos */
results = ps.executeQuery();
while(results.next()){
int id_message = results.getInt("ID_MESSAGE");
String message = results.getString("MESSAGE");
String author = results.getString("AUTHOR_MESSAGE");
String datetime = results.getString("DATETIME_MESSAGE");
Message messageObject = new Message(id_message, message, author, datetime);
listReturn.add(messageObject);
}
return listReturn;
}
catch (SQLException e){
System.out.println("Unexpected error: "+e);
return listReturn;
}
}
listMessage
public static void listMessage() {
ArrayList result = MessageDAO.readMessageDB();
/* Itera el ArrayList con el método toString con polimorfismo */
for (Object element: result) {
System.out.println(element);
}
System.out.println("\n");
}
También apliqué polimorfismo en la clase Message para el método toString:
Message
@Override
public String toString() {
return
"ID: " + getId_message() + "\n" +
"Message: " + getMessage() + "\n" +
"Autor: " + getAuthorMessage() + "\n" +
"Datetime: " + getDatetimeMessage() + "\n";
}
Me está gustando el curso, he ido implementando las sugerencias de estudiantes màs avanzados. Gracias.
Yo la parte de la impresión en pantalla la hice en el service
CRUD
C -> Create
R -> Read
U -> Update
D -> Delete
Si a alguien le dio error en lo de la fecha se puede realizar lo siguiente, mejorando un poco más el código:
Esta es la parte de la inserción de datos. (MensajesDAO.java)
String sql = "INSERT INTO mensajes (mensaje, autor_mensaje, fecha_mensaje) VALUES ('"+ mensaje.getMensaje() + "', '"+ mensaje.getAutorMensaje() +"', '"+ mensaje.getFechaMensaje() +"') ";
statement = conexion.prepareStatement(sql);
statement.execute(sql);
System.out.println("Mensaje creado correctamente");
Hay que modificar la fecha en la clase de Mensajes.java
private LocalDateTime fechaMensaje;
// getters and setters
public LocalDateTime getFechaMensaje() {
return fechaMensaje;
}
public void setFechaMensaje(LocalDateTime fechaMensaje) {
this.fechaMensaje = fechaMensaje;
}
Y en MensajesServices.java
Mensajes registro = new Mensajes();
registro.setMensaje(mensaje);
registro.setAutorMensaje(nombre);
registro.setFechaMensaje(LocalDateTime.now());
MensajesDAO.crearMensajeDB(registro);
También a la hora de listar se utiliza lo siguiente, para que la fecha aparezca tal cual.
System.out.println("Fecha: " + rs.getTimestamp("fecha_mensaje").toLocalDateTime());
Para solucionar que la capa DAO no se encargue de mostrar los mensajes sino esto lo haga la capa de servicio hice que el metodo listarMensajesDB() devolvierá un ArrayList<Mensajes> y que dentro en lugar de imprimir el contendio de rs se creara un mensaje y se almacenara en el arraylist.
Asi luego se recibia ese arraylist en la capa de servicio y se muestra como uno desee.
Me encanta todo el curso, muchas gracias
Excelente curso esta super explicado
Listo!
Genial.
Listo 😃
muy Buena Clase
😄 me quedo con esto de la persistencia de datos we q interesant
Excelente, nose porque tenia la noción de que java iba a devolver un arreglo (que lo hace) y tocaría recorrerlo con foreach, desconocía esta función.
Llegando a ver los datos, pero siento que algunas explicaciones se contradicen con otros cursos.
como que se repite lo de leer mensaje
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?