DAO
El patrón DAO (Data Access Object) es un patrón de diseño estructural usado para separar la lógica de acceso a los datos del resto de la aplicación.
El patrón DAO tiene tres componentes principales:
- Modelo (DTO): Representa los datos. Es una clase simple con atributos, constructores, getters y setters y otros métodos.
- Interfaz DAO: Define los métodos para interactuar con los datos, como
create,read,updateydelete(CRUD). - Implementación DAO: Proporciona la implementación de los métodos definidos en la interfaz DAO. Una implementación puede ser para los datos almacenados en una base de datos, otra con ficheros, etc.
Ejemplo
Este ejemplo muestra cómo implementar el patrón DAO para una entidad llamada Usuario. En este caso tan solo vamos a realizar los métodos para recuperar un usuario:
Modelo
Usuario.java
public class Usuario {
private int id;
private String nombre;
private String email;
// Constructor
public Usuario(int id, String nombre, String email) {
this.id = id;
this.nombre = nombre;
this.email = email;
}
// Getters y Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Interfaz DAO
UsuarioDAO.java
public interface UsuarioDAO {
Usuario obtenerUsuarioPorId(int id);
}
Implementación DAO para base de datos
UsuarioDAOImpl.java
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UsuarioDAOImpl implements UsuarioDAO {
private Connection conexion;
// Constructor que recibe una conexión
public UsuarioDAOImpl(Connection conexion) {
this.conexion = conexion;
}
@Override
public Usuario obtenerUsuarioPorId(int id) {
String sql = "SELECT * FROM usuarios WHERE id = ?";
try (PreparedStatement stmt = conexion.prepareStatement(sql)) {
stmt.setInt(1, id);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
return new Usuario(rs.getInt("id"), rs.getString("nombre"), rs.getString("email"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
Implementación DAO para CSV
UsuarioDAOCSVImpl.java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class UsuarioDAOCSVImpl implements UsuarioDAO {
private final String rutaFichero;
public UsuarioDAOCSVImpl(String rutaFichero) {
this.rutaFichero = rutaFichero;
}
@Override
public Usuario obtenerUsuarioPorId(int id) {
try (BufferedReader reader = new BufferedReader(new FileReader(rutaFichero))) {
String linea;
while ((linea = reader.readLine()) != null) {
String[] campos = linea.split(",");
if (Integer.parseInt(campos[0]) == id) {
return new Usuario(Integer.parseInt(campos[0]), campos[1], campos[2]);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
Programa principal
Clase principal con selección de la implementación.
App.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Scanner;
public class App {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Selecciona la implementación:");
System.out.println("1. Base de datos");
System.out.println("2. Fichero CSV");
int opcion = scanner.nextInt();
UsuarioDAO usuarioDAO = null;
switch (opcion) {
case 1:
try {
String url = "jdbc:mysql://localhost:3306/ejemplo_db";
String usuarioDB = "root";
String contrasenaDB = "password";
Connection conexion = DriverManager.getConnection(url, usuarioDB, contrasenaDB);
usuarioDAO = new UsuarioDAOImpl(conexion);
} catch (Exception e) {
e.printStackTrace();
}
break;
case 2:
String rutaFichero = "usuarios.csv";
usuarioDAO = new UsuarioDAOCSVImpl(rutaFichero);
break;
default:
System.out.println("Opción no válida");
System.exit(0);
}
if (usuarioDAO != null) {
Usuario usuario = usuarioDAO.obtenerUsuarioPorId(1);
System.out.println("Usuario obtenido: " + usuario.getNombre());
}
scanner.close();
}
}
Generalmente la selección del DAO no se hace mediante una consulta al usuario, sino que se carga de un fichero de configuración.
Ventajas del patrón DAO
- Separación de responsabilidades: La lógica de acceso a datos está aislada de la lógica de negocio.
- Facilidad de mantenimiento: Cambios en la base de datos afectan solo a la implementación DAO.
- Testabilidad: Puedes probar la lógica sin depender directamente de una base de datos real.
Este patrón es muy usado en aplicaciones empresariales donde se trabaja con bases de datos.