Patterns Não existe uma definição exata para o que são patterns. O autor Martin Fowler, define patterns como uma idéia que foi útil em um contexto prático e que provavelmente será útil em outros. Outros autores definem como uma regra que expressa uma relação entre um contexto, um problema e uma solução. Mas em geral, patterns tem sempre as seguintes características: são notados através da experiência; evitam que se reinvente a roda; existem em diferentes níveis de abstração; são artefatos reutilizáveis; passam aos desenvolvedores designs corretos e podem ser combinados para resolver um grande problema; aceitam melhoramentos contínuos. Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) Pattern Data Access Object (DAO) Objetivo Abstrair e encapsular todo o acesso a uma fonte de dados. O DAO gerencia a conexão com a fonte de dados para obter e armazenar os dados. Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) Pattern Data Access Object (DAO) O padrão Data Access Object , também conhecido como o padrão DAO, abstrai a recuperação dos dados tal como uma base de dados. O conceito é "separar a relação do cliente de um recurso dos dados de seu mecanismo de acesso dos dados.“ O DAO é utilizado para encaplusar a lógica de acesso a dados. Assim, se for necessário a alteração de banco de dados, não é necessário alterar todo sistema, mas somente os DAOs. Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) Pattern Data Access Object (DAO) Dentro do DAO são realizadas as querys ou o acesso aos métodos do Hibernate ou direto a Base de Dados. A intenção real de existência dos DAOs é que eles não possuam nenhuma lógica de negócio, apesar de algumas vezes ser necessário encaplusar algo dentro deles, especialmente quando outros patterns da camada de modelo não estão presentes. Quando utilizado junto com Hibernate, ambos realizam o trabalho de abstrair a base, pois o Hibernate já mascara o tipo do banco de dados, ficando para o DAO a parte de controlar as conexões, excessões, retornos para os níveis superiores, entre outros. Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) Problema (DAO) Forma de acesso aos dados varia consideravelmente dependendo da fonte de dados usado Banco de dados relacional Arquivos (XML, CSV, texto, formatos proprietários) LDAP Persistência de objetos depende de integração com fonte de dados (ex: business objects) Colocar código de persistência (ex: JDBC) diretamente no código do objeto que o utiliza ou do cliente amarra o código desnecessariamente à forma de implementação Ex: difícil passar a persistir objetos em XML, LDAP, etc. Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) Solução (DAO) Data Access Object (DAO) oferece uma interface comum de acesso a dados e esconde as características de uma implementação específica Uma API: métodos genéricos para ler e gravar informação Métodos genéricos para concentrar operações mais comuns (simplificar a interface de acesso) DAO define uma interface que pode ser implementada para cada nova fonte de dados usada, viabilizando a substituição de uma implementação por outra DAOs não mantêm estado nem cache de dados Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) UML (DAO) Client: objeto que requer acesso a dados: Business Object, Session Façade, Application Service, Value List Handler, ... DAO: esconde detalhes da fonte de dados DataSource: implementação da fonte de dados Data: objeto de transferência usado para retornar dados ao cliente. Poderia também ser usado para receber dados. ResultSet: resultados de uma pesquisa no banco Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) Exemplo - UML (DAO) Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) Diagrama de Sequência (DAO) Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) Exemplo - Data Access Object (DAO) public class MeuDAO implements DAO{ public interface DAO{ public void insert(Object o); // construtor e outras coisas aqui... public void update(Object o); public void insert(Object o){ public void delete(Object o); // implementa o método insert public List listAll(); } } public void update(Object o){ // implementa o método update } public void delete(Object o){ // implementa o método delete } public List listAll(String sNome){ // implementa o método listAll } } O interessante da Classe DAO é que você podem implementar o acesso aos Dados da forma que achar mais estratégica. Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) DTO – Data Tranfer Object DTO == TO ~= VO DTO = Data Transfer Object (Fowler) VO = Value Object (CoreJ2EEPatterns 1ed) TO = Transfer Object (CoreJ2EEPatterns 2ed) Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) DTO – Data Tranfer Object O termo VO foi abandonado pelos autores de Core J2EE Patterns porque já era usado para outra coisa, algo do tipo "objeto imutável que representa um valor, não uma instância". TOs são usados para transporte de dados entre camadas. No seu exemplo, pessoa seria um TO. Basicamente, TOs são objetos que contém apenas dados, isto é, não têm lógica nenhuma, apenas métodos get/set dos seus atributos. Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) DTO – Data Tranfer Object TOs foram "introduzidos" no livro CoreJ2EEPatterns, para superar o problema de tranferência de dados entre camadas (Servlets <=> EJBs), pois na primeira edição eles implicitamente recomendavam a distribuição dos objetos (como se baseava na especificacao antiga, todos os EJBs eram remotos, não existiam interfaces locais). É mais eficiente transportar um objeto com um conjunto de dados agregados do que fazer várias chamadas, uma para cada dado. O padrão também é usado para agregar os dados logicamente. Imagine ter que passar sempre todos os atributos separados nas chamadas de métodos de negócio (métodos com 20 parâmetros?) Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) DTO – Data Tranfer Object Os DAOs também usam DTOs para encapsular um conjunto de dados em um único objeto. Tente imaginar alguma outra coisa... tipo, retornar uma HashMap... horrível, pra todos os casos que eu consigo imaginar. Um DTO normalmente é um bean, mas um bean pode ser qualquer coisa, inclusive um DTO. Por exemplo, no Spring, os componentes que guardam a lógica de negócio são implementados como beans, com suas dependências "injetadas" através dos métodos set. Mas eles não são DTOs, pois a intenção deles não é transportar dados. JavaBeans são apenas componentes que seguem certas convenções, como ser Serializable e usar métodos get/set. Um DTO é um objeto que carrega dados, que normalmente é implementado como um Javabean. Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) Exemplo - (DTO) de uma entidade - tbPessoa public class tbPessoaDTO { private int codigo; private String nome; private String bairro; public tbPessoaDTO(int codigo, String nome, String bairro){ this.codigo=codigo; this.nome = nome; this.bairro=bairro; } public int getCodigo() { return codigo; } public void setCodigo(int codigo) { this.codigo = codigo; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; Get´s e Set´s dos atributos da tabela. } public String getBairro() { return bairro; Uma representação Vazia de uma } entidade do Banco public void setBairro(String bairro) { this.bairro = bairro; } } Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) Exemplo – Um método de uma classe DAO que envia para a View uma Coleção de DTO-tbPessoa View Solicita uma Lista 1ª ao Bean Envia para camada View um Lista de DTO´s public Collection getListanomes() { AcessoDAO dao = new meuDAO(); listanomes = (List) dao.listAll(nome); return listanomes; 4ª } Bean 2ª public Collection listAll(String sNome){ String sql = "SELECT CODIGO, Nome, BAIRRO FROM tbPessoa WHERE Nome like ?"; List retorno = new ArrayList(); startConnection(); try{ PreparedStatement pst = connection.prepareStatement( sql ); pst.setString(1, "%" + sNome + "%"); ResultSet rs = pst.executeQuery(); DAO while( rs.next() ) { retorno.add(new tbPessoaDTO(rs.getInt("CODIGO"), rs.getString("NOME"), rs.getString("BAIRRO") ) ); } rs.close(); Carrega uma lista com vários pst.close(); DTO´s, contendo os atributos e } seus conteúdos do Resultset catch ( SQLException e){ System.err.println ("\nError Menssage: " + e.getMessage()); } destroyConnection(); 3ª return retorno; } Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) Exemplo – Um método de uma classe DAO que envia para a View uma Coleção de DTO-tbPessoa Na View é invocada uma propriedade de um BEAN que recebe uma Lista carregada com DTO´s, restando agora apresentar o conteúdo desta lista em uma TABLE HTML. <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> .......... <jsp:useBean id="meuBean" class="FJA.BeanTESTE" /> <jsp:setProperty name="meuBean" property="*" /> <table border=1 style="font-family: MS Sans Serif; font-size: 9px" > <thead> <tr> <th>Código</th> <th>Nome</th> <th>Bairro</th> </tr> </thead> <tbody> <c:forEach var="lista" items="${meuBean.listanomes}" > <tr> <td> <c:out value="${lista.codigo}"></c:out> </td> <td> <c:out value="${lista.nome}"></c:out> </td> <td> <c:out value="${lista.bairro}"></c:out>) </td> </tr> </c:forEach> </tbody> </table> São os atributos definidos no DTO Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected])