Introdução CRUD DAO Exemplo Padrão J2EE Data Access Object (DAO) Prof. Enzo Seraphim
Motivação para usar Componentes precisam acessar e armazenar informações em armazenamento persistente As APIs de armazenamento persistente variam dependendo do fornecedor A portabilidade dos componentes é diretamente afetada quando mecanismos e APIs de acesso específicos são incluídos nos componentes Os componentes precisam ser transparentes ao armazenamento persistente ou à implementação da origem de dados.
Camada de Integração A camada de integração encapsula a lógica relacionada com a integração do sistema com a camada de negócios É acoplada com a camada de negócios sempre que esta camada precisar de dados ou serviços que residem na camada de recursos (dados) Os componentes nesta camada podem usar tecnologias de acesso aos serviços específicos que isolam (JDBC, JMS, middleware proprietário, etc.)
Descrição do Problema Forma de acesso aos dados varia dependendo da fonte de dados usado Banco de dados relacional Arquivos (XML, CSV, texto, formatos proprietários) Persistência de objetos depende de integração com fonte de dados Colocar código de persistência diretamente no código do objeto amarra o código desnecessariamente à forma de implementação
Descrição do Problema Apresentação Negócio Fonte de Dados aplicacao Visao1 Visao2 Visao3 Banco Relacional Visao4 Banco OO modelo Objeto1 Objeto2 Objeto3 Arquivo XML Objeto4
Descrição da Solução Data Access Object (DAO) oferece uma interface comum de acesso a dados e esconde as características de uma implementação específica 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
Descrição da Solução Apresentação Negócio Integração Fonte de Dados aplicacao Visao bddao ObjetoBDDao Banco Relacional dao ObjetoDao bdoodao ObjetoBDOODao Banco OO modelo Objeto xmldao ObjetoXMLDao Arquivo XML
Introdução CRUD DAO Exemplo Data Access Object (DAO) Prof. Enzo Seraphim
Definição CRUD é acrônimo das operações básicas utilizadas em Banco de Dados : Create Criar ou adicionar novas entradas Retrieve (Read) Ler, recuperar ou ver entradas existentes Update Atualizar ou editar entradas existentes Delete (Destroy) Remover entradas existentes Outros acrônimos ABCD: Add, Browse, Change e Delete BREAD: Browse, Read, Edit, Add e Delete VADE(R): View, Add, Delete, Edit (Restore)
Métodos CRUD void create( ENTIDADE ) Retrieve: ENTIDADE findentidade( ID ) List findallentidade() List findpageentidade(max, first ) int getcountentidade() void update( ENTIDADE ) void delete ( ID )
Matriz de Interações (Matriz CRUD) Retrata as relações entre Funcionalidades (ou atividades) e Entidades (ou tipos de objetos de dados) dentro de um escopo de negócio ou sistema de informação. As células de interseção denotam o tipo de interação CRUD existente que podem ser: Create (inclusão), Retrive (leitura), Update (atualização) e Delete (exclusão). Instrumento útil para identificar agrupamentos que podem ser usados para elaborar: componentes, patterns, módulos ou mesmo aplicações específicas
Pessoa Exemplo de Matriz CRUD Funcionalidade Entidades Cargo Criar Cargo Contratar Pagar Cadastrar Produto Cadastrar Cliente Vender C C U U U U C U U C C U C U U C
Introdução CRUD DAO Exemplo Data Access Object (DAO) Prof. Enzo Seraphim
DAO Data Access Object 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.
Estratégias de Implementação Estratégia DAO Básica Oferece métodos para criar, apagar, atualizar e pesquisar dados em um banco (CRUD). Estratégia DAO Método de Fábrica Utiliza Factory Methods em uma classe para recuperar todos os DAOs da aplicação Estratégia DAO Fábrica Abstrata Permite criar diversas implementações de fábricas diferentes que criam DAOs para diferentes fontes de dados
Estratégia Básica DAO ObjetoNegocio usa ObjetoDao encapsula FonteDados cria/usa obtém/modifica ObjetoTransferencia ObjetoNegocio representa o cliente de dados. É o objeto que requer acesso à fonte de dados para obter e armazenar dados. ObjetoDao abstrai a implementação de acesso aos dados para a ObjetoNegocio para permitir o acesso transparente à fonte de dados. O ObjetoNegocio também delega operações de leitura e armazenamento o ObjetoDao.
Estratégia Básica DAO ObjetoNegocio usa ObjetoDao encapsula FonteDados cria/usa obtém/modifica ObjetoTransferencia FonteDados representa uma implementação de fonte de dados, tais como SGBD, SGBDOO, etc. ObjetoTransferencia representa um objeto de transferência usado como carregador de dados. O ObjetoDao pode usar um objeto de transferência para retornar dados para o cliente. O ObjetoDao também pode receber os dados do cliente em um objeto de transferência para atualizar os dados no FonteDados
Conseqüências Transparência quanto à fonte de dados Facilita migração para outras implementações Implementar DAO com mesma interface Reduz complexidade do código nos objetos de negócio Centraliza todo acesso aos dados em camada separada que pode ser usada por qualquer componente (servlets, EJBs) Camada adicional Pode ter pequeno impacto na performance
Estratégia DAO Método de Fábrica http://java.sun.com/blueprints/corej2eepatterns/patterns/dataaccessobject.html
Estratégia DAO Fábrica Abstrata http://java.sun.com/blueprints/corej2eepatterns/patterns/dataaccessobject.html
Introdução CRUD DAO Exemplo Data Access Object (DAO) Prof. Enzo Seraphim
Estratégia Básica DAO ObjetoNegocio usa ObjetoDao encapsula FonteDados public class DataSource{ public static EntityManagerFactory emf = Persistence.createEntityManagerFactory( "LocadoraPU"); } public static EntityManager createentitymanager(){ return emf.createentitymanager(); } :EntityManagerFactory :EntityManager persistence. xml createentitymanager()
Estratégia Básica DAO ObjetoNegocio usa ObjetoDao encapsula FonteDados ClienteDao create retrieve update delete LocacaoDao create retrieve update delete FilmeDao create retrieve update delete Cliente -login:string -cpf:string -nome:string Locacao * 1 -id:int -locacao:calendar -devolucao:calendar Filme -codigo:int -nome:string
Exemplo Cliente -login:string -cpf:string -nome:string Locacao * 1 -id:int -locacao:calendar -devolucao:calendar Filme -codigo:int -nome:string package br.edu.unifei.bd.locadora; import javax.persistence.entity; import javax.persistence.generatedvalue; import javax.persistence.id; @Entity public class Filme { @Id @GeneratedValue private int codigo; private String nome; } //... Get s e Set s
Exemplo Cliente -login:string -cpf:string -nome:string Locacao * 1 -id:int -locacao:calendar -devolucao:calendar Filme -codigo:int -nome:string package br.edu.unifei.bd.locadora;... @Entity public class Locacao { @Id @GeneratedValue private int id; @OneToOne private Filme filme; @ManyToOne private Cliente cliente; } private Calendar locacao; private Calendar devolucao; //... Get s e Set s
Exemplo Cliente -login:string -cpf:string -nome:string Locacao * 1 -id:int -locacao:calendar -devolucao:calendar Filme -codigo:int -nome:string package br.edu.unifei.bd.locadora;... @Entity public class Cliente { @Id private String login; private String CPF; private String nome; @OneToMany private List<Locacao> locacoes = new ArrayList<Locacao>(); } //... Get s e Set s
Estratégia Básica DAO ObjetoNegocio usa ObjetoDao encapsula FonteDados ClienteDao create retrieve update delete LocacaoDao create retrieve update delete FilmeDao create retrieve update delete Cliente -login:string -cpf:string -nome:string Locacao * 1 -id:int -locacao:calendar -devolucao:calendar Filme -codigo:int -nome:string
CRUD Create,Update,Delete emf:entitymanagerfactory persistence.xml createentitymanager() createentitymanager em:entitymanager persist() merge() remove() gettransaction :EntityTransaction begin() commit() c1:cliente login="ze" cpf="123456789" nome="jose Silva" l1:locacao * 1 id="1" locacao devolucao f1:filme codigo="1" nome="hp 1"
Estratégia Básica DAO ObjetoNegocio usa ObjetoDao encapsula FonteDados ClienteDao create retrieve update delete LocacaoDao create retrieve update delete FilmeDao create retrieve update delete Cliente -login:string -cpf:string -nome:string Locacao * 1 -id:int -locacao:calendar -devolucao:calendar Filme -codigo:int -nome:string
CRUD Create,Update,Delete public class FilmeDao { private EntityManager em; public FilmeDao(EntityManager em) { this.em = em; } public void create(filme filme) { em.gettransaction().begin(); em.persist(filme); em.gettransaction().commit(); }
CRUD Create,Update,Delete public void update(filme filme) { em.gettransaction().begin(); em.merge(filme); em.gettransaction().commit(); } } public void delete(int codigo) { em.gettransaction().begin(); Filme filme = findfilme(codigo); em.remove(filme); em.gettransaction().commit(); }...
CRUD Retrive emf:entitymanagerfactory persistence.xml createentitymanager() em:entitymanager createquery() :Query getsingleresult() getresultlist() :Iterator<> hasnext() next() :List<> iterator() size()
Estratégia Básica DAO ObjetoNegocio usa ObjetoDao encapsula FonteDados ClienteDao create retrieve update delete LocacaoDao create retrieve update delete FilmeDao create retrieve update delete Cliente -login:string -cpf:string -nome:string Locacao * 1 -id:int -locacao:calendar -devolucao:calendar Filme -codigo:int -nome:string
CRUD Retrive public class Filme{... public Filme findfilme(int codigo) { return (Filme) em.createquery( "from Filme where codigo = " + codigo).getsingleresult(); } public List<Filme> findallfilme() { return em.createquery( "from Filme").getResultList(); }
CRUD Retrive public List<Filme> findpagefilme (int max, int first) { Query query = em.createquery( "from Filme"); query.setmaxresults(max); query.setfirstresult(first); return query.getresultlist(); } } public long getcountfilme() { return (Long) em.createquery( "select count(*) from Filme" ).getsingleresult(); }
Os logotipos, marcas comerciais e nomes de produtos citados nesta publicação tem apenas o propósitos de identificação e podem ser marcas registradas de suas respectivas companhias. Padrão J2EE Data Access Object (DAO) Prof. Enzo Seraphim