Vc tá kerendo fazer um DAO muito abstrato, temos q pensar tb em funcionalidades, pois é MUITO melho vc passar o teu objeto como parâmetro do q param1, param2, param3, param4, … paramX
[quote=“maresp”]Existe alguma orientação no pattern DAO referente à passagem de parâmetros para seus métodos?
Exemplo:
public List selectAlunos(int codUnidade, int codCurso, int codTurma) {
...
PreparedStatement ps = myConnection.prepareStatement(query);
ps.setInt(1, codUnidade);
ps.setInt(2, codCurso);
ps.setInt(3, codTurma);
...
}
ou
public List selectAlunos(Turma turma) {
...
ps.setInt(1, turma.getCodUnidade());
ps.setInt(2, turma.getCodCurso());
ps.setInt(3, turma.getCodTurma());
...
}
Teoricamente a passagem de objetos como parãmetro aumenta o acoplamento entre classes? Estou curioso pq não encontrei nada que falasse a respeito.[/quote]
Que tal:
public java.util.List selectAlunos(Object turma){
if (!(turma instanceof Turma))
throw AlgumaException("");
else {
Turma t = (Turma)turma;
// etc etc...
}
}
Uma dúvida minha em relação ao DAO … se eu tenho o códigopublic void update(Account account) { }
O meu objeto Account tem diversas propriedades … como vocês selecionam o que foi alterado ou não para fazer o update?
Do mesmo jeito no save(Account account) muitas vezes não são todos os campos que já terão valores.
Tb tenho duvida em relacao ao find() …
Hj eu tenho findUserByName(…) … findUserByStatus(…) … e assim vai, mas no fim ficam varias funcoes bastante especificas … é por ai mesmo?
[quote=“ozielneto”]Não faça DAOs tão genéricos, até porque eles fazem consultas específicas em modelos específicos para condiçoes específicas.
Sugiro você com a minha primeira sugestão.
[]'s[/quote]
Quer dizer que para dar suporte a ad-hoc queries você tem que simplesmente ignorar a abstração que o DAO lhe oferece? Acho que não. Que tal assim?
public interface DAO {
public void insert(Object o) throws Exception;
public void delete(Object o) throws Exception;
public void update(Object o) throws Exception;
public java.util.List list() throws Exception;
public java.util.List query(String q) throws Exception;
public Object retrieveByPK(Object pk) throws Exception;
public int sum() throws Exception;
public int sum(String condition) throws Exception;
public int max() throws Exception;
public int max(String condition) throws Exception;
public int min() throws Exception;
public int min(String condition) throws Exception;
public int avg() throws Exception;
public int avg(String condition) throws Exception;
}
E, para dar suporte às ad-hoc queries:
[code]
public interface Query{
/**
* Descrição: executa dada uma query (XPATH, SQL, HQL, ...). O retorno é uma lista de objetos do tipo [i]"pattern"[/i], cujas propriedades serão preenchidas com o resultado da query.
*/
public java.util.List executeQuery(String query, Class pattern);
}[/code]
E uma pequena amostra:
public MyBlaBlaBlaDAO implements DAO{
public java.util.List query(String q) throws Exception{
Query myQuery = new MyRDBMSQuery();
return myQuery.executeQuery(q, MyBlaBlaBlaBean.class);
}
//... outros métodos...
}
Smota, perguntei isso para o Guilherme Silveira na palestra sobre Hibernate, e ele me disse que, como eu, vai na base do IF hehe sério. Pelo menos com um pouco de reflection fica menos feio.
Que falta faz um updateNotNull()
[quote]Smota, perguntei isso para o Guilherme Silveira na palestra sobre Hibernate, e ele me disse que, como eu, vai na base do IF hehe sério. Pelo menos com um pouco de reflection fica menos feio.
Que falta faz um updateNotNull()[/quote]
E para o caso de precisarmos fazer o update (ou select) com valores null, como saber se foi utilizado o método set para setar a propriedade do objeto ou não, mesmo que seja setado para null?
Estava com essa dúvida quando tentei implementar um método de find com os parâmetros passados como uma instância do objeto… ou seja, os atributos setados seriam a restrição ou criteria da query, mas como eu faria se precisasse buscar os objetos com o cpf nulo, por exemplo, haja vista que podemos ter vários campos nulos numa base de dados? No fim implementei da forma que o smota citou, findBy…
Certo LIPE!
Mas se aplicaria no update também… como saber se quero atualizar para null (setando o atributo) ou se não setei o atributo… desculpe ter desvirtuado do assunto, mas no fundo tudo pode ser aplicado numa implementação do padrão DAO!