Andei revirando o fórum do PJ e não achei nenhum exemplo prático de aplicação de DAO. Alguém poderia me passar um exemplo desses? uma classe de conexão, esquema de classes do DAO e um JSP que faça as operações básicas (exibição, inclusão, alteração, exclusão de registros) ?
Ah … além do exemplo eu queria tentar entender … alguém poderia me dizer onde encontrar ou então até mesmo explicar o conceito e como funciona ?
Data Access Object, é uma camada que vai persistir e recuperar seus objetos.
Por exemplo, num modelo MVC, ele será a camada do Modelo, onde receberá os objetos que irão persistir ou serão recuperados.
Exemplo:
Você tem sua interface gráfica e camada de regras de negócio, a camada de regras de negócio passa para o DAO um objeto e ele faz a persistência assim:
Valeu! Legal, já consegui ter uma idéia geral de DAO …
Mas como eh uma implementação correta disso? digo a nível de código…
eu já vi classes muito malucas que usam ArrayList e tudo mais …
tô procurando um código assim e não encontro … queria entender todo aquele esquema de classes, e ver um JSP utilizando isso …
Muito obrigado, RafaelJ !
Abraço!
P
pcalcadoPJ
Não exatamente, Rafael.
Se o DAO for seu modelo, JSP sua apresentação e o controler do framework…onde estão seus objetos de negócio?
Os objetos são o modelo.
DAO é utilizado para persistir objetos num SGBD, escrevi brevemente sobre isso outro dia, desatualizado e rpecisandod e algumas correções, mas um bom ponto de partida…
O exemplo em questão msitura as três camadas do sistema num servlet.
A camada de persistência deve ser responsável por tudo relativo a isso, inclusive abrir conexões (ou pegar em um pool).
O simples fato de ter um exemplo em PHP e outro em Java com a mesa estrutura já msotra que essa implementação é JASP: Java fingindo ser ASP
[]s
E
eschoedlerPJ
E aí, blz? eu vi isso, realmente ele está meio confuso… mas onde eu encontro um exemplo assim para usar? Eu encontrei um outro, o DAO Examples (no site http://daoexamples.sourceforge.net/), mas eh muito complicado… trocentas classes para 1 mísera tabelinha… muito confuso…
Eu queria uma coisa como o exemplo do site anterior, mais enxuto e fácil de entender, claro que não mal implementado … Tem como ?
Obrigado pelo interesse!
Abraços.
P
pcalcadoPJ
Olá,
O buraco é mais embaixo. Você não tem trinta classe para mostrar uma tabela, você tem uma tabela para persistir trinta classes
Mas, focando…
Crie uma classe com métodos CRUD - Create Remove Update Delete segundo o padrão daquele meu artigo.
Quando um método é chamado, o DAO abre/pega a conexão e faz o SQL da operação. Um DAO pdoe chamar outros DAOs para persistir atributos que sejam objetos.
[]s
E
eschoedlerPJ
Cara, deixa eu ver se entendi …
vai ter uma classe que eh o Factory, certo? Ela vai instanciar e me entregar a classe DAO da tabela, certo? Nessa classe DAO da tabela, ele vai fazer as buscas ao banco e persistir os dados numa 3ª classe, certo? É nessa 3ª classe que vai ter uma Collection ou um ArrayList com uma classe “pura”, somente com propriedades e métodos para um registro ?
Obrigado!
P
pcalcadoPJ
Pode ser que sim ou não, é uma decisão do projetista. Você pdoe simplesmente instanciar um DAO se rpeferir.
Um cuidado fundamental é: os cidadões de primeira classe no seu sistema são objetos, não tabelas, segundo as palavras do Tio Meyer.
Não. A menos que você esteja usando Hibernate ou outro framework que abstrai o acesso ao banco de dados via JDBC, o DAO vai usar Connections, PreparedStatements e ResultSets normalmente.
Essa classe “pura” não deve existir, a menos que você use um DTO., e, acredite, você não vai querer usá-lo.
O seu DAo persiste diretamente para seu banco de dados ou num ambiente com, por exemplo, Hibernate, ele interage com o framework.
O ponto é que ele é o único componente no seu sistema que toca a persistência, seja JDBC, XML, Hibernate…
[]s
A
adorilsonPJ
pcalcado,
Essa classe “pura” não deve existir, a menos que você use um DTO., e, acredite, você não vai querer usá-lo.
Vamos supôr um sistema de gerenciamento de notícias. Temos um objeto Noticia.
Esse objeto representa uma notícia que seu sistema manipula. Ele é o cidadão de primeira classe (mais uma referência ao tio Meyer) do seu sistema.
Esqueça as tabelas até quando elas forem necessárias. Elas só são necessárias na hora de persistir, ou seja, na hora de salvar seu objeto no banco de dados.
Você passa o objeto em questão ao DAO e ele tem que realizar todas as etapas para persistir. Num exemplo JDBC, ele:
Obtêm ou abre uma conexão
Cria o INSERT SQL com os atributos do objeto
Executa a query
Fecha/devolve a conexão
Para a camada de negócios, só existem objetos de domínio (a Notícia em questão) e os DAOs, que oferecem os serviços de persist~encia. Eles são os responsáveis por lidar com o banco de dados.
Utilizando esta estratégia, você não precisa de um objeto “puro”, um objeto que só tenha atributos. Este tipod e objeo é uma anomalia num sistema OO e deve ser evitado a qualquer custo.
Devo estar fazendo correções e disponibilizando este em algum lugar em breve…
[]s
P
pcalcadoPJ
Esqueci…
Os DAOs no projeto citado recebem os atributos do objeto, ao invés de receber os objetos. Isso é um acoplamento extremo e desnecessário (qualquer mudança na estrutura dos atributos e você vait er que mudar a assinatura dos métodos do seu DAO).
Na sua interface DAO, o metodo retornaFiltro deve ser usado para o caso onde nao se sabe por quais atributos o usuario vai querer filtrar? Tipo colocar um formulario de pesquisa com alguns (e pq nao todos?) campos do BO e deixar o usuario preencher o que ele quizer?
Daí vai uma pergunta pra quem usa entity bean: como fazer esse tipo de pesquisa usando entity bean, uma vez que as consultas são predefinidas nos XML´s? Estou definindo uma arquitetura e até agora ela está com entity bean, mas depois de ver alguns discussoes ak no PJ, e por essa caracteristica estou mudando a persistencia, falta definir o que vou colocar no lugar deles.
Talvez use Hibernate. É possivel definir os filtros dinamicamente nele?
P
pcalcadoPJ
Olá,
É comum definir em um DAO alguns métodos de busca filtrada. Você pdoe definir métodos como
De acordo com sua necessidade. Não tente ser mais genérico do que você vai rpecisas, a medida que forem necessários você pode incluir mais métodos.
Você teria que criar consultas em XML para cada método de filtro implementado.
Note que na grande maioria dos casos, usar EJB pdoe ser um overhead desnecessário, e mesmo em casos onde eles são, geralmente apenas Stateless Session Beans compensam.
Estude sobre a linguagem de query do Hibernate, entretanto se você precisa de ferramentas muito genéricas para tratar dados, você pdoe ter mais produtividade utilizando um framework específico 9não, não conheço nenhum por enquanto )
[]s
A
adorilsonPJ
É comum definir em um DAO alguns métodos de busca filtrada. Você pdoe definir métodos como
Código:
lsitarUsuariosComecandoCom(String nomeInicio);
lsitarUsuariosEntreIdades(int anoInicio, int anoFim);
De acordo com sua necessidade. Não tente ser mais genérico do que você vai rpecisas, a medida que forem necessários você pode incluir mais métodos.
Rapaz, isso eu já faço. O problema é q eu tenho q ficar combinando os atributos em metodos. Pra ficar com seu exemplo, se o usuario quizesse os comecando com determinada letra e com certa idade, seria algo como
lsitarUsuariosComecandoComEntreIdades(String nomeInicio, int anoInicio, int anoFim);
E aí a complexidade vai aumentando de acordo com a quantidade de campos q estiverem disponiveis para filtragem, não só na camada de persistencia, como tb na camada de controle.
O q eu quero é algo com faziamos nos bons tempos de programacao estruturada, onde vamos testando se o usuario selecionou determinando campo e montando a string SQL pra se executada. Entendeu?
Alguem tem algo parecido em J2EE?
P
pcalcadoPJ
Isso é bem simples de se fazer usando um pouco de SQL.
Basta você criar um filtro (WHERE) baseado na entrada do usuário, recebendo como argumento uma lista de pares chave=valor.
Por exemplo.
O usuário escolhe pesquisar por NOME, ESTADO e IDADE. Você pdoe criar um map:
Define um método no seu DAO que receba um Map (ou outra coisa que você preferir) e retorne uma lsita de objetos montados baseado no SQL gerado.
Se você quer algo pronto, um framework ou algo do tipo, para fazer bsucas no SGBD, não conheço (e acho que SQL já é cuficiente neste caso), mas se você quer fazer bsucas em um contexto de objetos, pode tentar uma linguagem como XPath.