Duvidas com classe DAO

Pessoal tenho a seguinte duvida. Estou estudando java e com muitas dificuldades , e estou com a seguinte duvida no uso do DAO.Ou seja na organização dos pacotes. quero organizar as minhas classes com os seguintes requisitos. quero conectar ao banco, desconectar apos gravar os dados, alterar, listar deletar etcc… e quero tambem implementar os sequintes metodos Gravar,Excluir,Listar. Mais não tenho uma coção como organizar isso tudo, pq oque eu venho pesquisando cada um faz de um geito diferente uns fala que estão errado uns dos outros etc… Afinal. Como seria um projeto organizado com os seguintes requisitos que estou querendo? Alguem pedo fazer e organizar pra eu ter certeza do que é certo(Organizado)?

dá uma olhada nesses links:

http://www.corej2eepatterns.com/Patterns2ndEd/DataAccessObject.htm

Segue uma explicação de um colaborador (sergiotaborda).
Se precisar de uns exemplos te mando.

Vai ser bem vindo Master.

Cara normalmente você tem uma DAO para cada entidade de sua classe e nela você implementa os metodos CRUD. Boa sorte nos estudos!

Isto é correto, e no decorrer do desenvolvimento você começa a perceber que nesta abordagem começa a aparecer muito código repetitivo, pois você precisa do CRUD para TODAS as suas entidades e normalmente o que muda é apenas o nome da entidade (ou a tabela)…
Neste caso utilize um DAO genérico, você cria um código único para as operações que servem para qualquer entidade. Ex:

public class GenericDAO<T> {

onde você tem um tipo genérico que serve para qualquer entidade. Tem vários tópicos aqui no GUJ sobre isso e bastante material na internet.
Este post do blog da Caelum dá uma boa sugestão para implementar o padrão Repository com uma implementação de DAO genérico

Ok… estou ultilizando um DAO generico mais minha duvida é a seguinte…eu devo ter uma classe para conectar e outra classe para desconectar ou posso ter uma classe com os dois metodos? e no listar,gravar e excluir eu posso ter uma classe pra todos os metodos ou devo ter uma classe só para cada metodo?

Pessoal eu fiz uma classe que conecta e desconecta etc… está correta?

import br.com.LaiSistemas.Conexao.ConexaoComBancoDados;
import br.com.LaiSistemas.Interfaces.InterfaceDAOGenerico;
import java.util.List;
import javax.swing.JOptionPane;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

/**
 *
 * @author Leandro Mariano
 */
public class MetodosDAOGenerico<Obj_Recebido> implements InterfaceDAOGenerico
{
    private static SessionFactory conexaoComBanco;
    private static Session        sessao;
    private static Transaction    transacao;
    private List                  lista;
    private Obj_Recebido          nomeDoObjeto;

    
    public MetodosDAOGenerico(Obj_Recebido nomeDoObjeto)//Método construtor
    {
        this.nomeDoObjeto = nomeDoObjeto;
    }
    public void conectaBanco()
    {
        try
        {
            conexaoComBanco = null;
            sessao = null;
            transacao = null;
            conexaoComBanco = new Configuration().configure().buildSessionFactory();
            sessao = conexaoComBanco.openSession();
            transacao = sessao.beginTransaction();
        }
        catch(Exception erro)
        {
            JOptionPane.showMessageDialog(null,"Não foi possível conectar com o banco de dados.\nMenssagem de Erro.: "+erro,"Informação do Sistema",JOptionPane.ERROR_MESSAGE);
            conexaoComBanco = null;
        }
    }
    public void desconectaBanco()
    {
        try
        {
            sessao.close();
            //JOptionPane.showMessageDialog(null,"Banco Fechado");
        }
        catch(Exception erro)
        {
            JOptionPane.showMessageDialog(null,"Não foi possível desconectar com o banco de dados.\nMenssagem de Erro.: "+erro,"Informação do Sistema",JOptionPane.ERROR_MESSAGE);
            conexaoComBanco = null;
        }
    }
    public void gravar_Salvar_Dados()
    {
        try
        {
            conectaBanco();
            sessao.saveOrUpdate(nomeDoObjeto);
            transacao.commit();
        }
        catch(Exception erro)
        {
            JOptionPane.showMessageDialog(null,"Não foi possível gravar os dados desejado.\nMenssagem de Erro.: "+erro,"Informação do Sistema",JOptionPane.ERROR_MESSAGE);
            transacao.rollback();
        }
    }

    public void excluir_Dados()
    {
        try
        {
            conectaBanco();
            sessao.delete(nomeDoObjeto);
            transacao.commit();
        }
        catch(Exception erro)
        {
            JOptionPane.showMessageDialog(null,"Não foi possível excluir os dados desejado.\nMenssagem de Erro.: "+erro,"Informação do Sistema",JOptionPane.ERROR_MESSAGE);
            transacao.rollback();

        }
    }

    public List listar_Dados(String classe)
    {
        try
        {
            conectaBanco();
            Query listaQueri = sessao.createQuery(classe);
            //listaQueri.setMaxResults(3);
            //listaQueri.setFirstResult(3);
            lista = listaQueri.list();
        }
        catch(Exception erro)
        {
            JOptionPane.showMessageDialog(null,"Não foi possível listar os dados na tabela.\nMenssagem de Erro.: "+erro,"Informação do Sistema",JOptionPane.ERROR_MESSAGE);
            transacao.rollback();
        }
        return lista;
    }

    public List listar_Dados_Filtrados(String nome)
    {
        try
        {
            conectaBanco();
            Query listaQueri = sessao.createQuery(nome);
            lista = listaQueri.list();
        }
        catch(Exception erro)
        {
            JOptionPane.showMessageDialog(null,"Não foi possível filtrar os dados na tabela.\nMenssagem de Erro.: "+erro,"Informação do Sistema",JOptionPane.ERROR_MESSAGE);
            transacao.rollback();
        }
        return lista;
    }
}

Pessoal tenho uma grande duvida. é normal a conexao com o banco de dados caí ao ficar ordenando por ordem de codigo,nome,etc…?
pq a minha cai direto ai toda hora tenho que ficar conectando novamente, por isso que uso o metodo conectaBanco() para evitar esse problema. E minha configuração do hibernate ta assim.

<hibernate-configuration>
  <session-factory>
    <property name="hibernate.connection.driver_class">
        oracle.jdbc.driver.OracleDriver
      </property>
    <property name="hibernate.connection.url">
          jdbc:oracle:thin:@localhost:1521:XE
      </property>
    <property name="hibernate.connection.username">
          nomeUsuario
      </property>
    <property name="hibernate.connection.password">
          senhaUsuario
      </property>
    <property name="hibernate.dialect">
          org.hibernate.dialect.Oracle10gDialect
      </property>
    <property name="hibernate.show_sql">
          true
      </property>
    <property name="hibernate.format_sql">
          true
      </property>
    <property name="hibernate.pool_size">
          1
      </property>
    <mapping resource="br/com/LaiSistemas/Mapeamentos/Map_Paises.hbm.xml"/>
    <mapping resource="br/com/LaiSistemas/Mapeamentos/Map_Cidades.hbm.xml"/>
    <mapping resource="br/com/LaiSistemas/Mapeamentos/Map_Bairros.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

está correta?

Alguem?