#5 Re: Acceso a Base de datos
Mmmmm con respecto al tema diseño en mi caso particular no me gusta tener las queries y los statements asi como el codigo de conexión a la base de datos desparramado pro todo el codigo de mi aplicacion, y mucho menos dentro de formularios y codigos de la UI, porque al principio esta bueno, hay poco codigo pero al extender todo se vuelve inmanejable.
Yo usaria lo que se llama DataMapper o Data Access Object. En realidad es un objeto que encapsula todo el acceso a la base de datos para un cierto objeto determinado de mi negocio, supongamos que yo tengo un objeto Alumno definido asi:
Código:
public class Alumno extends Serializable {
public static final long serialVersionUID = 1L;
private String documento;
pivate String nombre;
private String apellido;
public Alumno(String dni, String nombre, String apellido) {
super();
setDni(dni);
setNombre(nombre);
setApellido(apellido);
}
//Aca irian definidos los getters y los setters
}
Yo podria definir un DataMapper abstracto o DAO abstracto que tenga la funcionalidad comun a todos los DataMappers de mi aplicación, por ejemplo tener una referencia a la conexion a la DB, y codigo para instanciar una conexion y cerrar una conexion.
El codigo quedaría asi:
Código:
public abstract void AbstractDataMapper {
private Connection;
public AbstractDataMapper(String driverClass, String url, String userName, String password) {
super();
initializeConnection(driverClass, url, userName, password);
}
private void initializeConnection(.....) {
try {
Class.forName(driverClass);
connection = DriverManager.getConnection(url, userName,password);
} catch (NoClassDefFoundException exception) {
exception.printStackTrace();
} catch (SqlException exception) {
exception.printStackTrace();
}
}
//Aca vendrian getters y setters de la conexion
}
Y luego tendria diferentes DataMappers para cada objeto de mi negocio en este caso mi objeto Alumno, yo podria definir una clase AlumnoDataMapper que extienda de AbstractDataMapper y que tenga funcionalidad de insercion y acceso a base de datos
Código:
public class AlumnoDataMapper extends AbstractDataMapper {
public AlumnoDataMapper(String driverClass, String url, String userName, String password) {
super(driverClqass, url, userName, password);
}
public void insertarAlumno(Alumno alumno) {
try {
PreparedStatement statement = connection.prepareStatement("INSERT INTO ALUMNOS VALUES(?,?,?)");
statement.set(1, alumno.getDni());
statement.set(2, alumno.getNombre());
statement.set(3, alumno.getApellido());
statement.executeUpdate();
statement.close();
} catch (SqlException exception) {
exception.printStackTrace();
}
};
//Aca irian demás metodos para insertar updatear o modificar otros valores en la base de datos o devolver objetos Alumno
}
Fijate que con este approach, tenes en un unico lugar encapsulado todo el acceso a la base de datos, si alguna query cambia solo tenes que tocar un método de una sola clase y no x cantidad de queries distribuidas en x cantidad e formularios que usen esa query.
También tene en cuenta que si la estructura interna de tu objeto de negocio, en este caso Alumno cambia, solamente vas a tener que tocar en un único lugar como hacer la consulta a la base de datos para insertar o traer datos de la misma. El resto de la aplicacion solo se comunica con el DataMapper, le pasa objetos ya instanciados de tu clase de negocios y recibe objetos ya creados con datos traidos de la base de datos,.
Saludos
Pablo Martín Viva