-
Notifications
You must be signed in to change notification settings - Fork 51
Open
Description
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.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels