Dao

14 respostas
leandroleo

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

diogoprosoft

Passa o teu proprio objeto

public Cliente getCliente(Cliente c){}
Jair_Rillo_Junior

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.

leandroleo

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!!

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!

leandroleo

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:

laudenpower

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.

leandroleo

eu to usando o jdbc purro

mas eu uso o prepared statement tbm.

vlw

tnaires

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?

PauloBrito

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

Abraços.

Nicolas_Fernandes

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:

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:

Nicolas_Fernandes

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!

leandroleo

claro claro!!!

nesse caso sim.

ai é bem melhor :smiley:

tnaires

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