No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

CRUD: lectura de datos

12/25
Recursos

Aportes 36

Preguntas 6

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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!!!

para retornar los datos a la capa de servicios, el DAO me quedó así: ```js public static ArrayList<MensajesModel> leerMensajesDB() { Conexion dbConnect = new Conexion(); PreparedStatement ps = null; ResultSet rs = null; ArrayList mensajes = new ArrayList<MensajesModel>(); try (Connection conexion = dbConnect.getConnection()){ String query = "SELECT * FROM mensajes"; ps = conexion.prepareStatement(query); rs=ps.executeQuery(); while(rs.next()){ MensajesModel message = new MensajesModel(); message.setId_mensaje(rs.getInt("id_mensaje")); message.setMensaje(rs.getString("mensaje")); message.setAutor_mensaje(rs.getString("autor_mensaje")); message.setFecha_mensaje(rs.getString("fecha_mensaje")); mensajes.add(message); } }catch(SQLException e){ System.out.println(e); } return mensajes; } ``` public static ArrayList\<MensajesModel> leerMensajesDB() { Conexion dbConnect = new Conexion(); PreparedStatement ps = null; ResultSet rs = null; ArrayList mensajes = new ArrayList\<MensajesModel>(); try (Connection conexion = dbConnect.getConnection()){ String query = "SELECT \* FROM mensajes"; ps = conexion.prepareStatement(query); rs=ps.executeQuery(); while(rs.next()){ MensajesModel message = new MensajesModel(); message.setId\_mensaje(rs.getInt("id\_mensaje")); message.setMensaje(rs.getString("mensaje")); message.setAutor\_mensaje(rs.getString("autor\_mensaje")); message.setFecha\_mensaje(rs.getString("fecha\_mensaje")); mensajes.add(message); } }catch(SQLException e){ System.out.println(e); } return mensajes; } y el Service, así: ```js public static void listarMensaje() { ArrayList<MensajesModel> mensajes = MensajesDAO.leerMensajesDB(); for (MensajesModel mensaje : mensajes) { System.out.println("============================"); System.out.println("ID: "+mensaje.getId_mensaje()); System.out.println("Mensaje: "+mensaje.getMensaje()); System.out.println("Autor: "+mensaje.getAutor_mensaje()); System.out.println("Fecha: "+mensaje.getFecha_mensaje()); System.out.println("============================"); } } ``` public static void listarMensaje() { ArrayList\<MensajesModel> mensajes = MensajesDAO.leerMensajesDB(); for (MensajesModel mensaje : mensajes) { System.out.println("============================"); System.out.println("ID: "+mensaje.getId\_mensaje()); System.out.println("Mensaje: "+mensaje.getMensaje()); System.out.println("Autor: "+mensaje.getAutor\_mensaje()); System.out.println("Fecha: "+mensaje.getFecha\_mensaje()); System.out.println("============================"); } } Saludos
Otra forma de hacerlo usando colecciones ![](https://static.platzi.com/media/user_upload/image-736278b5-896e-4d8d-a7a8-7bc782a15ceb.jpg) ![](https://static.platzi.com/media/user_upload/image-ccecfe51-c14a-4a4d-aac9-741407cbad69.jpg)

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