Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

claudiojuniorfabiao

Diferença entre DAO e ORM

Recommended Posts

Fala, galera!

 

Indo direto ao ponto, qual a diferença entre o padrão de software DAO e um ORM?

 

Em minha ignorância, me parecem conceitos semelhantes, sendo o DAO simplesmente algo mais abstrato, então, de certa forma, me parece que todo ORM está implementando um DAO de qualquer maneira, uma vez que (sendo um DataMapper), separa a lógica de domínio, da lógica de acesso aos dados.

 

Agradeço desde já a contribuição com os meus estudos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A maioria dos padrões de persistência são similares, com apenas algumas modificações.

 

ORM é definido como uma técnica de conversão de dados entre sistemas incompatíveis, como o modelo orientado à objetos e o modelo relacional.

 

DAO é utilizado para abstrair e encapsular todo o acesso ao data source (fonte de dados). Dessa forma, o sistema pode mudar de data source sem se preocupar com o sistema em si, apenas com o DAO.

 

DataMapper, conceitualmente, é semelhante ao DAO, entretanto, é um conjunto de camadas que move os dados entre objetos e o storage, mantendo a independência entre os objetos e o mapper em si.

 

Apesar dos conceitos serem semelhantes, a prática se torna diferente. O DAO acaba se tornando uma relação bem direta entre objetos e o banco de dados, quase culminando entre uma tabela se tornar um objeto (o que não é regra). No final das contas, o DAO acaba sendo apenas uma camada intermediária entre o sistema e o storage.

 

Por outro lado, o DataMapper, mapeia o modelo orientado à objeto para o modelo relacional. Dessa forma, não é raro que um objeto possa se tornar mais de uma tabela no banco de dados e vice-versa, como é o caso do relacionamento N:M que exige, no modelo relacional, uma tabela intermediária. Essa exigência não é necessária no modelo orientado à objetos.

 

No final das contas, o DataMapper possui uma alta abstração e alta granularidade, necessitando a implementação de diversos participantes (Mapper, Factory, Collection, Entity, UnitOfWork, IdentityMap). Já o DAO, pode ser implementado apenas utilizando duas camadas, o DAO em si e a entidade (Entity).

 

Ambos os padrões DAO e DataMapper não são diretamente relacionados ao ORM. O ORM pode utilizar algum desses padrões, não sendo uma obrigatoriedade e nem precisa utilizá-lo por completo.

 

Outro padrão exitente é o TableDataGateway, o qual você pode ler no artigo do Henrique Barcelos:

https://imasters.com.br/linguagens/php/padroes-tabledatagateway-e-tablerowgateway-teoria-e-pratica/

 

No final das contas, mesmo com suas semelhanças/diferenças, cada padrão vai lhe entregar o que se propõe com seus prós e contras. Cabe a você decidir o que irá escolher.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, Gabriel!

 

Muito obrigada pela sua explicação bem detalhada sobre o tema, isso me ajudou muito.

 

Fazendo mais duas pergunta, se me permite:

 

Implementando em sua totalidade o padrão DataMapper, conforme descrito por Fowler, para realizar a conversão dos tipos relacional-objeto, eu estou, de algum modo, fazendo uso da técnica ORM, certo?

 

No DataMapper, eu implementaria o padrão DAO como uma camada mais baixa (o que me parece redundante numa aplicação pequena), ou o próprio padrão dispensa essa necessidade ao já estabelecer essa separação entre modelo de domínio/persistência de dados?

 

Agradeço imensamente suas respostas!

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, claudiojuniorfabiao disse:

Implementando em sua totalidade o padrão DataMapper, conforme descrito por Fowler, para realizar a conversão dos tipos relacional-objeto, eu estou, de algum modo, fazendo uso da técnica ORM, certo?

 

ORM é mais voltado para uma conversão automática. Como, por exemplo, o Doctrine o faz. Você mapeia os dados do objeto para o que seria sua representação no storage e o Doctrine realiza o restante. O DataMapper, por outro lado, é o seu mapeamento manual entre objetos e o storage. Mas o resultado é bastante similar.

 

1 hora atrás, claudiojuniorfabiao disse:

No DataMapper, eu implementaria o padrão DAO como uma camada mais baixa (o que me parece redundante numa aplicação pequena), ou o próprio padrão dispensa essa necessidade ao já estabelecer essa separação entre modelo de domínio/persistência de dados?

 

O próprio padrão dispensa a necessidade. Se quiser visualizar um pouco sobre o padrão, olhe olhar no link abaixo:

http://blog.tekerson.com/2008/12/17/data-mapper-pattern-in-php/

 

Apenas para ressaltar, a implementação no link acima é bem básica. Você poderá encontrar uma implementação bem completa no livro "PHP Objects, Patterns, and Practice" do Matt Zandstra.

Compartilhar este post


Link para o post
Compartilhar em outros sites
13 minutos atrás, Gabriel Heming disse:

ORM é mais voltado para uma conversão automática. Como, por exemplo, o Doctrine o faz. Você mapeia os dados do objeto para o que seria sua representação no storage e o Doctrine realiza o restante. O DataMapper, por outro lado, é o seu mapeamento manual entre objetos e o storage. Mas o resultado é bastante similar.

 

O próprio padrão dispensa a necessidade. Se quiser visualizar um pouco sobre o padrão, olhe olhar no link abaixo:

http://blog.tekerson.com/2008/12/17/data-mapper-pattern-in-php/

 

Apenas para ressaltar, a implementação no link acima é bem básica. Você poderá encontrar uma implementação bem completa no livro "PHP Objects, Patterns, and Practice" do Matt Zandstra.

 

Ah, valeu mesmo, cara!

 

Isso realmente me ajudou muito, eram exatamente as informações que eu estava precisando.

 

Novamente, muito obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por aluizs100
      Olá.

      Estou tentando localizar um código para conectar um banco de dados access utilizando o Visual Studio 12, porém só encontrei a com conexão direta via programa e eu queria fazer esta conexão via código.

      alguém poderia me auxiliar em enviando esta rotina ou me indicando o local onde encontro.


      Obrigado.
    • Por Claudinei Teodoro
      Sou super novato estou começando a entender programação agora e estou com dificuldade em implementar o método UPDATE no meu DAO Generico.
      Os métodos INSERT, SELECT, DELETE já esta funcionando preciso somente de uma ajuda para o método UPDATE.

      Segue abaixo método INSERT que estou utilizando, alguém pode me ajudar com o método UPDATA utilizando como base este método INSERT.


      public void salvar(T objeto) throws SQLException, IllegalArgumentException, IllegalAccessException, ClassNotFoundException {


      Class classe = objeto.getClass();

      String parteInicialSQL = "INSERT INTO " + classe.getSimpleName().toLowerCase() + "(";

      Field[] atributos = classe.getDeclaredFields();
      String parteFinalSQL = ") VALUES(";

      for (Field atributo : atributos) {
      if (!"id".equals(atributo.getName())) {
      parteInicialSQL += atributo.getName().toLowerCase() + ",";
      parteFinalSQL += "?,";
      }
      }

      parteInicialSQL = parteInicialSQL.substring(0, parteInicialSQL.length() - 1);
      parteFinalSQL = parteFinalSQL.substring(0, parteFinalSQL.length() - 1) + ")";

      Class.forName("org.postgresql.Driver");
      Connection conexao = DriverManager.getConnection("jdbc:postgresql://127.0.0.1:5432/postgres", "postgres", "123456");
      PreparedStatement sql = conexao.prepareStatement(parteInicialSQL + parteFinalSQL);

      int numeroInterrogacao = 1;
      for (Field atributo : atributos) {
      if (!"id".equals(atributo.getName())) {
      atributo.setAccessible(true);
      sql.setObject(numeroInterrogacao++, atributo.get(objeto));
      }
      }

      System.out.println(parteInicialSQL + parteFinalSQL);

      sql.execute();
      conexao.close();

      }
    • Por edivancastro
      Pessoal, em anexo segue meu modelo de banco de dados (duas tabelas). Estou utilizando doctrine. Este é um modelo resumido para eu tentar explicar o que estou passando.
       
      As minhas classes Banner e Menu extendem de classes diferentes (ClasseX e ClasseY) e estas classes Banner e Menu, como voces podem ver possuem um Link que pode ser para uma categoria, artigo ou linkexterno (http://outrosite.com). Dai surgiu essa necessidade de min criar uma classe Link. Porem na minha opiniao é inviavel eu criar uma tabela no banco de dados para armazenar link, ou seja, a classe link não chega ser uma entidade concreta (tabela), seria apenas coluna no BD e para cada tipo de Link há uma estrategia para gerar o seu respectivo LinkURL, conforme pode ser observado na classe Link.
       
      Pensei em fazer class Menu extends Link   e  class Banner extends Link, porem as classes banner e menu ja extendem de outras classes e como o PHP não aceita herança multipla não tem como.
       
      enfim, como faço para mapear a classe Link para este modelo de banco de dados meu?
       
       
       
      <?php /** * @ORM\Entity */ class Banner extends ClasseX{ /** * @ORM\Id */ private $id; /** * @ORM\Column('type=string') */ private $descricao; private $link; protected setLink(Link $link){ $this->link = $link; } protected getLink(){ return $this->link; } }  
       
       
      <?php /** * @ORM\Entity */ class Menu extends ClasseY{ /** * @ORM\Id */ protected $id; /** * @ORM\Column(type="string") */ protected $descricao; protected $link; protected setLink(Link $link){ $this->link = $link; } protected getLink(){ return $this->link; } }  
      <?php class Link{ const TIPO_ARTIGO=1; const TIPO_CATEGORIA=2; const TIPO_LINKEXTERNO=3 protected $tipo_link; protected $categoria; protected $artigo; proctected $linkexterno; public function setLink($link){ if(is_object($link)){ switch(get_class($link)){ case Artigo::class: $this->tipo = self::TIPO_ARTIGO; $this->artigo = $link; break; case Categoria::class: $this->tipo = self::TIPO_CATEGORIA; $this->categoria = $link; break; } }else{ $this->tipo = self::TIPO_LINKEXTERNO; $this->linkexterno = $link; } } public function getLinkUrl(){ switch($this->tipo_link){ case self::TIPO_ARTIGO; return $this->makeUrlToArtigo(); break; case self::TIPO_CATEGORIA; return $this->makeUrlToCategoria(); break; case self::TIPO_LINKEXTERNO; return $this->linkexterno; } } }  

    • Por aldoneto.89
      tenhos as 3 seguintes classes:
       
      <?php class Sql extends PDO{ private $conn; //conexão com o banco public function __constuct(){ $this->conn = new PDO("mysql:host=localhost;dbname=php7","root","root"); } private function setParams($statment, $parameters = array()){ foreach(parameters as $key => $value) { //associar os parametros ao comando.//chave e o valor $this->bindParam($key, $value); } } private function setParam($statment, $key, $value){ $statment->bindParam($key, $value); } public function query($rawQuery,$params = array()){ //1-parametro a ser tratato e 2 os dados $stmt = $this->$conn->prepare($rawQuery); // $this->setParams($stmt, $params); $stmt->execute(); return $stmt; } public function select ($rawQuery, $params = array()):array { $stmt = $this->query($rawQuery, $params); $stmt->fetchAll(PDO::FETCH_ASSOC); } } <?php spl_autoload_register(function($class_name){ $filename = $class_name.".php"; if(file_exists(($filename))){ require_once($filename); } }); ?> <?php require_once("config.php"); $sql = new Sql(); $usuarios = $sql->select("SELECT * FROM tb_usuarios"); echo json_encode($usuarios); ?> e esta dando o erro :
       
      Fatal error: Uncaught TypeError: PDO::__construct() expects at least 1 parameter, 0 given in C:\xampp\htdocs\DAO\index.php:5 Stack trace: #0 C:\xampp\htdocs\DAO\index.php(5): PDO->__construct() #1 {main} thrown in C:\xampp\htdocs\DAO\index.php on line 5
       
      o engrçado é que peguei em uma videoaula e esta igual ao do professor
       
      diz que tem q passar um parametro, mas no dele não tem parametro
    • Por laudirbispo
      Cheguei em um ponto da minha aplicação em que preciso relacionar tabelas em uma única consulta.
       
      Até o momento, uso uma classe DAO para cada tabela no banco de dados, com funções CRUD básicas.Mas agora surgiu a necessidade de relacionar essas tabelas, qual é a camada que faz isso e como ela funciona?
      Por exemplo: A Classe PermissionsDAO faz insert, update, delete, select na tabela permissions, mas essa classe agora precisa acessar as tabelas privileges, groups, user_groups, etc.
      Procurei na net, há várias explicações, (e a busca aqui do Fórum está desagradável)
      mas cada um diz uma coisa. Fiquei mais confuso ainda!
       
      Estou tentando implementar o padrão MVC.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.