Não é a primeira vez que eu vou me posicionar PARCIALMENTE contra o padrão DAO. (Eu realmente espero que as pessoas leiam esse PARCIALMENTE antes de começarem a me linchar)
DAO é um importante padrão de projeto que te garante a separação do código de integração com o DBMS e o centraliza, levando à um código mais legivel e fácil de manter.
Contudo eu acho que DAO da maneira como a maioria das pessoas o usa é um pouco indequado. É perfeitamente possível se escrever um unico DAO generico e armazenar as suas queries, por exemplo, em arquivos, sem a necessidade de criar depois um novo DAO para cada entidade. Aplicar padrões de nomeação como PessoaDAO, CarroDAO, WTFDAO, indicam a ocorrência de bad smells no seu código, como pode ser visto em vários livros sobre refactoring. Esse bad smell é fácilmente identificavel pelo padrão de nomeação presente nas classes DAO e seus “efeitos colaterais” podem ser sentidos quando você precisa alterar o código de uma entidade e o código do DAO muda por consequência (toda modificação deveria ser localizada) (uma unica alteração não deveria provocar mudanças em mais de um ponto do seu código).
O DAO totalmente genérico é possível como é demonstrado no livro “Real World JEE Patterns” de Adam Bien, ou mesmo pela própria API do JPA que o oferece na classe EntityManager.
Há, também, a idéia de que o DAO oferece uma melhor separação (independencia) do DBMS e que assim ficaria mais fácil de muda-lo no futuro. Agora vamos convir, em quantos projetos vocês já trabalharam passaram por essa situação? Se você já viveu um caso de alterar o DBMS de uma aplicação pronta, em quantos, do total de projetos que você já desenvolveu, isso aconteceu? Na prática, DBMS tendem a durar mais que as próprias aplicações. Isso pode ser visto aqui mesmo no GUJ com o volume de posts de desenvolvedores com problemas para desenvolver novas aplicações para bancos de legado. (Eu, particularmente, não me lembro de nenhum post de alguém com problemas para substituir o banco de uma aplicação de legado, mas também não pocurei). Esse tipo de “precaução” contra possíveis mudaças é, também, um bad smell reconhecido como “Premature Generalization”. Prover mais flexibilidade do que o seu problema realmente precisa apenas porque talvez em um futuro distante alguém quem sabe possa precisar, apenas torna o seu código maior, menos claro e mais difícil de manter.
De qualquer forma não acho que esse seja o caso do seu trabalho de faculdade. Não se trata de uma conformidade com esse ou aquela padrão de projeto. É apenas um meio de você aprender um pouco sobre stored procedures.