Laboratório de Banco de Dados Aula 3 Isolando a Camada de Persistência Prof. Josenildo Silva [email protected] Introdução JDBC permite que se tenha acesso a BD a partir de uma classe java Introdução JDBC permite que se tenha acesso a BD a partir de uma classe java Como você aprendeu no lab. 1 Introdução Entretanto acrescenta complexidade e possível redundância de código espalhados por todo o projeto. Introdução Entretanto acrescenta complexidade e possível redundância de código espalhados por todo o projeto. Como você percebeu no lab. 2 Introdução Como resultado temos um pesadelo de manutenção. Introdução Como resultado temos um pesadelo de manutenção. Imagine ter que mudar de SGBD, com código do lab. 2 Introdução Além disso, dados podem estar armazenados em diversos formatos e tecnologias • SGBD: relacionais, BDOO, NoSQL • Formatos: texto, XML, binário, etc. • Fabricantes: oracle, postgres, mysql, etc. Introdução Então, como manter o projeto simples, sem redundância e fácil manutenção quando se usa JDBC? Padrão Data Access Object cria uma camada intermediária entre a camada de negócios e os detalhes de armazenamento persistente DAO <<interface>> ProdutoDAO implementa JDBCProdutoDAO usa Produto DAO public class Produto{ //getters e settes não mostrados ... } public interface ProdutoDAO{ public void salvar(Produto p); public Produto ler(Integer id); public List<Produto> lerTodos(); // ... outros métodos CRUD ... } public class JDBCProdutoDAO{ @override public void salvar(Produto p) { ... } // ... } DAO public class Teste{ public static void main(String args[]){ // ... ProdutoDAO pdao = new JDBCProdutoDAO(); // ... } } DAO E quanto às outras entidades? DAO <<interface>> ProdutoDAO implementa JDBCProdutoDAO usa Produto DAO <<interface>> usa <<interface>> usa ProdutoDAO ClienteDAO implementa implementa JDBCProdutoDAO JDBCClienteDAO Produto Cliente DAO <<interface>> usa Produto <<interface>> usa ProdutoDAO Cliente <<interface>> usa ClienteDAO Pedido PedidoDAO implementa implementa JDBCProdutoDAO JDBCClienteDAO JDBCPedidoDAO DAO |Extensões E se existirem implementações diferentes? DAO |Extensões <<interface>> ProdutoDAO implementa JDBCProdutoDAO usa Produto DAO |Extensões <<interface>> ProdutoDAO usa implementa JDBCProdutoDAO XMLProdutoDAO Produto DAO |Extensões <<interface>> ProdutoDAO usa implementa JDBCProdutoDAO XMLProdutoDAO MongoProdutoDAO Produto DAO |Extensões DAOFactory usa <<interface>> usa ProdutoDAO cria implementa JDBCProdutoDAO XMLDAOFactory MongoDAOFactory JDBCProdutoDAO XMLProdutoDAO MongoProdutoDAO Produto DAO |Extensões public class Teste{ public static void main(String args[]){ // ... ProdutoDAO pdao = DAOFactory()... ; // ... } } DAO |Problemas DAOs podem ficar com API muito complexa e acoplada a detalhes da entidade Exemplo: consultas e atualizações Alternativa Muitos desenvolvedores estão utilizando o padrão Repository no lugar de, ou sobre, o DAO Alternativas JPA + frameworks tem sido a escolha mais popular atualmente. Alternativas Versão atual 3.0 JPA + frameworks tem sido a escolha mais popular atualmente. Alternativas Hibernate OpenJPA EclipseLink TopLinks Essential JPA + frameworks tem sido a escolha mais popular atualmente. Referências • http://tutorials.jenkov.com/javapersistence/dao-design-problems.html • http://blog.caelum.com.br/possibilidades-dedesign-no-uso-do-seu-generic-dao/ • http://thinkinginobjects.com/2012/08/26/dontuse-dao-use-repository/ • http://gc.blog.br/2009/01/17/sindrome-de-dao/ • http://manifesto.blog.br/2.0/Programacao/reposit ory-pattern • http://www.rponte.com.br/2009/06/08/no-moredaos/