Patrón DAO

De ChuWiki

Es bastante normal hacer aplicaciones que almacenan y recogen datos de una base de datos. Suele ser habitual, también, querer hacer nuestra aplicación lo más independiente posible de una base de datos concreta, de cómo se accede a los datos o incluso de si hay o no base de datos detrás. Nuestra aplicación debe conseguir los datos o ser capaz de guardarlos en algún sitio, pero no tiene por qué saber de dónde los está sacando o dónde se guardan.

Hay una forma de hacer esto que ha resultado bastante eficiente en el mundo JEE y de aplicaciones web, pero que es aplicable a cualquier tipo de aplicación que deba recoger datos de algún sitio y almacenarlos. Es lo que se conoce como patrón DAO (Data Access Object).

La idea de este patrón es sencilla. En primer lugar, debemos hacernos las clases que representan nuestros datos. Por ejemplo, podemos hacer una clase Persona con los datos de la persona y los métodos set() y get() correspondientes.

Luego hacemos una interface. Esta interface tiene que tener los métodos necesarios para obtener y almacenar Personas. Esta interface no debe tener nada que la relaciones con una base de datos ni cualquier otra cosa específica del medio de almacenamiento que vayamos a usar, es decir, ningún parámetro debería ser una Connection, ni un nombre de fichero, etc. Por ejemplo, puede ser algo así

public interface InterfaceDAO {
   public List<Persona> getPersonas();
   public Persona getPersonaPorNombre (String nombre);
   ...
   public void salvaPersona (Persona persona);
   public void modificaPersona (Persona persona);
   ...
   public void borraPersonaPorNombre (String nombre);
   ...
}

y todos los métodos con todas las variantes que necesitemos en nuestra aplicación.

Con esto deberíamos construir nuestra aplicación, usando la clase Persona y usando la InterfaceDAO para obtener y modificar Personas.

Aparte, hacemos la implementación de la InterfaceDAO, ya contra una base de datos concreta o usando una herramienta -iBATIS, Hibernate, etc- determinada. Al usar nuestra aplicación la InterfaceDAO, podremos pasarle cualquier implementación que queramos o incluso cambiar una por otra en un momento dado.

Por ejemplo, podemos hacer implementaciones según usemos MySQL, Oracle, etc

o bien según usemos iBATIS, JDBC, Hibernate, etc.

Normalmente el patrón DAO se completa con algún tipo de Factoría: Una clase a la que al pedirle la InterfaceDAO decide cual de las implementaciones instanciar y la devuelve.

public class FactoriaDAO
{
   public static InterfaceDAO getDAO() {
      if (baseDatos.equals("oracle")
         return new ImplementacionDAOOracle (parametrosConexionOracle);
      else if (baseDatos.equals("MySQL")
         return new ImplemetancionDAOMySQL (parametrosConexionMySQL);
      ...
   }
}

Otra opción es que las clases de nuestra aplicación tengan un método setInterfaceDAO() y que alguien desde fuera instancie la implementación concreta y se la pase.