Prévia do material em texto
Este módulo refere-se à utilização do Padrão DAO (Data Access Object) nas aplicações. O padrão de projeto DAO surgiu para facilitar a comunicação entre as camadas de negócio e de persistência. Através de classes modeladas. seguindo este padrão, é possível substituir uma sequência complexa de troca de comandos entre a aplicação e banco de dados por uma única chamada do tipo inserir(Objeto) ou apagar(Objeto). Uma das premissas básicas da Programação Orientada a Objetos sempre foi a reusabilidade, e buscando-se demonstrá-la foi desenvolvida uma classe abstrata chamada GenericDao: public abstract class GenericDao { protected EntityManager em; Class clazz; public GenericDao (EntityManager em, Class clazz) { this.em = em; this.clazz = clazz; } public void save (T entity) { EntityTransaction trans = em.getTransaction ; trans.begin(); try { em.persist (entity) ; trans.commit () ; } catch (Exception e) { trans.rollback () ; } } public void delete (T entity) {EntityTransaction trans = em.getTransaction () ; trans.begin(); try { em.remove (entity) ; trans.commit () ; } catch (Exception e) { trans.rollback (); } } public T findById (Long id) { return em. find (clazz, id) ; } @SuppressWarnings ("unchecked") public List list { return em.createQuery ("from " + clazz.getName ) .getResultList ; } } A classe GenericDao foi desenvolvida utilizando-se um recurso da linguagem Java chamado generics. Isso fica evidente pela notação em sua declaração. Generics permite à uma classe guardar a referência para uma outra classe. A classe PessoaDao estende a classe GenericDao: public class PessoaDao extends GenericDao { public PessoaDao(EntityManagen em) { super(em, Pessoa.class); } }Na declaração da classe PessoaDao é possível notar que a classe GenericDao é estendida na forma GenericDao. A classe GenericDao, como explicado anteriormente, utiliza recurso generics para manter a referência da classe Pessoa, a qual será manipulada pelos métodos da classe GenericDao. Com isso, a classe PessoaDao não precisa sobrescrever ou implementar nenhum método, pois os métodos implementados pela classe GenericDao trabalham com referências à , que foram substituído por Pessoa na classe PessoaDao. A figura abaixo finaliza exemplo, aplicando as classes anteriores na classe TesteArtigo. public class TesteArtigo { public static void main (String [] args) { EntityManager em = EntityManagerProvider.getEntityManagerInstance() ; Pessoa douglas = new Pessoa ; douglas setNome ("Douglas"); douglas setCpf ("12312312312") ; douglas setRg ("121212121212") ; Calendar anivDouglas = GregorianCalendar getInstance () ; anivDouglas. set (1983, 11, 23) ; douglas setDataNascimento (anivDouglas getTime () ) ; PessoaDao daoPessoa = new PessoaDao (em) ; System. out. println ("\nSalvando Douglas") ; daoPessoa.save (douglas) ; Pessoa fabio = new Pessoa () ; fabio. setNome ("Fabio") ; fabio. setCpf ("23356789045" fabio. setRg ("546782347") ;Calendar anivFabio = GregorianCalendar. getInstance () ; anivFabio. set (1970, 8, 19) ; fabio. setDataNascimento (anivFabio. getTime () ) ; System. out. println ("\nSalvando Fabio"); daoPessoa.save (fabio) ; System. out. println ("\nListando dois") ; for (Pessoa p : daoPessoa.list ) { System. out. println (p. getNome + " faz em " + p. . getDataNascimento () + ". CPF = " + p.getCpf + " e RG = " + p. getRg ) ; } System. out. println ("\nDeletando Douglas") ; daoPessoa. delete (douglas) ; System. out. println ("\nListando tudo (Só sobrou Fabio) ") ; for (Pessoa p : daoPessoa.list ) { System. out. println (p. getNome () + " faz em " + p. . getDataNascimento () + " CPF = " + p.getCpf + " " e RG = " + getRg () } } }