JSF Tutorial CRUD + Hibernate + Mysql

Embed Size (px)

Citation preview

JSF Tutorial RichFaces + Hibernate + MySQL CRUD completo (parte 1)Posted by serjaumfantin em julho 31, 2009 Esta a primeira parte da nossa aplicao JSF completa utilizando RichFaces + Hibernate + MySQL na prtica. Pretendo criar uma aplicao simples e ao mesmo tempo prtica ilustrando situaes do dia-a-dia. Utilizarei o Eclipse e o servlet continer Tomcat. A aplicao baseada em um cadastro de pessoas onde o usurio ter acesso a operaes de Create/Retrieve/Update/Delete. Utilizarei mscaras, conversores, validadores e componentes com suporte a AJAX(RichFaces), CSS entre outros.

Verses utilizadas

Eclipse 3.4.1 JDK 1.6 Tomcat 6.0.18 MyFaces 1.2.5 RichFaces 3.3.1 Hibernate Annotations 3.4.0 Hibernate 3.3.1 MySQL 5 JUnit 4.5 Caelum Stella 1.2 MySQL Query Browser 1.2

Estrutura inicial do projeto

Importando o projeto1. Baixe o projeto >>aqui General Existing Projects into Workspace > Next > Selecione o projeto descompactado no workspace > Finish.

Resultado

Continuarei o prximo post desenvolvendo a camada de persistncia da aplicao. At o prximo post!

JSF Tutorial RichFaces + Hibernate + MySQL CRUD completo (parte 2)Posted by serjaumfantin em agosto 1, 2009 Este o segundo post referente nossa aplicao JSF completa utilizando RichFaces + Hibernate + MySQL na prtica. Dando continuidade ao desenvolvimento da nossa aplicao, codificarei a camada DAO (Data Access Object) que responsvel por isolar a camada superior do acesso aos dados. Na maioria dos casos teremos uma classe DAO para cada classe do domnio do sistema. Na classe DAO esto os mtodos fundamentais para persistncia e na classe PessoaDAO temos os mtodos especficos de manipulao de dados referente classe Pessoa mais os mtodos da classe DAO que so obtidos por herana.

Estrutura do projeto

CdigosDAO.java:package br.com.serjaum.dao; import java.util.List; import org.apache.log4j.Logger; import org.hibernate.Session;

public class DAO { private static Logger logger = Logger.getLogger(DAO.class); private Class persistentClass; protected Session session; public DAO(Session session, Class persistentClass) { this.session = session; this.persistentClass = persistentClass; } @SuppressWarnings("unchecked") public T load(Long id) { logger.info("lendo " + persistentClass + " com id " + id); return (T) session.load(persistentClass, id); } public void save(T t) { logger.info("salvando session.save(t); " + t);

}

public void delete(T t) { logger.info("Deletando " + t); session.delete(t); } @SuppressWarnings("unchecked") public List list() { logger.info("Listando todos"); return session.createCriteria(persistentClass).list(); } public void merge(T t) { logger.info("Salvando ou atualizando " + t); session.merge(t); } }

PessoaDAO.javapackage br.com.serjaum.dao; import java.util.List; import import import import import import org.apache.log4j.Logger; org.hibernate.Criteria; org.hibernate.Session; org.hibernate.criterion.Order; org.hibernate.criterion.Projections; org.hibernate.criterion.Restrictions;

import br.com.serjaum.modelo.Pessoa; public class PessoaDAO extends DAO{ private Logger logger = Logger.getLogger(PessoaDAO.class); public PessoaDAO(Session session, Class classe) {

super(session, classe); } public Pessoa pesquisaPessoaById(Long idPessoa) { logger.info("pesquisaPessoaById : " + idPessoa); return (Pessoa) session.load(Pessoa.class, idPessoa); } public String pesquisaPessoaByNome(String nome) { logger.info("pesquisaPessoaByNome : " + nome); Criteria c = session.createCriteria(Pessoa.class); c.add(Restrictions.ilike("nome", nome + "%")); c.addOrder(Order.asc("nome")); return (String)c.uniqueResult(); } public Pessoa pesquisaPessoaByEmail(String email) { logger.info("pesquisaPessoaByEmail : " + email); Criteria c = session.createCriteria(Pessoa.class); c.add(Restrictions.ilike("email", email + "%")); return (Pessoa)c.uniqueResult(); } public List findByNameSuggest(String busca){ logger.info("findByNameSuggest : " + busca); Criteria c = session.createCriteria(Pessoa.class); c.add(Restrictions.ilike("nome", busca + "%")); c.addOrder(Order.asc("nome")); c.setProjection(Projections.property("nome")); return c.list(); } }

package br.com.serjaum.dao;import java.util.List;import org.apache.log4j.Logger; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import br.com.serjaum.entidades.Pessoa; public class PessoaDAO { private Session session; private Logger logger = Logger.getLogger(PessoaDAO.class); public PessoaDAO(Session session) { logger.info(Construtor + session);

this.session = session; } public void insertPessoa(Pessoa pessoa) { session.saveOrUpdate(pessoa); } public void updatePessoa(Pessoa pessoa) { session.merge(pessoa); } public void deletePessoa(Pessoa pessoa) { session.delete(pessoa); } public Pessoa retrievePessoa(Pessoa pessoa) { return (Pessoa) session.load(Pessoa.class, pessoa.getId()); } public Pessoa retrievePessoaById(Long idPessoa) { return (Pessoa) session.load(Pessoa.class, idPessoa); } @SuppressWarnings(unchecked) public List loadAll(){ Criteria c = session.createCriteria(Pessoa.class); c.addOrder(Order.asc(nome)); return c.list(); } public String retrievePessoaByNome(String nome) { Criteria c = session.createCriteria(Pessoa.class);

c.add(Restrictions.ilike(nome, nome + %)); c.addOrder(Order.asc(nome)); return (String)c.uniqueResult(); } public Pessoa retrievePessoaByEmail(String email) { Criteria c = session.createCriteria(Pessoa.class); c.add(Restrictions.ilike(email, email + %)); return (Pessoa)c.uniqueResult(); } } HibernateUtil.javapackage br.com.serjaum.dao; import import import import org.apache.log4j.Logger; org.hibernate.Session; org.hibernate.SessionFactory; org.hibernate.cfg.AnnotationConfiguration;

public class HibernateUtil { private static final Logger logger = Logger.getLogger(HibernateUtil.class); private static final SessionFactory sessionFactory; private static ThreadLocal sessions = new ThreadLocal(); static { sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); } public static Session openSession() { if (sessions.get() != null) { logger.error("There was a session for this thread already!! "); // grave, alguem nao fechou uma sessao ja aberta! } sessions.set(sessionFactory.openSession()); return sessions.get(); } public static void closeCurrentSession() {

}

sessions.get().close(); sessions.set(null);

public static Session currentSession() { return sessions.get(); } }

hibernate.cfg.xml: com.mysql.jdbc.Driver jdbc:mysql://localhost/jsf root root org.hibernate.dialect.MySQLInnoDBDialect false false none 1 100 10 0 5 100

xxx PessoaTest.java:package br.com.serjaum.pessoa.test; import static org.junit.Assert.*; import java.util.Date; import import import import import import import org.hibernate.Session; org.hibernate.SessionFactory; org.hibernate.Transaction; org.hibernate.cfg.AnnotationConfiguration; org.junit.After; org.junit.Before; org.junit.Test;

import br.com.serjaum.dao.DAO; import br.com.serjaum.modelo.Pessoa; public class PessoaTest{ private static Pessoa PESSOA_TESTE = new Pessoa(); SessionFactory sf; Session session; Transaction tx; DAO dao; @Before public void runBeforeEveryTest(){ sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); dao = new DAO(session, Pessoa.class); } @After public void runAfterEveryTest(){ tx.commit(); session.close(); } @Test public void testCadastra(){ PESSOA_TESTE.setNome("Srgio Fantin"); PESSOA_TESTE.setCpf("123.456.789-10"); PESSOA_TESTE.setEmail("[email protected]"); PESSOA_TESTE.setTelefoneCelular("(44) 8888-8888"); } dao.save(PESSOA_TESTE);

@Test public void testProcura() { Pessoa buscada; buscada = dao.load(PESSOA_TESTE.getId()); assertEquals(PESSOA_TESTE.getId(), buscada.getId()); assertEquals(PESSOA_TESTE.getNome(), buscada.getNome()); assertEquals(PESSOA_TESTE.getEmail(), buscada.getEmail()); assertEquals(PESSOA_TESTE.getCpf(), buscada.getCpf()); assertEquals(PESSOA_TESTE.getTelefoneCelular(), buscada.getTelefoneCelular()); assertEquals(PESSOA_TESTE.getDataNascimento(), buscada.getDataNascimento()); } @Test public void testAtualiza(){ Pessoa buscadoParaAtualizacao; Pessoa buscadoAposAtualizacao; buscadoParaAtualizacao = dao.load(PESSOA_TESTE.getId()); buscadoParaAtualizacao.setNome("Nome modificado");

buscadoParaAtualizacao.setEmail("[email protected]"); buscadoParaAtualizacao.setCpf("000.000.000-00"); buscadoParaAtualizacao.setTelefoneCelular("(00) 00000000"); buscadoParaAtualizacao.setDataNascimento(new Date()); dao.merge(buscadoParaAtualizacao); buscadoAposAtualizacao = dao.load(PESSOA_TESTE.getId()); assertEquals(buscadoParaAtualizacao.getId(), buscadoAposAtualizacao.getId()); assertEquals(buscadoParaAtualizacao.getNome(), buscadoAposAtualizacao.getNome()); assertEquals(buscadoParaAtualizacao.getEmail(), buscadoAposAtualizacao.getEmail()); assertEquals(buscadoParaAtualizacao.getCpf(), buscadoAposAtualizacao.getCpf()); assertEquals(buscadoParaAtualizacao.getTelefoneCelular(), buscadoAposAtualizacao.getTelefoneCelular()); assertEquals(buscadoParaAtualizacao.getDataNascimento(), buscadoAposAtualizacao.getDataNascimento()); } @Test public void testRemove(){ Pessoa pessoa = PESSOA_TESTE; pessoa.setId(1l); dao.delete(pessoa); } }

Importando o projeto1. Baixe o projeto atualizado >>aqui General Existing Projects into Workspace > Next > Selecione o projeto descompactado no workspace > Finish.

Executando o projeto1. Com o MySQL instalado e configurado com usurio: root e senha: root crie um

novo schema com o nome de jsf. 2. Execute a classe br.com.serjaum.util.GerarTabelas.java. Essa classe criar as tabelas que foram mapeadas no arquivo hibernate.cfg.xml, no caso a classe Pessoa ter uma tabela correspondente com o nome de pessoa no nosso banco de dados; 3. Para testar a camada DAO execute a classe br.com.serjaum.pessoa.test.PessoaTest.java. Obs: o test ir executar as 4 operaes CRUD. O ltimo teste com a assinatura public void testRemove() remover os registros gravados/atualizados pelos testes anteriores. Caso no queira remover o registro testado comente o cdigo do mtodo testRemove() antes de executar o teste.

Resultado

Continuarei o prximo post desenvolvendo a camada de viso da aplicao. At o prximo post!

JSF Tutorial RichFaces + Hibernate + MySQL CRUD completo (parte 3)Posted by serjaumfantin em agosto 18, 2009 Este o terceiro post referente nossa aplicao JSF completa utilizando RichFaces + Hibernate + MySQL na prtica. Dando continuidade ao desenvolvimento da nossa aplicao, codificarei a camada de Faade que responsvel por abstrair a camada de negcios, que contribuir para a reduo do acoplamento entre as camadas da aplicao. Essa camada tem a funo de receber solicitaes de operaes e repass-las para os mtodos de negcio/persistncia que esto em outras camadas, mantendo a arquitetura coerente e aumentando a manutenabilidade da aplicao. Obs: por se tratar de um tutorial prtico, preferi simplificar a aplicao adicionando a camada de Faade de uma maneira simples, por isso fiz o gerenciamento de sesses/transaes dentro da classe PessoaFacadeImpl.java. O ideal seria retirar esse cdigo de abertura/fechamento de sesses/transaes e coloc-lo em um filtro, por exemplo: Open Session In View. Isso aplicado quando utilizamos um Servlet Continer como o Tomcat ou Jetty, mas se o deploy for feito em um Servidor de Aplicao (JBoss, GlassFish, etc) o gerenciamento fica por conta do mesmo, da s alegria (ou no?!).

Estrutura do projeto

CdigosBaseFacade.java:package br.com.serjaum.facade; import java.io.Serializable; import java.util.List; public interface BaseFacade extends Serializable { public abstract void salva(T t); public abstract void remove(T t); public abstract T procura(Long id); public abstract void atualiza(T t); } public abstract List lista();

PessoaFacade.java:package br.com.serjaum.facade; import java.util.List; import br.com.serjaum.modelo.Pessoa; public interface PessoaFacade extends BaseFacade{ public void salva(Pessoa p); public void remove(Pessoa p); public Pessoa procura(Long id);

public void atualiza(Pessoa p); public List pesquisaPessoasByNome(String nome); }

PessoaFacadeImpl.java:package br.com.serjaum.facade; import import import import import import import java.util.List; org.hibernate.Session; org.hibernate.SessionFactory; org.hibernate.Transaction; org.hibernate.cfg.AnnotationConfiguration; br.com.serjaum.dao.PessoaDAO; br.com.serjaum.modelo.Pessoa;

public class PessoaFacadeImpl implements PessoaFacade { private private private private private static final long serialVersionUID = 1818242808424001885L; PessoaDAO pessoaDAO; SessionFactory sf; Session session; Transaction tx;

public void salva(Pessoa p) { sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class); this.pessoaDAO.save(p); tx.commit(); session.close(); } public void atualiza(Pessoa p) { sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class); this.pessoaDAO.merge(p); tx.commit(); session.close();

}

public Pessoa procura(Long id) { sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class); Pessoa p = this.pessoaDAO.load(id);

tx.commit(); session.close(); return p; } public void remove(Pessoa p) { sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class); this.pessoaDAO.delete(p); tx.commit(); session.close();

}

public List lista() { sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class); List lista = this.pessoaDAO.list(); tx.commit(); session.close(); return lista; } public List pesquisaPessoasByNome(String nome) { sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class); List lista = this.pessoaDAO.pesquisaPessoas(nome); tx.commit(); session.close(); } return lista;

public Pessoa procuraById(Long id){ sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class); Pessoa p = this.pessoaDAO.pesquisaPessoaById(id); tx.commit(); session.close();

}

return p;

public Pessoa procuraByNome(String nome){ sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class); Pessoa p = this.pessoaDAO.pesquisaPessoaByNome(nome); tx.commit(); session.close(); return p; } public Pessoa procuraByEmail(String email){ sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class); Pessoa p = this.pessoaDAO.pesquisaPessoaByEmail(email); tx.commit(); session.close(); } } return p;

Importando o projeto1. Baixe o projeto atualizado >>aqui General Existing Projects into Workspace > Next > Selecione o projeto descompactado no workspace > Finish.

Criando o banco de dados1. Com o MySQL instalado e configurado com usurio: root e senha: root crie um

novo schema com o nome de jsf.2. Execute a classe br.com.serjaum.util.GerarTabelas.java. Essa classe criar as

tabelas que foram mapeadas no arquivo hibernate.cfg.xml, no caso a classe Pessoa ter uma tabela correspondente com o nome de pessoa no nosso banco de dados; No prximo post eu irei codificar o nosso Managed Bean e os arquivos da camada de viso. At o prximo post!

JSF Tutorial RichFaces + Hibernate + MySQL CRUD completo (parte 4)Posted by serjaumfantin em agosto 19, 2009 Este o quarto post referente nossa aplicao JSF completa utilizando RichFaces + Hibernate + MySQL na prtica. Dando continuidade ao desenvolvimento da nossa aplicao, codificarei o Managed Bean, que a classe que receber as solicitaes da camada de viso (JSP), e as encaminhar para a camada de Faade. Nesta etapa o sistema j entrar em funcionamento com suas operaes CRUD bsicas.

Estrutura do projeto

CdigosPessoaMB.java:package br.com.serjaum.mb; import java.io.Serializable; import java.util.List;

import br.com.serjaum.facade.PessoaFacade; import br.com.serjaum.facade.PessoaFacadeImpl; import br.com.serjaum.modelo.Pessoa; public class PessoaMB implements Serializable { private static final long serialVersionUID = -333995781063775201L; private Pessoa pessoa = new Pessoa(); private Long id; public PessoaMB(){ System.out.println(" >>>>>>>>>>>>>>>>>>>> Contrutor do PESSOA_MB >>>>>>>>>>>>>>>>>>> Contrutor do PESSOA_MB