Hoje criaremos um projeto completo com as tecnologias java: JSF (Primefaces) + Hibernate + MySQL ou PostgreSQL.
\nE como de costume iniciaremos com uma breve descri\u00e7\u00e3o de cada uma delas.
\n Vamos utilizar o nosso sistema acad\u00eamico chamado de AcademicNet para aplicar os conceitos.<\/p>\n
O exemplo funciona tanto com MySQL quanto com PostgreSQL<\/p>\n
<\/p>\n
<\/p>\n
Nossa aplica\u00e7\u00e3o funcionar\u00e1 da seguinte maneira.<\/p>\n
A p\u00e1gina inicial \u00e9 a index.jsp<\/b> Ela faz a apresenta\u00e7\u00e3o do projeto e quando clicamos na imagem ser\u00e1 exibido o menu.jsp<\/b> nesse menu podemos escolher v\u00e1rias op\u00e7\u00f5es de CRUD. A primeira \u00e9 a mais importante para n\u00f3s. “Manter Aluno JSF”.<\/p>\n
Veja o c\u00f3digo abaixo:<\/p>\n
\r\n\r\n\r\n\r\nMenu de op\u00e7\u00f5es<\/title>\r\n<\/head>\r\n \r\n\t\r\n\t\tSeja bem vindo ao sistema AcademicNet!<\/H1>\r\n\t\tManter Aluno JSF<\/a>
\r\n\t\tManter Aluno<\/a>
\r\n\t\tListar Alunos<\/a>
\r\n\t\tManter Professor<\/a>
\r\n\t\tListas Professor<\/a>
\r\n\t\tManter Usuario<\/a>
\r\n\t\tListar Usuario<\/a>
\r\n\t\tManter Turma<\/a>
\r\n\t\tListar Turma<\/a>
\r\n\t<\/div>\r\n<\/body>\r\n<\/html>\r\n<\/pre>\n Essa op\u00e7\u00e3o de menu nos levar\u00e1 at\u00e9 a p\u00e1gina de cadastro utilizando JSF.<\/p>\n
As primeiras linhas determinam que vamos utilizar JFS, com as URIs dentro da tag . A URI xmlns:p=”http:\/\/primefaces.org\/ui” informa que utilizaremos o framework Primefaces.<\/p>\n
Observe que para cada campo texto temos um atributo value apontando para uma propriedade da entidade aluno. Veja o exemplo de matr\u00edcula:
\n . Isso significa que tudo que eu digitado no campo matr\u00edcula ser\u00e1 atribu\u00eddo a um objeto aluno.matr\u00edcula. Isso ocorre atrav\u00e9s de uma classe Managed Bean. Ela faz, de forma mais simples, o que as classes Servlets<\/i> fazem.<\/p>\n\r\n\r\n\r\n<\/h:head>\r\n\r\n\t \r\n\r\n\t\r\n\t\t\r\n\t\t\t \r\n\t\t\t \r\n\r\n\t\t\t \r\n\t\t\t \r\n\t\t\t \r\n\t\t\t \r\n\t\t\t \r\n\t\t\t \r\n\t\t\t \r\n\t\t\t\r\n\t\t\t\t \r\n\t\t\t<\/p:calendar>\r\n\t\t<\/p:panelGrid>\r\n\t\t\r\n\t\t\t \r\n\t\t\t \r\n\t\t\t \r\n\t\t\t \r\n\t\t\t \r\n\t\t\t \r\n\r\n\t\t<\/p:panelGrid>\r\n\t<\/h:form>\r\n\t\r\n\t\tLista de Alunos<\/f:facet>\r\n\t\t\r\n\t\t\t \r\n\t\t<\/p:column>\r\n\t\t\t \r\n\t\t<\/p:column>\r\n\t\t\r\n\t\t\t <\/p:column>\r\n\t\t\r\n\t\t\t \r\n\t\t<\/p:column>\r\n\t<\/p:dataTable>\r\n<\/h:body>\r\n<\/html>\r\n<\/pre>\n No arquivo web.xml fazemos algumas configura\u00e7\u00f5es para que o nosso projeto esteja preparado para executar JSF. Essas configura\u00e7\u00f5es s\u00e3o opcionais para utiliza\u00e7\u00e3o do Framework Primefaces<\/a>.<\/p>\n\r\n\r\n\r\n\r\n\tAcademicNetWebEJB<\/display-name>\r\n\t\r\n\t\tindex.jsp<\/welcome-file>\r\n\t<\/welcome-file-list>\r\n\t\r\n\t\tjavax.faces.PROJECT_STAGE<\/param-name>\r\n\t\tDevelopment<\/param-value>\r\n\t<\/context-param>\r\n\t\r\n\t\tFaces Servlet<\/servlet-name>\r\n\t\tjavax.faces.webapp.FacesServlet<\/servlet-class>\r\n\t\t1<\/load-on-startup>\r\n\t<\/servlet>\r\n\t\r\n\t\tFaces Servlet<\/servlet-name>\r\n\t\t*.jsf<\/url-pattern>\r\n\t\t*.faces<\/url-pattern>\r\n\t\t*.xhtml<\/url-pattern>\r\n\t<\/servlet-mapping>\t\r\n<\/web-app>\r\n\r\n<\/pre>\n Veja o c\u00f3digo do nosso “alunoMB”. A novidade aqui \u00e9 a anota\u00e7\u00e3o @ManagedBean. Isso determina que nossa classe \u00e9 um tipo especial e que pode ser associada a uma
\ntela. Neste caso este Managed Bean est\u00e1 associado \u00e0 tela de aluno. Ela tem os m\u00e9todos necess\u00e1rios para incluir, alterar, consultar, excluir e listar alunos.<\/p>\n
\r\n\r\npackage br.com.feltex.academicnet.mb;\r\n\r\nimport java.io.Serializable;\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport javax.faces.application.FacesMessage;\r\nimport javax.faces.bean.ManagedBean;\r\nimport javax.faces.context.FacesContext;\r\n\r\nimport br.com.feltex.academicnet.dao.AlunoDAO;\r\nimport br.com.feltex.academicnet.dao.DAOFactory;\r\nimport br.com.feltex.academicnet.entidade.Aluno;\r\n\r\n@ManagedBean(name = \"alunoMB\")\r\npublic class AlunoMB implements Serializable {\r\n\r\n\tprivate static final long serialVersionUID = 8103328274400432976L;\r\n\tprivate Aluno aluno;\r\n\tprivate List lista = new ArrayList<>();\r\n\r\n\tAlunoDAO dao = DAOFactory.getAlunoDAO();\r\n\r\n\tpublic AlunoMB() {\r\n\t\taluno = new Aluno();\r\n\t\tlistar();\r\n\t}\r\n\r\n\tpublic void alterar() {\r\n\t\tSystem.out.println(\"Alterar aluno\");\r\n\t\tdao.alterar(aluno);\r\n\t\tlistar();\r\n\t\tFacesContext.getCurrentInstance().addMessage(\r\n\t\t\t\tnull,\r\n\t\t\t\tnew FacesMessage(FacesMessage.SEVERITY_INFO,\r\n\t\t\t\t\t\t\"Manuten\u00e7\u00e3o de usu\u00e1rio: \",\r\n\t\t\t\t\t\t\"Usuario alterado com sucesso!\"));\r\n\t}\r\n\r\n\tpublic void consultar() {\r\n\t\tlong matriculaConsulta = aluno.getMatricula();\r\n\t\t\t\tSystem.out.println(\"Consultar\");\r\n\t\taluno = dao.consultar(aluno);\r\n\t\tif (aluno == null || aluno.getMatricula() == 0) {\r\n\t\t\tFacesContext.getCurrentInstance().addMessage(\r\n\t\t\t\t\tnull,\r\n\t\t\t\t\tnew FacesMessage(FacesMessage.SEVERITY_ERROR,\r\n\t\t\t\t\t\t\t\"Manuten\u00e7\u00e3o de usu\u00e1rio: \",\r\n\t\t\t\t\t\t\t\"Usuario n\u00e3o encontrado matr\u00edcula:\" + matriculaConsulta + \"!\"));\r\n\t\t}\r\n\t\tlistar();\r\n\r\n\t}\r\n\r\n\tpublic void excluir() {\r\n\t\tSystem.out.println(\"Excluir aluno\");\r\n\t\tdao.excluir(aluno);\r\n\t\tlistar();\r\n\t\tFacesContext.getCurrentInstance().addMessage(\r\n\t\t\t\tnull,\r\n\t\t\t\tnew FacesMessage(FacesMessage.SEVERITY_INFO,\r\n\t\t\t\t\t\t\"Manuten\u00e7\u00e3o de usu\u00e1rio: \",\r\n\t\t\t\t\t\t\"Usuario exclu\u00eddo com sucesso!\"));\r\n\t}\r\n\r\n\tpublic Aluno getAluno() {\r\n\t\treturn aluno;\r\n\t}\r\n\r\n\tpublic List getLista() {\r\n\t\treturn lista;\r\n\t}\r\n\r\n\tpublic void incluir() {\r\n\t\tSystem.out.println(\"Incluir aluno\");\r\n\t\tdao.inserir(aluno);\r\n\t\tlistar();\r\n\t\tFacesContext.getCurrentInstance().addMessage(\r\n\t\t\t\tnull,\r\n\t\t\t\tnew FacesMessage(FacesMessage.SEVERITY_INFO,\r\n\t\t\t\t\t\t\"Manuten\u00e7\u00e3o de usu\u00e1rio: \",\r\n\t\t\t\t\t\t\"Usuario incluido com sucesso!\"));\r\n\t}\r\n\r\n\tpublic void limpar() {\r\n\t\tSystem.out.println(\"Limpar\");\r\n\t\tSystem.out.println(aluno);\r\n\t\taluno = new Aluno();\r\n\t}\r\n\r\n\tpublic void listar() {\r\n\t\tSystem.out.println(\"Listar aluno\");\r\n\t\tlista = dao.listar();\r\n\t}\r\n\r\n\tpublic void setAluno(Aluno aluno) {\r\n\t\tthis.aluno = aluno;\r\n\t}\r\n\r\n\tpublic void setLista(List lista) {\r\n\t\tthis.lista = lista;\r\n\t}\r\n}\r\n<\/pre>\n Depois compare esse managedBean com o servlet “AlunoServlet”. <\/p>\n
O nosso ManagedBean utilizar um padr\u00e3o de projeto DAOFactory, ou seja, existe uma classe que gera uma inst\u00e2ncia de um objeto que acessa o Banco de dados.
\n AlunoDAO dao = DAOFactory.getAlunoDAO();<\/p>\n
C\u00f3digo abaixo:<\/p>\n
\r\npackage br.com.feltex.academicnet.dao;\r\n\r\nimport br.com.feltex.academicnet.dao.hibernate.AlunoHibernateDAO;\r\nimport br.com.feltex.academicnet.dao.jdbc.ProfessorDAO;\r\nimport br.com.feltex.academicnet.dao.jdbc.ProfessorJDBCDAO;\r\nimport br.com.feltex.academicnet.dao.jdbc.TurmaDAO;\r\nimport br.com.feltex.academicnet.dao.jdbc.TurmaJDBCDAO;\r\nimport br.com.feltex.academicnet.dao.jdbc.UsuarioJDCBDAO;\r\n\r\npublic class DAOFactory {\r\n\r\n\tpublic static AlunoDAO getAlunoDAO() {\r\n\t\treturn new AlunoHibernateDAO();\r\n\t}\r\n\r\n\tpublic static ProfessorDAO getProfessorDAO() {\r\n\t\treturn new ProfessorJDBCDAO();\r\n\t}\r\n\r\n\tpublic static TurmaDAO getTurmaDAO() {\r\n\t\treturn new TurmaJDBCDAO();\r\n\t}\r\n\r\n\tpublic static UsuarioDAO getUsuarioDAO() {\r\n\t\treturn new UsuarioJDCBDAO();\r\n\t}\r\n}\r\n<\/pre>\n Por exemplo o m\u00e9todo “getAlunoDAO” nos retorna um objeto que acessa o banco de dados via Hibernate e o m\u00e9todo getProfessorDAO retorna um acesso ao mesmo Banco de Dados via JDBC. Voc\u00ea pode pensar, mas quando isso seria \u00fatil de verdade?<\/p>\n
Imagine um sistema que temos Sistema de PDV (Ponto de Vendas). Meu sistema deve estar preparado para acessar qualquer banco de dados. Para isso o meu DAOFactory pode nos atender gerando objetos diferentes de acordo com par\u00e2metros que eu informar.<\/p>\n
Minha classe “AlunoHibernateDAO” implementa a interface “AlunoDAO” que define a assinatura de todos os m\u00e9todos necess\u00e1rios para acesso a banco de dados para a tabela aluno. Neste exemplo todo o controle de transa\u00e7\u00e3o \u00e9 gerenciado por nossa aplica\u00e7\u00e3o. \u00c9 o chamado Bean Transation Management.<\/p>\n
\r\npackage br.com.feltex.academicnet.dao.hibernate;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport org.hibernate.Criteria;\r\nimport org.hibernate.Session;\r\nimport org.hibernate.criterion.Order;\r\nimport org.hibernate.criterion.Restrictions;\r\n\r\nimport br.com.feltex.academicnet.dao.AlunoDAO;\r\nimport br.com.feltex.academicnet.entidade.Aluno;\r\nimport br.com.feltex.hibernate.util.HibernateUtil;\r\n\r\npublic class AlunoHibernateDAO implements AlunoDAO {\r\n\r\n\tprivate Session session;\r\n\r\n\tpublic void alterar(Aluno p) {\r\n\t\ttry {\r\n\t\t\tsession = HibernateUtil.getSession();\r\n\t\t\tsession.beginTransaction();\r\n\t\t\tsession.update(p);\r\n\t\t\tsession.getTransaction().commit();\r\n\t\t} catch (Exception e) {\r\n\t\t\tsession.getTransaction().rollback();\r\n\t\t\te.printStackTrace();\r\n\t\t} finally {\r\n\t\t\tsession.close();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic Aluno consultar(Aluno aluno) {\r\n\t\tAluno retorno = new Aluno();\r\n\t\ttry {\r\n\t\t\tsession = HibernateUtil.getSession();\r\n\t\t\tsession.beginTransaction();\r\n\t\t\tretorno = (Aluno) session.get(Aluno.class, aluno.getMatricula());\r\n\t\t\tsession.getTransaction().commit();\r\n\t\t} catch (Exception e) {\r\n\t\t\tsession.getTransaction().rollback();\r\n\t\t\te.printStackTrace();\r\n\t\t} finally {\r\n\t\t\tsession.close();\r\n\t\t}\r\n\t\treturn retorno;\r\n\t}\r\n\r\n\tpublic void excluir(Aluno p) {\r\n\t\ttry {\r\n\t\t\tsession = HibernateUtil.getSession();\r\n\t\t\tsession.beginTransaction();\r\n\t\t\tsession.delete(p);\r\n\t\t\tsession.getTransaction().commit();\r\n\t\t} catch (Exception e) {\r\n\t\t\tsession.getTransaction().rollback();\r\n\t\t\te.printStackTrace();\r\n\t\t} finally {\r\n\t\t\tsession.close();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic boolean existe(Aluno aluno) {\r\n\r\n\t\tAluno a = consultar(aluno);\r\n\t\treturn (a.getMatricula() != null);\r\n\t}\r\n\r\n\tpublic void inserir(Aluno p) {\r\n\t\ttry {\r\n\t\t\tsession = HibernateUtil.getSession();\r\n\t\t\tsession.beginTransaction();\r\n\t\t\tsession.save(p);\r\n\t\t\tsession.getTransaction().commit();\r\n\t\t} catch (Exception e) {\r\n\t\t\tsession.getTransaction().rollback();\r\n\t\t\te.printStackTrace();\r\n\t\t} finally {\r\n\t\t\tsession.close();\r\n\t\t}\r\n\t}\r\n\r\n\t@SuppressWarnings(\"unchecked\")\r\n\tpublic List listar() {\r\n\t\tList lista = new ArrayList();\r\n\t\ttry {\r\n\t\t\tsession = HibernateUtil.getSession();\r\n\t\t\tsession.beginTransaction();\r\n\t\t\tlista = (List) session.createCriteria(Aluno.class).list();\r\n\t\t\tsession.getTransaction().commit();\r\n\t\t} catch (Exception e) {\r\n\t\t\tsession.getTransaction().rollback();\r\n\t\t\te.printStackTrace();\r\n\t\t} finally {\r\n\t\t\tsession.close();\r\n\t\t}\r\n\t\treturn lista;\r\n\t}\r\n\r\n\t@SuppressWarnings(\"unchecked\")\r\n\tpublic List listar(Aluno aluno) {\r\n\t\tCriteria c = session.createCriteria(Aluno.class);\r\n\t\tif (aluno.getNome().length() > 0) {\r\n\t\t\tc.add(Restrictions.like(\"nome\", aluno.getNome() + \"%\"));\r\n\t\t}\r\n\t\tc.addOrder(Order.asc(\"nome\"));\r\n\t\treturn (List) c.list();\r\n\t}\r\n}\r\n<\/pre>\n O arquivo de configura\u00e7\u00e3o hibernate.cfg.xml<\/b>. \u00c9 nele que informa\u00e7\u00e3o os dados de configura\u00e7\u00e3o de acesso ao banco de dados. Servidor, Porta, Nome do Banco, usu\u00e1rio e senha s\u00e3o as informa\u00e7\u00f5es b\u00e1sicas para acesso do nosso Banco.<\/p>\n
<\/p>\nhibernate.dialect => Define qual o \"dialeto\" ser\u00e1 utilizado no banco de dados. Neste caso o dialeto para MySQL. Veja no final deste artigo o link para o cat\u00e1logo de dialects<\/i>
\nhibernate.show_sql => Define se os comandos SQL gerados pelo Hibernate devem ser mostrados. (true ou false)
\nhibernate.format_sql => Define se os comando SQL ter\u00e3o quebra de linha a parte significativa do script
\nhibernate.jdbc.batch_size => Define a grava\u00e7\u00e3o de dados em lote.
\nhibernate.hbm2ddl.auto => Poss\u00edveis valores e a\u00e7\u00f5es
\n validate: validar o esquema, n\u00e3o faz altera\u00e7\u00f5es para o banco de dados.
\n update: atualizar o esquema.
\n create: cria o esquema, destruindo dados anteriores.
\n create-drop: remover o esquema no final da sess\u00e3o.
\n<\/code><\/p>\n
No final a tag serve para mapear as entidades que ser\u00e3o utilizadas no Hibernate. <\/p>\nATEN\u00c7\u00c3O> N\u00e3o esque\u00e7a de adicionar a annotation @Entity a todas classes que foram informadas nas tags mapping<\/b><\/p>\n\r\n\r\n\r\n\r\n\t\r\n\t\t com.mysql.jdbc.Driver<\/property>\r\n jdbc:mysql:\/\/localhost:3306\/bdacademicnet<\/property>\r\n root<\/property>\r\n teco01<\/property>\r\n org.hibernate.dialect.MySQLDialect<\/property>\r\n\t\ttrue<\/property>\r\n\t\ttrue<\/property>\r\n\t\t20<\/property>\r\n\t\t\r\n\t\t\r\n\t\tupdate<\/property>\r\n\t\t\r\n\t\t\r\n\t\t \r\n\t\t \t\t\r\n\t<\/session-factory>\r\n<\/hibernate-configuration>\r\n<\/pre>\n
\nDICA: Existem 2 arquivos extras de configura\u00e7\u00e3o do Hibernate. Esses arquivos n\u00e3o<\/n> s\u00e3o necess\u00e1rios no projeto.
\nCaso voc\u00ea queria ver exemplos de configura\u00e7\u00e3o para PostgreSQL(hibernate.postgresql.cfg.xml) ou MySQL(hibernate.mysql.cfg.xml).
\nServem como apoio para altera\u00e7\u00f5es do arquivo: hibernate.cfg.xml
\n<\/code><\/p>\nDeixei dispon\u00edvel o projeto completo com o c\u00f3digo fonte para auxiliar a todos no processo de aprendizado. Para baixar: Clique aqui<\/a><\/p>\nConclus\u00e3o<\/H2>
\n Este artigo mostra como fazer um CRUD simples com utiliza\u00e7\u00e3o do JSF utilizando o framework Primefaces junto com MySQL e Hibernate. Este mesmo exemplo funciona com JSP, JDBC e Servlet. Assim o leitor poder\u00e1 fazer compara\u00e7\u00f5es de como funcionam essas tecnologias.<\/p>\n
Links relacionados <\/h2>\n
Recomendo que leia: Como gerenciar a transa\u00e7\u00e3o JPA com Hibernate via Filtro em projeto Web<\/a><\/p>\nLeia tamb\u00e9m: Exemplo completo com JSF Primefaces + EJB + Hibernate + MySQL + JMS (Topic)<\/a><\/p>\nVoc\u00ea ir\u00e1 gostar:Bean Transaction Management<\/a>
\nHibernate Manual<\/a>
\nHibernate Dialects<\/a><\/p>\nAbra\u00e7os e bons estudos.
\n
N\u00e3o se esque\u00e7a de curtir este post nas redes sociais. D\u00ea a sua contribui\u00e7\u00e3o social e ajude o autor:<\/H2><\/p>\n","protected":false},"excerpt":{"rendered":"
Exemplo completo com JSF Primefaces + Hibernate + MySQL Ol\u00e1 Amigos, Hoje criaremos um projeto completo com as tecnologias java: JSF (Primefaces) + Hibernate + MySQL ou PostgreSQL. E como de costume iniciaremos com uma breve descri\u00e7\u00e3o de cada uma …<\/p>\n