Para não desvirtualizar o um outro topico do forum que é muito válido e devemos incentivar abri este tópico para endereçar a pergunta que o Rodrigo Sasaki me fez lá.
Acho que vale a pena um tópico disto porque é uma assunto que toca a todos.
O problema do DAO é que já morreu. É um padrão que tem uma utilidade especifica mas que virou bala de prata. Todos os projetos insistem em ter uma camada de DAO mesmo quando não precisam.
A desculpa clássica é : se eu mudar a forma de persistencia, é só mudar o DAO. Em tese isto é válido, mas apenas se todas as regras estão na camada do DAO. Quando o DAO começou a ser usado ele servia para isolar as regras de acesso ao banco e quando digo regras me refiro às queries não à tencologia. Hoje em dia as pessoas querem usar annotations jpa , hibernate, noSQL que utilizam sempre algum tipo de metamodelo. O metamodelo é uma coisa muito poderosa porque o programador programa declarativamente e não imperativamente. A programação declarativa é importante pois acelera o desenvolvimento pois algum já fez um framework para executar a parte imperativa. O uso de metadados é uma das top mecanicas para desenvolver software robusto e não é por acaso que o vemos em todo o lugar agora. Então o velho DAO que usavamos no EJB2.1 às 8 anos para encapsular as chamadas ao JDBC não tem mais utilidade. O DAO é uma instancia do padrão Service ( O nome é Data Access Object, mas poderia ser Data Access Service) em que existe uma interface e várias implementações para cada entidade. E a ideia é que isso gera uma familia de serviços de dados que depois temos que encapsular num abstract factory. Isso é muito bonito, mas na prática ninguém faz isso. Na prática a camada de DAO é apenas mais uma camada de indireção que não traz vantagens. Com as tecnologias modernas não é mais necessário usar o DAO.
O uso extensivo do DAO em todos os projetos e em todos os exemplos em todos os sites e revistas levam à ideia que é uma padrão fundamental. O mesmo vimos como o Singleton. Porque são padrões simples de entender, mas difíceis de implementar e realmente utilizar de fato, geram essa falsa sensação que o design está bem feito. Não é o uso do padrão X ou Y que faz um bom design. São regras mais abstratas como o DRY , a separação de responsabilidade, a inversão de controle , e um monte de outros princípios do design. Se dados estes princípios e a tecnologia e os constrangimentos o DAO for a melhor solução, ótimo. Mas hoje em dia não estamos mais no mesmo nível de constrangimentos e tecnologia que estávamos no tempo do EJB 2.1. Hoje não faz mais sentido usar o DAO.
hoje todo o mundo insiste em usar o DAO com o JPA ou hibernate por trás. Isso é um bom isolamento de fato ? Não. Porque essas tecnologias funcionam com base no metamodelo e metamodelos está nas classes de entidade, não no DAO.
Se tiver um sistema usando hibernate como base com DAO vc até consegue migrar para JPA porque é compativel, mas tenta migrar para noSQL ou JDBC puro. Não dá. O JPA e o Hibernate têm uma lógica interna de contexto (padrão unitOfwork) que o jdbc não tem. Quando vc dá save no hibernate não é a mesma coisa que no jdbc. No jdbc não tem fetch lazy. Então modelo conseptual que está sendo usado, embora dizendo que usa DAO é o modelo e um objeto que conhece as entidades e o metamodelo do dominio, que sabe ligar as entidades entre si de forma automática, etc… isso é o DomainStore.
Não ha necessidade de criar uma camada DAO em projetos modernos. Outras coisas como Strategy ou Template Method podem resolver a maior parte do pontos de diferença. O resto é 99,99% sempre a mesma coisa e é nisso que o JPA e semelhantes se baseiam.
O problema não é com o DAO em si, é como a forma que as pessoas o usam. Da forma errada. Da mesma forma que o pessoal insiste com singleton, por exemplo. Mas ninguem ouve falar em Memento por exemplo que resolve uma pá de problemas relacionados a persistencia e é usado dentro do hibernate, por exemplo. Foi um foco da midia especializada ha 8 anos atrás que deu essa ideia que o DAO é um padrão sem o qual a sua arquitetura não está completa. Não. Ha muitos outros padrões mais uteis e que o pessoal simplesmente ignora. Por quê ? porque não tiveram na midia e portanto são menos conhecidos e as pessoas não lembra deles. Não é possivel usar o que desconhecemos. Mas usando os principios de design vc consegue cehgar em muitos padrões sem saber o que é um padrão. Os padrões nada mais são que receitas prontas da aplicação dos principios a certos cenários, o problema é que as pessoas esqueceram os principios e só olham as receitas. E nem sempre isso dá certo.
O problema do DAO é que ele já morreu, mas as pessoas continuam usando. É como vestir vintage. Não. Em software não existe vintage, sempre temos que evoluir.