Skip to content

Instantly share code, notes, and snippets.

@AlexGalhardo
Last active August 24, 2019 21:50
Show Gist options
  • Select an option

  • Save AlexGalhardo/01adc5ca57f9ee2a6eee3e94201eb074 to your computer and use it in GitHub Desktop.

Select an option

Save AlexGalhardo/01adc5ca57f9ee2a6eee3e94201eb074 to your computer and use it in GitHub Desktop.
  • Objeto de acesso a dados (acrônimo do inglês Data Access Object - DAO)

  • É um padrão para aplicações que utilizam persistência de dados, onde tem a separaração das regras de negócio das regras de acesso a banco de dados, implementada com linguagens de programação orientadas a objetos (como por exemplo Java) e arquitetura MVC, onde todas as funcionalidades de bancos de dados, tais como obter conexões, mapear objetos para tipos de dados SQL ou executar comandos SQL, devem ser feitas por classes DAO.

  • Vantagens

    • A vantagem de usar objetos de acesso a dados é a separação simples e rigorosa entre duas partes importantes de uma aplicação que não devem e não podem conhecer quase que nada uma da outra, e que podem evoluir frequentemente e independentemente.
    • Alterar a lógica de negócio podem esperar apenas a implementação de uma interface, enquanto que modificações na lógica de persistência não alteram a lógica de negócio, desde que a interface entre elas não seja modificada.
  • Pode ser usada em uma vasta porcentagem de aplicações;

  • Esconde todos os detalhes relativos a armazenamento de dados do resto da aplicação;

  • Atua como um intermediário entre a aplicação e o banco de dados;

  • Mitiga ou resolve problemas de comunicação entre a base de dados e a aplicação, evitando estados inconsistentes de dados.

  • No contexto específico da linguagem de programação Java, um objeto de acesso a dados como padrão de projeto de software pode ser implementado de várias maneiras. Pode variar desde uma simples interface que separa partes de acesso a dados da lógica de negócio de uma aplicação até frameworks e produtos comerciais específicos.

  • Os paradigmas para programação usando DAOs demandam alguma proficiência. O uso de tecnologias como Java persistence technologies e JDO garantem a implementação do padrão de projeto até certo ponto.

  • Tecnologias como Enterprise JavaBeans trazem para a aplicação servidores montados e que podem ser usados em aplicações que usem um servidor de aplicação JEE. Produtos comerciais como o TopLink estão disponíveis, baseados em mapeamento objeto-relacional (ORM).

  • Produtos ORM populares em código aberto incluem Doctrine, Hibernate, iBATIS e Apache OpenJPA.

Classes.php

<?php

class DataBase {
	protected $db;

	public function __construct() {
		try {
			$this->db = new PDO("mysql:dbname=dp_dao;host=localhost", "root", "");
			$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		} catch (PDOException $e){
			echo "ERRO: " . $e->getMessage();
			die($e->getMessage());
		}
	}
}

class UsuarioDAO extends DataBase {

	public function __construct() {
		// constructor da classe pai
		parent::__construct();
	}

	public function get($fields = array(), $where = array()){
		$usuarios = array();
		$valores = array();
	
		if(count($fields) == 0){
			$fields = array('*');
		}

		$sql = "SELECT " . implode(',', $fields). " FROM usuarios";

		if(count($where) > 0) {
			$tabelas = array_keys($where);
			$valores = array_values($where);
		
			$comp = array();

			foreach($tabelas as $tabela){
				$comp[] = $table . " = ?";
			}

			$sql .= implode(" AND ", $comp);
		}	

		$sql = $this->db->prepare($sql);
		$sql->execute($valores);

		if($sql->rowCount() > 0){
			foreach($sql->fetchAll() as $item){
				$usuarios[] = new Usuario($item);
			}
		}

		return $usuarios;
	}

	public function insertArray($fields = array()){

		if(count($fields) > 0){

			$questions = array();

			for($q=0; $q < count(array_keys($fields));$q++){
				$questions[] = '?';
			}

			$sql = "INSERT INTO usuarios (". implode(',', array_keys($fields)) . ") VALUES (". implode(',', $questions) .")";

			$sql = $this->db->prepare($sql);
			$sql->execute(array_values($fields));

		}
	}

	public function insertObject(Usuario $usuario){

		$fields = array(
			'nome' => $usuario->getName(),
			'email' => $usuario->getEmail(),
			'senha' => $usuario->getSenha(),
			'id' => $usuario->getId()
		);

		if(count($fields) > 0){

			$questions = array();

			for($q=0; $q < count(array_keys($fields));$q++){
				$questions[] = '?';
			}

			$sql = "INSERT INTO usuarios (". implode(',', array_keys($fields)) . ") VALUES (". implode(',', $questions) .")";

			$sql = $this->db->prepare($sql);
			$sql->execute(array_values($fields));

		}
	}
}

class Usuario {

	private $nome;
	private $email;
	private $senha;
	private $id;

	public function __construct($array){
		$this->nome = (isset($array['nome'])) ? $array['nome']: '';
		$this->email = (isset($array['email'])) ? $array['email']: '';
		$this->senha = (isset($array['senha'])) ? $array['senha']: '';
		$this->id = (isset($array['id'])) ? $array['id']: '';
	}

	public function getname(){ return $this->nome;}
	public function getEmail(){ return $this->email;}
	public function getId(){ return $this->id; }
	public function getSenha(){ return $this->senha; }
}

Index.php

<?php

require 'classes.php';

// DATA ACCESS OBJECT 

/**
$usuario = new Usuario(array(
	'name' => 'Galhardo',
    'email' => '[email protected]',
    'senha' => md5('123'),
    'id' => '1'
));

echo "NOME: " . $usuario->getName();

*/

$usuarioDAO = new UsuarioDAO();

$usuarioDAO->insertArray(array(
	'nome' => 'Fulano',	
	'email' => '[email protected]',
	'senha' => md5('123')
));

/**
 * também posso mandar direto um objeto, ao invés de um array
 */
$novoUsuario = new Usuario(array(
	'nome' => 'PessoaObjeto',	
	'email' => '[email protected]',
	'senha' => md5('456')
));
$usuarioDAO->insertObject($novoUsuario);

$usuarios = $usuarioDAO->get();

foreach($usuarios as $usuario){
	echo "<br><br><br>";
	echo "ID: " . $usuario->getId() . "<br>";
	echo "NOME: " . $usuario->getName() . "<br>";
	echo "EMAIL: " . $usuario->getEmail() . "<br>";
	echo "SENHA: " . $usuario->getSenha() . "<br>";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment