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.
Aplicando el Principio DIP (Dependency Inversion Principle)
Problema actual
La clase
Admin.javadepende directamente de MySQL, por ejemplo:Solución (aplicando DIP correctamente)
Se introduce una interfaz de abstracción (UserRepository) y una implementación concreta (MySQLUserRepository).
De esta forma,
Admin.javadependerá de la abstracción, no de los detalles.1. Crear la interfaz
UserRepository.java2. Crear la implementación concreta
MySQLUserRepository.java3. Modificar
Admin.javapara depender solo de la interfaz4. Crear la instancia desde el main
Como resultado
Admin.javadepende de UserRepository yMySQLUserRepositorytambié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.