quarta-feira, 9 de abril de 2008

Tagged under: ,

Desenvolvendo uma aplicação web de forma fácil e prática – 3ª parte

Continuando os posts anteriores (parte 1 e parte 2), iremos, nesta terceira parte, inicialmente, criar as classes de persistência, popularmente conhecidas como classes DAO (Data Access Objects).

Clique com o botão direito no nosso projeto, e escolha a opção Novo (New), Classe Java (Java Class). Na caixa de diálogo que se abre, nomeie a classe (Class Name) como UsuarioDao e escreva no campo Pacote (Package), o valor 'javabahia.dao'; clique no botão Finalizar (Finish).

O Netbeans abrirá o editor de código para a classe recém-criada. Digite o código mostrado a seguir:

***


public class UsuarioDao {

private EntityManager em;

public UsuarioDao() {
// criação do entity manager
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JavaBahiaAppPU");
em = emf.createEntityManager();
}

public void close() {
em.close();
}

public void inserir(Usuario usuario) {
em.getTransaction().begin(); // abre uma transação

try {
usuario = em.merge(usuario); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(usuario); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void atualizar(Usuario usuario) {
em.getTransaction().begin(); // abre uma transação

try {
usuario = em.merge(usuario); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(usuario); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void excluir(Usuario usuario) {
em.getTransaction().begin(); // abre uma transação

try {
// atualiza a referência do objeto antes de removê-lo
Usuario ref = em.find(Usuario.class, usuario.getLogin());
em.remove(ref); // remove o objeto

em.getTransaction().commit(); // encerra a transação

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public List obterTodos() {
Query qry = em.createQuery("select u from Usuario u");
return qry.getResultList();
}

public Usuario obterPorChave(String login) {
Query qry = em.createQuery("select u from Usuario u where u.login = :param1");
qry.setParameter("param1", login);
return (Usuario) qry.getSingleResult();
}

public Usuario obterPorLoginSenha(String login, String senha) {
Query qry = em.createQuery("select u from Usuario u where u.login = :param1 and u.senha = :param2");
qry.setParameter("param1", login);
qry.setParameter("param2", senha);
return (Usuario) qry.getSingleResult();
}
}


***

Vamos às explicações sobre alguns trechos de código.

private EntityManager em;
// (...)
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JavaBahiaAppPU");
em = emf.createEntityManager();

Essa é a forma como obtemos uma instância da classe EntityManager, responsável pelas operações de persistência dos objetos. As entidades persistentes são associadas a um contexto de persistência (a classe Persistence) e precisam de um provedor de persistência para mostrar como as “coisas” funcionam. As configurações utilizadas pelo provedor de persistência são descritas no arquivo persistence.xml, dentro da pasta META-INF, e nomeadas por uma unidade de persistência (persistence unit).

em.getTransaction().begin();
// (...)
em.getTransaction().commit();
// (...)
em.getTransaction().rollback();

Estas linhas de código servem para, respectivamente, abrir uma transação, finalizar uma transação, e desfazer uma transação.

usuario = em.merge(usuario);

O método merge() coloca o objeto no estado gerenciado pelo contexto de persistência e o insere, ou atualiza-o, no banco de dados. Ele sempre devolve o objeto atualizado pelo banco de dados.

Usuario ref = em.find(Usuario.class, usuario.getLogin());
em.remove(ref);

O método remove() retira o objeto da gerência do contexto de persistência, o que levará o Hibernate a excluí-lo do banco de dados. Antes de remover o objeto, precisamos atualizar a referência do objeto; senão, uma exceção será lançada pelo EntityManager.

Agora, crie também os arquivos EmpresaDao, ContratoDao, e ContratadaDao, lembrando de colocá-los no mesmo pacote 'javabahia.dao'.

***


public class EmpresaDao {

private EntityManager em;

public EmpresaDao() {
// criação do entity manager
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JavaBahiaAppPU");
em = emf.createEntityManager();
}

public void close() {
em.close();
}

public void inserir(Empresa empresa) {
em.getTransaction().begin(); // abre uma transação

try {
empresa = em.merge(empresa); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(empresa); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void atualizar(Empresa empresa) {
em.getTransaction().begin(); // abre uma transação

try {
empresa = em.merge(empresa); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(empresa); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void excluir(Empresa empresa) {
em.getTransaction().begin(); // abre uma transação

try {
// atualiza a referência do objeto antes de removê-lo
Empresa ref = em.find(Empresa.class, empresa.getCnpj());
em.remove(ref); // remove o objeto

em.getTransaction().commit(); // encerra a transação

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public List obterTodos() {
Query qry = em.createQuery("select e from Empresa e");
return qry.getResultList();
}

public Empresa obterPorChave(String cnpj) {
Query qry = em.createQuery("select e from Empresa e where e.cnpj = :param1");
qry.setParameter("param1", cnpj);
return (Empresa) qry.getSingleResult();
}
}


***


public class ContratoDao {

private EntityManager em;

public ContratoDao() {
// criação do entity manager
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JavaBahiaAppPU");
em = emf.createEntityManager();
}

public void close() {
em.close();
}

public void inserir(Contrato contrato) {
em.getTransaction().begin(); // abre uma transação

try {
contrato = em.merge(contrato); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(contrato); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void atualizar(Contrato contrato) {
em.getTransaction().begin(); // abre uma transação

try {
contrato = em.merge(contrato); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(contrato); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void excluir(Contrato contrato) {
em.getTransaction().begin(); // abre uma transação

try {
// atualiza a referência do objeto antes de removê-lo
Contrato ref = em.find(Contrato.class, contrato.getNumero());
em.remove(ref); // remove o objeto

em.getTransaction().commit(); // encerra a transação

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public List obterTodos() {
Query qry = em.createQuery("select c from Contrato c");
return qry.getResultList();
}

public Contrato obterPorChave(Integer numero) {
Query qry = em.createQuery("select c from Contrato c where c.numero = :param1");
qry.setParameter("param1", numero);
return (Contrato) qry.getSingleResult();
}
}


***


public class ContratadaDao {

private EntityManager em;

public ContratadaDao() {
// criação do entity manager
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JavaBahiaAppPU");
em = emf.createEntityManager();
}

public void close() {
em.close();
}

public void inserir(Contratada contratada) {
em.getTransaction().begin(); // abre uma transação

try {
contratada = em.merge(contratada); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(contratada); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void atualizar(Contratada contratada) {
em.getTransaction().begin(); // abre uma transação

try {
contratada = em.merge(contratada); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(contratada); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void excluir(Contratada contratada) {
em.getTransaction().begin(); // abre uma transação

try {
// atualiza a referência do objeto antes de removê-lo
Contratada ref = em.find(Contratada.class, contratada.getContratadaPK());
em.remove(ref); // remove o objeto

em.getTransaction().commit(); // encerra a transação

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public List obterTodos() {
Query qry = em.createQuery("select c from Contratada c");
return qry.getResultList();
}

public Contratada obterPorChave(ContratadaPK pk) {
Query qry = em.createQuery("select c from Contratada c where c.contratadaPK.cnpjempresa = :param1 and c.contratadaPK.numerocontrato = :param2");
qry.setParameter("param1", pk.getCnpjempresa());
qry.setParameter("param2", pk.getNumerocontrato());
return (Contratada) qry.getSingleResult();
}

public List obterPorNumeroContrato(Integer numeroContrato) {
Query qry = em.createQuery("select c from Contratada c where c.contratadaPK.numerocontrato = :param1");
qry.setParameter("param1", numeroContrato);
return qry.getResultList();
}

public List obterPorCnpjEmpresa(String cnpjEmpresa) {
Query qry = em.createQuery("select c from Contratada c where c.cnpjempresa = :param1");
qry.setParameter("param1", cnpjEmpresa);
return qry.getResultList();
}
}


***

Criadas as classes de persistência, vamos agora criar a classe que irá encapsular todo esse subsistema: o Façade. Clique com o botão direito no nosso projeto, e escolha a opção Novo (New), Classe Java (Java Class). Na caixa de diálogo que se abre, nomeie a classe (Class Name) como JavaBahiaFacade e escreva no campo Pacote (Package), o valor 'javabahia'; clique no botão Finalizar (Finish). O Netbeans abrirá o editor de código para a classe recém-criada. Digite o código como é mostrado a seguir:

***


public class JavaBahiaFacade {

   
public JavaBahiaFacade() {
   
}

   
public Usuario obterUsuarioPorLoginSenha(String login, String senha) {
       
UsuarioDao dao = new UsuarioDao();
       
Usuario obj = dao.obterPorLoginSenha(login, senha);
       
dao.close();
       
return obj;
   
}

   
public Usuario obterUsuarioPorLogin(String login) {
       
UsuarioDao dao = new UsuarioDao();
       
Usuario obj = dao.obterPorChave(login);
       
dao.close();
       
return obj;
   
}

   
public List obterTodosUsuarios() {
       
UsuarioDao dao = new UsuarioDao();
       
List lista = dao.obterTodos();
       
dao.close();
       
return lista;
   
}

   
public void inserirUsuario(Usuario usuario) {
       
UsuarioDao dao = new UsuarioDao();
       
dao.inserir(usuario);
       
dao.close();
   
}

   
public void atualizarUsuario(Usuario usuario) {
       
UsuarioDao dao = new UsuarioDao();
       
dao.atualizar(usuario);
       
dao.close();
   
}

   
public void excluirUsuario(Usuario usuario) {
       
UsuarioDao dao = new UsuarioDao();
       
dao.excluir(usuario);
       
dao.close();
   
}

   
public Empresa obterEmpresaPorCnpj(String cnpj) {
       
EmpresaDao dao = new EmpresaDao();
       
Empresa obj = dao.obterPorChave(cnpj);
       
dao.close();
       
return obj;
   
}

   
public List obterTodasEmpresas() {
       
EmpresaDao dao = new EmpresaDao();
       
List lista = dao.obterTodos();
       
dao.close();
       
return lista;
   
}

   
public void inserirEmpresa(Empresa empresa) {
       
EmpresaDao dao = new EmpresaDao();
       
dao.inserir(empresa);
       
dao.close();
   
}

   
public void atualizarEmpresa(Empresa empresa) {
       
EmpresaDao dao = new EmpresaDao();
       
dao.atualizar(empresa);
       
dao.close();
   
}

   
public void excluirEmpresa(Empresa empresa) {
       
EmpresaDao dao = new EmpresaDao();
       
dao.excluir(empresa);
       
dao.close();
   
}

   
public Contrato obterContratoPorNumero(Integer numero) {
       
ContratoDao dao = new ContratoDao();
       
Contrato obj = dao.obterPorChave(numero);
       
dao.close();
       
return obj;
   
}

   
public List obterTodosContratos() {
       
ContratoDao dao = new ContratoDao();
       
List lista = dao.obterTodos();
       
dao.close();
       
return lista;
   
}

   
public void inserirContrato(Contrato contrato) {
       
ContratoDao dao = new ContratoDao();
       
dao.inserir(contrato);
       
dao.close();
   
}

   
public void atualizarContrato(Contrato contrato) {
       
ContratoDao dao = new ContratoDao();
       
dao.atualizar(contrato);
       
dao.close();
   
}

   
public void excluirContrato(Contrato contrato) {
       
ContratoDao dao = new ContratoDao();
       
dao.excluir(contrato);
       
dao.close();
   
}

   
public Contratada obterContratadaPorContratoEmpresa(Integer numeroContrato, String cnpjEmpresa) {
       
ContratadaDao dao = new ContratadaDao();
       
ContratadaPK chave = new ContratadaPK();
       
chave.setNumerocontrato(numeroContrato);
       
chave.setCnpjempresa(cnpjEmpresa);
       
Contratada obj = dao.obterPorChave(chave);
       
dao.close();
       
return obj;
   
}

   
public List obterTodasContratadasPorContrato(Integer numeroContrato) {
       
ContratadaDao dao = new ContratadaDao();
       
List lista = dao.obterPorNumeroContrato(numeroContrato);
       
dao.close();
       
return lista;
   
}

   
public List obterTodasContratadasPorEmpresa(String cnpjEmpresa) {
       
ContratadaDao dao = new ContratadaDao();
       
List lista = dao.obterPorCnpjEmpresa(cnpjEmpresa);
       
dao.close();
       
return lista;
   
}

   
public void inserirContratada(Contratada contratada) {
       
ContratadaDao dao = new ContratadaDao();
       
dao.inserir(contratada);
       
dao.close();
   
}

   
public void atualizarContratada(Contratada contratada) {
       
ContratadaDao dao = new ContratadaDao();
       
dao.atualizar(contratada);
       
dao.close();
   
}

   
public void excluirContratada(Contratada contratada) {
       
ContratadaDao dao = new ContratadaDao();
       
dao.excluir(contratada);
       
dao.close();
   
}
}


***

Com isso, finalizamos o nosso componente Aplicação. Agora nos resta construir o componente Web, o qual será a nossa interface com o exemplo que estamos desenvolvendo. Isso ficará para o próximo post. Até lá!

PS: Os arquivos .java foram disponibilizados no serviço 4Shared mas foram apagados após um tempo de inatividade de minha conta. Por isso, colei o código das classes no meio do texto desse post e retirei os links originais.

4 comentários:

Inácio Ferrarini disse...

Muito Legal :)

sem querer pressionar, vocês tem previsão de quado será postada a terceira parte?

Grato,

Alexandre M. Lima disse...

Oi Inácio,
A quarta parte será postada ainda esta semana. Obrigado pela atenção!

Inácio Ferrarini disse...

Realmente, quarta parte :)

Obrigado pela dedicação.

Cesar disse...

Amigo você é uma pessoa que esta de parabéns, agradeçemos pela sua atenção e dedicação!

parabéns e succeso!

Fique com Deus !