Dao Generico

5 respostas
M

Bom dia pessoal

Estou fazendo um trabalho para a facu, e nao estou gostando muito do resultado…rs é uma pagina com alguns acesso a banco de dados.

A pagina deve ser feita usando apenas jsf e servelt que foi a materia dada ate agora… para deixar o negocio um pouco melhor estou tentando aplicar alguns padroes.

Usando o padrao DAO eu vou ter um DAO para cada tabela do meu banco… e esses DAO fazem praticamente a mesma coisa… alguém tem alguma ideia de como podeira criar um dao generico sem usar hibernate ?

Obrigado,

Marcelo Gomes

5 Respostas

M

Foi o que eu imaginei … mas como poderia fazer isso ??? … por exemplo no DAO tenho o metodo

salvar(Object objeto){

// Aqui vai ser tudo muito parecido, mas tenho que transformar o objeto cada hora para uma objeto diferente, hora sera pessoa outra curso e por ai vai

// e a linha do sql será difernte tb hora insert into pessoa com os seus campos prórprios, outra insert into curso com seus campos proprios.

}

Eu pesquiei mas achei usando o hibernate… (que nao conheço entao nao sei como ele funciona para mandar fazer ao contrario) e a melhor solucao seria aprender a usar o hibernate … mas no meu trabalho da facu eu nao posso usar ele.

Obrigado,

Marcelo Gomes

sergiotaborda

Eles fazem quase a mesma coisa. Esse quase implica que não são iguais. Para ter um DAO generico vc precisa de metadados. Ou seja, retire o que é difernete e mantenha o que é comum. Criar um dicionário não é dificil apenas trabalhoso

class EntityModel {
   Class<?> type; 
   String tableName;
   
   List<FieldModel> fields;

}

class FielcModel {
   Class<?> type; 
   String name;
   String column;
   boolean isMandatory;
   boolean isKey;
}

interface DAO<T, K> {

   public K save (T obj);
   public void delete (T obj);
   public List<T> executeCriteria(Criteria c);
} 


class JDBCDAO<T,K> implements DAO<T,K>{
     
       DataSource ds;
       EntityModel em;

       public K save (T obj){

             K key =  em.getKey(obj);
             if (key==null){
                // insert
          // monta frase sql usando os metadados e os valores em obj
             } else {
                 // update
                // monta frase sql usando os metadados e os valores em obj
              }
            

       }

}
class DAORegistry {

   static Map<String, EntityModel> models;
   static DataSource ds;

   public static <T> DAO<T> getDAO(Class<T> type){
           EntityModel em = model.get(type.getName());
           if (em==null){
                throw new IllegalStateException("DAO not found for " + type)
           }
          return new JDBCDAO(ds, em);
   }

}

uso

// no inicio do programa

EntityModel clienteModel  = new EntityModel (Cliente.class)
clienteModel.addField(String.class, "name", "nome", true, false);
clienteModel.addField(Integer.class, "id", "id", true, true);

DAORegistry.addModel(clienteModel);


// quando precisar do DAO

DAORegistry.getDao(Cliente.class).save(cliente);
renomoto

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

[]'s

M

obrigado Renomoto eu ja tinha visto esta pagina mas la ele usa hibernate… mas nao posso usar o hibernate… e como nao conheco hibernate tb nao entendi…rs

Sergio acho que era isso que estava querendo vou tentar entender (tem bastante coisa nova pra mim no seu exemplo =] )

Obrigado,

Marcelo Gomes

E

Voce pode implementar uma interface e implementar os metodos numa classe pai, e seria necessario apenas programar as peculiaridades de cada dao

Criado 17 de junho de 2008
Ultima resposta 17 de jun. de 2008
Respostas 5
Participantes 4