Dao

14 respostas
L

Ola pessoa estou implmentando um DAO aki e me deparei com uma situação q estou com uma duvida

por exemplo:

eu criei assim:

public Cliente getClienteById(Integer clienteId){}

ate blz, eu pego por id.

mas e se eu fizer uma consulta mais detalhada, com varias variaveis, por exemplo:

data de cadastro, nome, cpf e tal

digamos q eu tenha uma tela com todos os esses campos para que o usuario faça o filtro.

como ficararia a declaração do meu metodo no DAO ??

vlw

14 Respostas

D

Passa o teu proprio objeto

public Cliente getCliente(Cliente c){}
J

Passa o objeto que possui todos os atributos e na implementação do seu DAO, você verifica se o cara é nulo e caso contrário coloca ele no where do SELECT.

Dica: se estiver usando Hibernate (não JPA), use a API de Criteria.

L

mas dessa forma ele vai retornar o mesmo objeto nao ??

mas meu pode retornar varias ocorrencias!!

e eu tambem posso fazer um filtro como por exemplo:

ver quais clientes fizemos cadastro entre 2 datas.

ainda to sem entender!!

N

Eu faço uso de um método bem simples, o qual eu chamo readByCriteria. Já ouviu falar na estrutura de dados Map, do Java? Pois bem, eu passo um mapa de critérios para o método, e ele se vira para rearranjar a query da maneira dos critérios. Por exemplo, suponhamos que eu queira buscar os alunos que foram cadastrados entre duas datas:

Na View:

try
{
   Map<String, Object> criteria = new HashMap<String, Object>();
                       criteria.put("dataInicio", dataInicioTextField.getText());
                       criteria.put("dataTermino", dataTerminoTextField.getText());

   List<Aluno> alunos = AlunoDAO.readByCriteria(criteria);
}
catch (Exception err)
{
   err.printStackTrace();
}

No DAO:

public List<Aluno> readByCriteria(Map<String, Object> criteria) throws Exception
{
   String query = "Select * From Alunos Where True ";
   if ( criteria != null )
   {
      // Caso queira pesquisar por nome...
      if ( criteria.containsKey("nome") ) query.concat("And Nome Like '%" + criteria.get("nome").toString() + "%' ");
      // Caso queira pesquisar por status...
      if ( criteria.containsKey("status") ) query.concat("And Status = " + criteria.get("status").toString() + " ");
      // Caso queira pesquisar por data...
      if ( criteria.containsKey("dataInicio") && criteria.containsKey("dataTermino") ) query.concat("And Data Between " + criteria.get("dataInicio").toString() + " And " + criteria.get("dataTermino").toString() + " ");

      // E o resto é feito aqui...
   }
}

Traduzindo: você deve manipular todo tipo de pesquisa que você acha que vai fazer e tratar ali… Daí, é só passar os valores pelo mapa de critérios e voilà!

Espero ter sido útil!
Abraços!

L

Opa!! baum demais, vlw mesmo!

vai ser muito util!!

to começando agora em padrões e volta e meia surge duvidas…

brigadão!!
:smiley:

L

Nicolas Fernandes:
Eu faço uso de um método bem simples, o qual eu chamo readByCriteria. Já ouviu falar na estrutura de dados Map, do Java? Pois bem, eu passo um mapa de critérios para o método, e ele se vira para rearranjar a query da maneira dos critérios. Por exemplo, suponhamos que eu queira buscar os alunos que foram cadastrados entre duas datas:

Na View:

try
{
   Map<String, Object> criteria = new HashMap<String, Object>();
                       criteria.put("dataInicio", dataInicioTextField.getText());
                       criteria.put("dataTermino", dataTerminoTextField.getText());

   List<Aluno> alunos = AlunoDAO.readByCriteria(criteria);
}
catch (Exception err)
{
   err.printStackTrace();
}

No DAO:

public List<Aluno> readByCriteria(Map<String, Object> criteria) throws Exception
{
   String query = "Select * From Alunos Where True ";
   if ( criteria != null )
   {
      // Caso queira pesquisar por nome...
      if ( criteria.containsKey("nome") ) query.concat("And Nome Like '%" + criteria.get("nome").toString() + "%' ");
      // Caso queira pesquisar por status...
      if ( criteria.containsKey("status") ) query.concat("And Status = " + criteria.get("status").toString() + " ");
      // Caso queira pesquisar por data...
      if ( criteria.containsKey("dataInicio") && criteria.containsKey("dataTermino") ) query.concat("And Data Between " + criteria.get("dataInicio").toString() + " And " + criteria.get("dataTermino").toString() + " ");

      // E o resto é feito aqui...
   }
}

Traduzindo: você deve manipular todo tipo de pesquisa que você acha que vai fazer e tratar ali… Daí, é só passar os valores pelo mapa de critérios e voilà!

Espero ter sido útil!
Abraços!

Mas ai você está fazendo uso do JPA ou JDBC puro?
Pergunto isso por que se for JDBC puro ao concatenar a consulta em uma String você possibilita o SQL Injection e isso pode prejudicar a segurança da aplicação. Se você usa isso junto com PreparedStatement e os coringas ("?") ai não tem problema.

L

eu to usando o jdbc purro

mas eu uso o prepared statement tbm.

vlw

T

Passar o próprio objeto é complicado, porque nesse caso o único atributo relevante é o id do cliente. E criar um objeto Cliente apenas com o id inicializado, tendo todos os outros atributos nulos, nem sempre é possível devido às regras de consistência. Exemplo: um objeto Cliente pode ser criado com o nome nulo?

P

Para complementar as dicas: procure pelo padrão QueryObject.

Abraços.

N

laudenpower:

Mas ai você está fazendo uso do JPA ou JDBC puro?
Pergunto isso por que se for JDBC puro ao concatenar a consulta em uma String você possibilita o SQL Injection e isso pode prejudicar a segurança da aplicação. Se você usa isso junto com PreparedStatement e os coringas ("?") ai não tem problema.

Na verdade, eu faço uma função JavaScript que retira as palavras que possam causar SQL Injection, não necessitando dessa preocupação no meu modelo :smiley:

L

Na verdade, eu faço uma função JavaScript que retira as palavras que possam causar SQL Injection, não necessitando dessa preocupação no meu modelo

validar com javaScript é arriscado, pois o usuario pode desativar e dependendo a estrutura da aplicação, td vai por agua abaixo! :shock:

N

leandroleo:
Na verdade, eu faço uma função JavaScript que retira as palavras que possam causar SQL Injection, não necessitando dessa preocupação no meu modelo

validar com javaScript é arriscado, pois o usuario pode desativar e dependendo a estrutura da aplicação, td vai por agua abaixo! :shock:

Tem esse porém. Mas nada impede de eu criar em minhas classes de Serviço um método que retire as palavras de SQL Injection, do mesmo modo do Javascript!

L

claro claro!!!

nesse caso sim.

ai é bem melhor :smiley:

T

Se você usar PreparedStatement como sugeriu o colega laudenpower, pode jogar todo esse código no lixo.

Criado 15 de setembro de 2010
Ultima resposta 16 de set. de 2010
Respostas 14
Participantes 7