Skip to content

Correción de DIP en clase Admi.java #10

@marandradec

Description

@marandradec

Aplicando el Principio DIP (Dependency Inversion Principle)


Problema actual

La clase Admin.java depende directamente de MySQL, por ejemplo:

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/hotel","root","Sudhir@123");
pst = con.prepareStatement("SELECT * FROM signup");

Solución (aplicando DIP correctamente)

Se introduce una interfaz de abstracción (UserRepository) y una implementación concreta (MySQLUserRepository).
De esta forma, Admin.java dependerá de la abstracción, no de los detalles.

1. Crear la interfaz UserRepository.java

import java.util.List;

public interface UserRepository {
    List<User> getAllUsers() throws Exception;
    void updateStatus(String email, String newStatus) throws Exception;
}

2. Crear la implementación concreta MySQLUserRepository.java

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class MySQLUserRepository implements UserRepository {

    private static final String URL = "jdbc:mysql://localhost:3306/hotel";
    private static final String USER = "root";
    private static final String PASSWORD = "Sudhir@123";

    @Override
    public List<User> getAllUsers() throws Exception {
        List<User> users = new ArrayList<>();
        Class.forName("com.mysql.cj.jdbc.Driver");

        try (Connection con = DriverManager.getConnection(URL, USER, PASSWORD);
             PreparedStatement pst = con.prepareStatement("SELECT * FROM signup");
             ResultSet rs = pst.executeQuery()) {

            while (rs.next()) {
                users.add(new User(
                    rs.getString("name"),
                    rs.getString("email"),
                    rs.getString("password"),
                    rs.getString("sq"),
                    rs.getString("answer"),
                    rs.getString("status")
                ));
            }
        }
        return users;
    }

    @Override
    public void updateStatus(String email, String newStatus) throws Exception {
        Class.forName("com.mysql.cj.jdbc.Driver");
        try (Connection con = DriverManager.getConnection(URL, USER, PASSWORD);
             PreparedStatement pst = con.prepareStatement("UPDATE signup SET status=? WHERE email=?")) {
            pst.setString(1, newStatus);
            pst.setString(2, email);
            pst.executeUpdate();
        }
    }
}

3. Modificar Admin.java para depender solo de la interfaz

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.util.List;

public class Admin extends JFrame {

    private final UserRepository userRepository;
    private final UserStatusService statusService;

    public Admin(UserRepository userRepository) {
        this.userRepository = userRepository;
        this.statusService = new UserStatusService();
        initComponents();
        loadAllUsers();
    }

    private void loadAllUsers() {
        try {
            List<User> users = userRepository.getAllUsers();
            DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
            model.setRowCount(0);

            for (User u : users) {
                model.addRow(new Object[]{
                    u.getName(),
                    u.getEmail(),
                    u.getPassword(),
                    u.getSq(),
                    u.getAnswer(),
                    u.getStatus()
                });
            }

        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Error loading users");
        }
    }

    private void jTable1MouseClicked(java.awt.event.MouseEvent evt) {
        if (evt.getClickCount() == 2) {
            int row = jTable1.getSelectedRow();
            String email = (String) jTable1.getValueAt(row, 1);
            String currentStatus = (String) jTable1.getValueAt(row, 5);
            String newStatus = statusService.toggleStatus(currentStatus);

            try {
                userRepository.updateStatus(email, newStatus);
                loadAllUsers();
            } catch (Exception e) {
                JOptionPane.showMessageDialog(this, "Error updating status");
            }
        }
    }
}

4. Crear la instancia desde el main

public static void main(String[] args) {
    new Admin(new MySQLUserRepository()).setVisible(true);
}

Como resultado Admin.java depende de UserRepository y MySQLUserRepository también depende de la abstracción, con esto si se cambia de base de datos, solo se debe crear otra clase (por ejemplo PostgreSQLUserRepository) sin tocar el código de la interfaz ni de la UI.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions