Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

DAO para formas diferentes de select

Achei muito interessante a utilização do DAO, mas me gerou a seguinte dúvida. Usando apenas o select como exemplo, podemos buscar dados utilizando diferentes condições de where ou campos que serão selecionados. Exemplo 1 (Selecionando todos os campos, sem where) select * from produto Exemplo 2 (Selecionando todos IDs, sem where) select id from produto Exemplo 3 (Selecionando todos os campos para a categoria informada) select * from produto where categoria_id = variavel_categoria_id

A dúvida é mais no sentido de boas práticas!!!! Cada forma de busca é um método diferente? É comum passar where ou os campos como parâmetros de um método select?

Obrigado pela atenção !

3 respostas
solução!

Bom dia Victor,

Sim, em geral cada busca se refere a um método.

Nos casos que você mencionou, os selects poderiam estar em métodos como:

  • List <Produto> selecionaTodosOsProdutos()
  • List <Integer> selecionaIdsDosProdutos()
  • List <Produto> selecionaProdutosDaCategoria(Categoria categoria)

Isso facilita manutenção do código e também evoluções.

Em geral, não são passados where como parâmetros. Campos também não. Contudo, você pode passar valores que vão refinar suas consultas, como no método selecionaProdutosDaCategoria mencionado.

Espero ter ajudado. Qualquer coisa, avisa aí.

Abraço.

Muito obrigado pela explicação Rafael, foi muito útil!

Olá Victor, tudo bem?

No contexto da tecnologia que você está usando (Java e JDBC "puro"), a resposta é sim. Existem outras formas de se fazer mas será necessário utilizar outras ferramentas para isso que facilitarão a manutenção e entendimento do código.

Exemplos.: JPA com Hibernate:

Query query = manager
            .createQuery("select t from Tarefa as t "+
                    "where t.finalizado = :paramFinalizado");
    query.setParameter("paramFinalizado", false);

Named Querys com Hibernate:

@NamedQuery(name="Usuario.buscaPorEmail", 
    query="select u from Usuario u where u.email = :email")

@Entity
public class Usuario {
    // ...
}

Utilizando a Named Query em nosso DAO:

public Usuario buscaUsuarioPorEmail(String email) {
    return this.manager
        .createNamedQuery("Usuario.buscaPorEmail", Usuario.class)
        .setParameter("email",  email)
        .getSingleResult();
}

Obs. Aqui você pode criar uma classe com todas as Named Querys de Usuário por exemplo e no momento da chamada pelo DAO, utiliza o nome definido pela Named Query


Dica: Estude mais sobre o Hibernate, ele possui até mesmo o chamado busca por "Modelo", com isso você tem uma busca dinâmica, com base no que estiver populado o seu modelo ele monta as condições de busca automaticamente.

Existe até um post do blog da Caelum: http://blog.caelum.com.br/simplifique-suas-consultas-com-o-query-by-example-do-hibernate/

Claro que tudo isso vai depender de onde estiver trabalhando, o ideal é ter uma ideia até onde podemos amadurecer as consultas reduzindo a complexidade e facilitando a manutenção.

Espero que tenha colaborado com a sua dúvida, abraço!