Dao Genérico está certo?

8 respostas
juniorsatanas

este Dao tem algum erro ou pode ser melhorado ?

package br.com.caelum.lojavirtual.dao;
import br.com.caelum.lojavirtual.modelo.Cliente;
import java.util.List;
import br.com.caelum.lojavirtual.modelo.Usuario;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
public class Dao<T> {
    protected final Session session;
    protected final Class classe;
    protected Dao(Session session, Class classe) {
        this.session = session;
        this.classe = classe;
    }
     protected Session getSession(){
        return session;
    }

	 public void adiciona(T u) {
        this.session.save(u);
        }
         public void exclui(T u) {
        this.session.delete(u);
    }
        public void atualiza(T u) {
        this.session.merge(u);
    }    
     public void salvaupdate(T u) {
        this.session.saveOrUpdate(u);
    }    
    
        public T procura(int id) {
        return (T) session.load(this.classe, id);
    }    
     
    public List<T> listaTudo() {
        return this.session.createCriteria(this.classe).list();    
    }    
    public List<T> consultaParte(String nmCampo, String vlCampo) {                
        return this.session.createCriteria(this.classe).add(Restrictions.ilike(nmCampo, "%" + vlCampo + "%")).list();
    }    
    public List<T> consultaExata(String nmCampo, String vlCampo) {                
  	return session.createCriteria(this.classe).add(Restrictions.eq(nmCampo, "%" + vlCampo + "%")).list();   
    } 

    @SuppressWarnings("unchecked")
    public List<Usuario> searchSimilarLogin(String login) {
       return session.createCriteria(Usuario.class).add(
               Restrictions.ilike("login", "%" + login + "%")).list();
    }
  
    @SuppressWarnings("unchecked")
    public List<Usuario> searchSimilarId(Long id) {
       return session.createCriteria(Usuario.class).add(
               Restrictions.ilike("id", "%" + id + "%")).list();
    }
    @SuppressWarnings("unchecked")
    public List<Usuario> searchSimilarSenha(Long senha) {
       return session.createCriteria(Usuario.class).add(
               Restrictions.ilike("senha", "%" + senha + "%")).list();
    }
    @SuppressWarnings("unchecked")
    public List<Cliente> searchSimilarNome(String nome) {
       return session.createCriteria(Cliente.class).add(
               Restrictions.ilike("nome", "%" + nome + "%")).list();
    }
}

8 Respostas

rodrigoallemand

Bem, vc sempre pode melhorar um código… alguns outros métodos podem ser inseridos ai para vc melhorar a sua base de acesso a dados.
Mas uma coisa me deixou curioso: porque vc faz um método salvar, um outro atualizar e mais um saveOrUpdate?!? E porque vc está usando nomes em português e em inglês ao mesmo tempo?!?

L

É bom lembrar que nem sempre aplicações comerciais se baseiam em CRUD. Pode haver uma regra de que determinada linha de uma tabela não pode ser excluída ou que em tal tabela não se pode pesquisar tudo. Nesses casos, o esforço de um DAO genérico pode ser em vão.

ricardosoares

aproveitando o tópico…

Todos DAOs que fiz foi copiado de um exemplo tirado da net. Dessa forma, mantive os nomes de métodos como “findById”, “listAll”, etc.

Uma curiosidade: qual o idioma mais usado nestes casos? O inglês ou o dos programadores envolvidos?

rodrigoallemand

Neste caso, segue-se a direção dada pelo cliente, seja ele um cliente externo ou vc mesmo… normalmente eu coloco tudo em inglês…
Já numa camada mais acima (de negocio, como um Service da vida) é rotina eu colocar os nomes em portugues e o mais ‘entendivel’ possivel. As vezes eu penso em mudar isso tb, colocando tudo no mesmo formato, mas…

Exceções devem ser tratadas como exceções… e até mesmo nesses casos, um método genérico tb irá te ajudar… portanto, se vc utiliza em mais de um componente do seu sistema um mesmo método, vc deve tornar tal método extensivel… usando-se genérics, melhor ainda!

Tem um tópico meu aqui no GUJ (não estou com tempo pra procurar) onde eu implemento um GenericDAO bem completo… fiquem a vontade pra procurar nas minhas mensagens! É bem antigo… quase 1 ano, acho eu!

Giulliano

Cara…seu DAO genérico esta bacana e tals…só que tem uns métodos tipados com <Usuario> e <Cliente>.

Vc concorda que se o DAO é genérico ele deve conter métodos genéricos.

ao invés de :

public List&lt;Usuario&gt; searchSimilarLogin(String login) {   
       return session.createCriteria(Usuario.class).add(   
               Restrictions.ilike("login", "%" + login + "%")).list();   
    }

use

public List&lt;T&gt; searchSimilarLogin(String login) {   
       return session.createCriteria(Usuario.class).add(   
               Restrictions.ilike("login", "%" + login + "%")).list();   
    }

Outra coisa eu acho que vc poderia usar o DAO gnérico para métodos comuns como insert, update , select * e tal.

Depois quando precisar de métodos mais especificos vc cria oura classe DAO extendendo a primeira classe com os métodos já definido e cria os outros mais especificos…

fui claro ???

victorcosta

Vê minha DAO Genérica
Acho q tah melhor mas n testei muito ela!

package struts.model.dao;


import java.io.Serializable;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import struts.model.util.HibernateUtil;

/**
 * Instantiating:
 *     GenericDAO<User, Long> userDAO = new GenericDAO<User, Long>(User.class);
 *     
 * Extending:
 *     public class UserDAO extends GenericDAO<User, Long> {
 *     
 *         public UserDAO() {
 *             super(User.class);
 *         }
 *         
 *         // Add new methods here
 *     }
 */
public class GenericDAO<T, ID extends Serializable> {
	
	private Class<T> persistentClass;
	private String className;

	@SuppressWarnings("unchecked")
	public GenericDAO(Class<T> persistentClass) {
		this.persistentClass = persistentClass;
		String[] tokens = persistentClass.toString().split("[.]");
		this.className = tokens[tokens.length -1];
	}
	
	public Class<T> getClassObject() { return persistentClass; }
	public String getClassName() { return className; }
	
	public Session getSession() {
		return HibernateUtil.getSessionFactory().getCurrentSession();
	}

	public void save(T entity) {
		getSession().save(entity);
	}
	
	public void update(T entity) {
		getSession().clear();
		getSession().update(entity);
	}
	
	public void delete(ID id) {
		getSession().delete(getSession().load(persistentClass, id));
	}
	
	@SuppressWarnings("unchecked")
	public T findById(ID id) {
		return (T) getSession().get(persistentClass, id);
	}
	
	/**
	 * Example of use: userDAO.find("WHERE login = ?", "vcac")
	 */
	@SuppressWarnings("unchecked")
	public T find(String clausule, Object... parameters) {
		Query query = getSession().createQuery("from " + className + " " + clausule);
		int count = 0;
		for (Object parameter : parameters)
			query.setParameter(count++, parameter);
		return (T) query.uniqueResult();
	}
	
	@SuppressWarnings("unchecked")
	public List<T> findAll() {
		return (List<T>) getSession().createCriteria(persistentClass).list();
	}
	
	@SuppressWarnings("unchecked")
	public List<T> findAll(int page, int resultsPerPage) {
		return (List<T>) getSession().createCriteria(persistentClass)
			.setFirstResult((page -1) * resultsPerPage).setMaxResults(resultsPerPage).list();
	}
	
	/**
	 * Example of use: userDAO.findAll("WHERE name LIKE ?", "Victor%")
	 */
	@SuppressWarnings("unchecked")
	public List<T> findAll(String clausule, Object... parameters) {
		Query query = getSession().createQuery("from " + className + " " + clausule);
		int count = 0;
		for (Object parameter : parameters)
			query.setParameter(count++, parameter);
		return (List<T>) query.list();
	}
	
	public Long count() {
		return (Long) getSession().createQuery("select count(*) from " + 
			className).uniqueResult();
	}
	
	public void flush() {
		getSession().flush();
	}
	
}
Giulliano

Sua DAO esta idêntica a DAO dele… :shock:

E, na minha opnião, um pouco pior pois esta recebendo uma classe como parametro sendo que a classe já é do tipo tipada (Generics).

M

http://blog.caelum.com.br/2006/08/26/ei-como-e-o-seu-dao-ele-e-tao-abstraido-quanto-o-meu/

Criado 12 de março de 2008
Ultima resposta 12 de mar. de 2008
Respostas 8
Participantes 7