Existe alguma forma padrão de se fazer uma classe DAO? Quero dizer, métodos insert, delete etc… ou um método que retorne uma lista de registros? Existe alguma classe que possa ser extendida para isso?
Estou fazendo esta pergunta porque andei vendo alguns itens sobre Hibernate e imaginei que poderia migrar uma classe DAO do código SQL para algum tipo de permanência sem que a classe de negócio sentisse nenhuma diferença.
Acho que essa é a idéia, não?
Existe padrão para classes DAO?
13 Respostas
Se você quiser persistir os dados em componentes de negócio utilize os EJBs Entity CMP. Eles são especificos para a persistência, e são bem simples.
:shocked!:
E nao percam, no proximo bloco, o dgouvea vai explicar pra gente que resolver qualquer problema de xadrez em O(1) eh a coisa mais trivial do mundo. 
Serio, nao dava pra ter dado um conselho mais esquisito nao? Da pra chamar Entity Bean CMP de qualquer coisa, menos de simples…
Duvida? Ta aqui o diagrama do ciclo de vida do bicho:

Uma ideia mais sensata seria dar uma olhada na implementacao de DAO (que, alias, foi renomeado pra Table Data Gateway ;)) que tem no J2EE Core Patterns e no Patterns Of Enterprise Application Architecture. Ambos otimos livros sobre o assunto, e geralmente a melhor fonte pra buscar esse tipo de conhecimento 
eu entendo que a classe de negócio que o dsiviotti se refere seja um EJB. Se ele está usando um EJB qual o problema de usar um Entity CMP. Ta certo que tem suas desvantagens de não poder executar consultas complexas, mas acredito que não haveria problemas. Pode ser chato ficar configurando os arquivos XML, mas não é nenhum bicho de sete cabeças. 
Gézus! :shock: Acho que eu perdi o memorando que dizia que so se colocava regra de negocio dentro de EJB :D
Ah, mais uns links, falando sobre DAOs, Hibernate e Cia Ltda.:
:arrow: http://www.hibernate.org/110.html
public class ProductDaoImpl extends HibernateDaoSupport implements ProductDao {
public List loadProductsByCategory(String category) {
return getHibernateTemplate().find(
"from test.Product product where product.category=?", category,
Hibernate.STRING);
}
}
(fala que isso nao eh lindo! :D)
:arrow: http://forum.hibernate.org/old/909428.html - DAO Examples for Hibernate
Blz eu ASSUMO que interpretei mal o post. :oops:
Relaxa, dgouvea
- eu nao tomei cafe ainda (viciado em cafeina eh uma merda…) e a essa hora da manha o cerebro nao ta funcionando direito. Fica dificil ser simpatico nessas horas 
O que seria desse fórum sem o CV ?? 
Na verdade, estava falando de uma classe DAO genérica, com ou sem EJB.
Estive olhando o exemplo de uso do Hibernate e os fontes do GUJ2 e reparei que os DAOs seguem um padrão. Digo, alguns métodos em comun. Era a isso que eu me referia.
Tendo médodos em comum achei que poderia haver uma classs “CustomDAO” ou uma interface para seguir o modelo ou simplesmente é uma prática de programação fazer métodos como “insert”, “delete” “getList” etc…
Valeu pela atenção…
Na verdade, estava falando de uma classe DAO genérica, com ou sem EJB.
Estive olhando o exemplo de uso do Hibernate e os fontes do GUJ2 e reparei que os DAOs seguem um padrão. Digo, alguns métodos em comun. Era a isso que eu me referia.
Tendo médodos em comum achei que poderia haver uma classs “CustomDAO” ou uma interface para seguir o modelo ou simplesmente é uma prática de programação fazer métodos como “insert”, “delete” “getList” etc…
Valeu pela atenção…
Existe um padrão (se é que pode ser chamado de padrão) chamado CRUD (Create, Retrieve, Update, Delete). Uma boa referência: http://www.javaworld.com/javaworld/jw-03-2002/jw-0301-dao.html
dsiviotti,
jah foi discutido algo semelhante aqui:
http://www.guj.com.br/forum/viewtopic.php?t=6734 
Ok, o assunto clareou bastante.
Mas o DAO deve ser genérico ou não?
public java.util.List selectAlunos(Object turma){
if (!(turma instanceof Turma))
throw AlgumaException("");
else {
Turma t = (Turma)turma;
// etc etc...
}
}
ou
public java.util.List selectAlunos(Turma turma){
// etc etc...
}
}
Não precisa usar os parâmetros como Object, pode colocar direto o tipo da Classe como vc fez no segundo exemplo.