PHP[DAO]::Data Access Object
El DAO, Data Access Object por sus siglas en inglés, corresponde a un patrón de diseño que tiene como proposito abstraer al software cliente del acceso a los datos o de la fuente de almacenamiento, y que solo se centre en los datos que necesite.
Este patrón de diseño nace de la necesidad de gestionar diversas fuentes de datos, aunque su uso se extiende al problema de encapsular no sólo la fuente de datos, sino que además mantiene oculta la forma en que se accede a los datos. Se trata de hacer que el software cliente se concentre en los datos que necesita y no se preocupe de cómo ni de dónde obtiene los datos.
El DAO realiza la implementacion del mecanismo para acceder a la fuente de datos, sea esta una base de datos, archivos externos, etc... Los componentes de negocio que tratan con el DAO utilizan un interface simple expuesto por el DAO para sus clientes. El DAO oculta completamente los detalles de implementación de la fuente de datos a sus clientes. Como el interface expuesto por el DAO no cambia cuando cambia la implementación de la fuente de datos subyacente, este patrón permite al DAO adaptarse a diferentes esquemas de almacenamiento sin que esto afecte a sus clientes o componentes de engocio. Esencialmente, el DAO actúa como un adaptador entre el componente y la fuente de datos.

Bueno, para que todo esto quede un poco más claro, voy a poner un ejemplo práctico sencillo para que se puedan formar una idea de como funciona. Si bien este patrón de diseño se puede aplicar a diversos lenguajes de programación, pondré el ejemplo en PHP, donde manipularemos datos de un "Usuario", no nos preocuparemos de la interfaz gráfica, sólo del manejo de datos.
[ UsuarioVO.php ] Clase usada para transportar informacion
-
require_once 'UsuarioVO.php';
-
-
class UsuarioVO
-
{
-
public $id;
-
public $nombre;
-
public $rut;
-
public $username;
-
public $bcryptpass;
-
public $mail;
-
public $region;
-
public $sexo;
-
public $telefono;
-
public $descripcion;
-
}
-
?>
[ UsuarioDAO.php ] Interface donde declaramos los metodos disponibles
-
interface UsuarioDAO
-
{
-
public function guardar($usuario_vo);
-
public function buscarId($id);
-
public function buscarCampo($campo, $valor);
-
}
-
?>
[ Usuario_DB_DAO.php ] La clase que hace todo el trabajo
-
require_once 'UsuarioDAO.php';
-
require_once 'UsuarioVO.php';
-
require_once 'DB.php';
-
-
class Usuario_DB_DAO implements UsuarioDAO
-
{
-
private $conexion;
-
-
public function __construct()
-
{
-
// vamos a conectarnos...
-
$this->conexion =
-
DB::connect("mysql://root@localhost/mibase");
-
$this->conexion->setFetchMode(DB_FETCHMODE_ASSOC);
-
if (DB::isError($this->conexion)) {
-
print "Fallo la conexion!";
-
print "Error : " .
-
$this->conexion->getMessage() . "";
-
print "Detalles Error : " .
-
$this->conexion->getUserInfo() . "";
-
}
-
}
-
-
public function guardar($usuario_vo)
-
{
-
// tenemos 2 casos.... insertar y actualizar
-
if ( $usuario_vo->id == null ){
-
$this->insertar($usuario_vo);
-
}
-
else {
-
$this->actualizar($usuario_vo);
-
}
-
}
-
-
private function insertar(UsuarioVo $usuario_vo)
-
{
-
$sql = "INSERT INTO usuarios ".
-
"(id, nombre, rut, username, bcryptpass,".
-
"mail, region, sexo, telefono, descripcion) ".
-
" VALUES ".
-
" (?, ?, ? , ?, ? , ? , ?, ?, ?, ?); ";
-
// Antes de continuar vamos a obtener el nuevo id
-
// Como estamos usando DB vamos a usar el mecanismo
-
// propio de DB para obtener el id.
-
$usuario_vo->id = $this->conexion->nextId("usuarios");
-
$usuario_vo->nombre,
-
$usuario_vo->rut,
-
$usuario_vo->username,
-
$usuario_vo->bcryptpass,
-
$usuario_vo->mail,
-
$usuario_vo->region,
-
$usuario_vo->sexo,
-
$usuario_vo->telefono,
-
$usuario_vo->descripcion );
-
$preparedStatement = $this->conexion->prepare($sql);
-
$resultado =& $this->conexion->execute(
-
$preparedStatement,$datos);
-
if (PEAR::isError($resultado)){
-
echo 'Falló la insercion en la BD ';
-
echo "Detalles Error : " .
-
$resultado->getUserInfo() . "";
-
}
-
}
-
-
private function actualizar(UsuarioVo $usuario_vo)
-
{
-
$sql = "UPDATE usuarios SET ".
-
"nombre = ? , ".
-
"rut = ? , ".
-
"username = ? , ".
-
"bcryptpass = ? , ".
-
"mail = ? , ".
-
"region = ? , ".
-
"sexo = ? , ".
-
"telefono = ? , ".
-
"descripcion = ? ".
-
"WHERE ".
-
"id = ? ;";
-
// Antes de continuar vamos a obtener el nuevo id
-
// Como estamos usando DB vamos a usar el mecanismo
-
// propio de DB para obtener el id.
-
-
$usuario_vo->rut,
-
$usuario_vo->username,
-
$usuario_vo->bcryptpass,
-
$usuario_vo->mail,
-
$usuario_vo->region,
-
$usuario_vo->sexo,
-
$usuario_vo->telefono,
-
$usuario_vo->descripcion,
-
$usuario_vo->id );
-
$preparedStatement = $this->conexion->prepare($sql);
-
$resultado =& $this->conexion->execute(
-
$preparedStatement,$datos);
-
if (PEAR::isError($resultado)){
-
echo 'Falló la modificación en la BD ';
-
echo "Detalles Error : " .
-
$resultado->getUserInfo() . "";
-
}
-
}
-
-
public function buscarId($id)
-
{
-
$sql = "SELECT * FROM usuarios WHERE id = ?";
-
$preparedStatement = $this->conexion->prepare($sql);
-
$resultado =& $this->conexion->execute(
-
$preparedStatement,$id);
-
if (PEAR::isError($resultado)){
-
echo 'Falló la modificación en la BD ';
-
echo "Detalles Error : " .
-
$resultado->getUserInfo() . "";
-
}
-
else if ($fila =& $resultado->fetchRow() ){
-
$usuario_vo = new UsuarioVO();
-
$usuario_vo->id = $fila['id'];
-
$usuario_vo->nombre = $fila['nombre'];
-
$usuario_vo->rut = $fila['rut'];
-
$usuario_vo->username = $fila['username'];
-
$usuario_vo->bcryptpass = $fila['bcryptpass'];
-
$usuario_vo->mail = $fila['mail'];
-
$usuario_vo->region = $fila['region'];
-
$usuario_vo->sexo = $fila['sexo'];
-
$usuario_vo->telefono = $fila['telefono'];
-
$usuario_vo->descripcion = $fila['descripcion'];
-
return $usuario_vo;
-
}
-
// Si hubo un error, o no encontramos nada...
-
return null;
-
}
-
-
public function buscarCampo($campo, $valor)
-
{
-
$sql = "SELECT * FROM usuarios WHERE $campo = ?";
-
$preparedStatement = $this->conexion->prepare($sql);
-
$resultado =& $this->conexion->execute(
-
$preparedStatement,$valor);
-
if (PEAR::isError($resultado)){
-
echo 'Falló la modificación en la BD ';
-
echo "Detalles Error : " .
-
$resultado->getUserInfo() . "";
-
return null;
-
}
-
while ($fila =& $resultado->fetchRow() ){
-
$usuario_vo = new UsuarioVO();
-
$usuario_vo->id = $fila['id'];
-
$usuario_vo->nombre = $fila['nombre'];
-
$usuario_vo->rut = $fila['rut'];
-
$usuario_vo->username = $fila['username'];
-
$usuario_vo->bcryptpass = $fila['bcryptpass'];
-
$usuario_vo->mail = $fila['mail'];
-
$usuario_vo->region = $fila['region'];
-
$usuario_vo->sexo = $fila['sexo'];
-
$usuario_vo->telefono = $fila['telefono'];
-
$usuario_vo->descripcion = $fila['descripcion'];
-
$respuesta[] = $usuario_vo;
-
}
-
return $respuesta;
-
}
-
}
-
?>
Bien, ahora ya tenemos listas las clases que necesitamos para manipular nuestro usuario (los datos del usuario, no es que cumplamos es sueño de todo HelpDesk). Ahora solo nos falta alguien que necesite agregar, actualizar o borrar informacion del usuario.
Alguien que necesite ingresar un usuario...
[ InsertarUsuario.php ] Clase que insertará un usuario
-
require_once 'usuarioVO.php';
-
require_once 'Usuario_DB_DAO.php';
-
-
// para probar, necesitamos crear un usuarioVO
-
-
$vo = new UsuarioVO();
-
$vo->id = null;
-
$vo->nombre = 'Juan Lopez';
-
$vo->rut = '3-5';
-
$vo->username = 'juanito';
-
$vo->mail = 'juan.lopez@mimail.com';
-
$vo->region = 13;
-
$vo->telefono = '98765432';
-
$vo->sexo = 1; // 1 hombre, 2 mujer!
-
$vo->descripcion = 'Ejecutivo joven, baila salsa';
-
$vo->bcryptpass = 'erwrwesdsdfsdfsdksd';
-
-
// Y necesitamos un dao...
-
$dao = new Usuario_DB_DAO();
-
$dao->guardar($vo);
-
echo 'Terminamos!';
-
?>
Alguien que modifique un usuario...
[ ModificarUsuario.php ] Modificaremos un campo del usuario.
Buscaremos usuarios que cumplan un cierto filtro o requisito...
[ BuscarCampo.php ] Buscaremos por un campo en especÃfico.
Una simple búsqueda por ID, y listaremos todos sus valores...
[ BuscarPorID.php ] Buscaremos por un ID.
Ya, terminamos este simple ejemplo de como funciona el DAO, espero esté redactado de forma clara y comprensible.
Toda crÃtica o comentario será bienvenida...


Encuentrame en Flickr