Passo 1
(Este tutorial foi desenvolvido por Cleber Calvi)
Gravação de Dados!
Vamos criar a nossa tela (simples) onde pegaremos os dados a serem registrados na base de dados. Ex:
Mantendo um padrão de desenvolvimento, na pasta Source teremos as seguintes camadas:
View > beans;
Service > camada responsável por fazer a comunição entre a view e a dao, fazendo tratamentos e conversões de dados, passando os dados de maneira clara para ambas as camadas;
DAO > camada responsável por trabalhar com a base de dados.
Criaremos uma base de dados, nela criaremos uma tabela e a seguinte stored procedure:
create procedure gravar
@nome varchar(20),
@idade decimal(10,0)
AS
if exists (select nome from dados where nome=@nome)
begin
select ‘D’
end
else
begin
insert into dados
values (@nome, @idade)
select ‘O’
end
Obs.: lembrando que essa é uma procedure simples e que devemos evitar clausulas where comparando “Strings”.
Criada nossa procedure, vamos as classes Java.
Criaremos no bean o seguinte método:
public String gravar(){
String retorno=null;
String status;
status = service.gravar(this.nome, this.idade);
if(status.equals(“D”) || status.equals(“F”)){
retorno = “falha”;
}else{
retorno = “sucesso”;
}
return retorno;
}
Agora iremos criar a classe service que deverá ficar semelhante ao código abaixo:
package br.com.web.control.service;
import br.com.web.control.dao.HibernateDAO;
public class HibernateService{
private HibernateDAO dao = new HibernateDAO();
//Construtor
public HibernateService(){
}
public String gravar(String nome, int idade){
String retorno;
try{
retorno = dao.gravar(nome, idade);
}catch (Exception e) {
retorno = “E”;
}
return retorno;
}
}
Obs.: lembrando que o package e o importe irão variar de acordo com a estrutura e nomes do seu projeto.
E finalmente a classe DAO:
package br.com.web.control.dao;
import org.hibernate.Query;
import org.hibernate.Transaction;
import org.hibernate.classic.Session;
public class HibernateDAO{
//Objeto para manuseio da classe de Conexao
Conexao conexao = new Conexao();
//Construtor
public HibernateDAO(){
}
public String gravar(String nome, int idade) throws Exception{
Session session = getConexao().getSession();
String retorno = null;
Query query = null;
try{
Transaction trans = session.beginTransaction();
query = session.getNamedQuery(“gravar”);
query.setString(0, nome);
query.setInteger(1, idade);
retorno = String.valueOf(query.uniqueResult());
trans.commit();
}catch(Exception he) {
throw new Exception();
} finally{
session.close();
}
return retorno;
}
public Conexao getConexao() {
return conexao;
}
public void setConexao(Conexao conexao) {
this.conexao = conexao;
}
}
E a classe conexão:
package br.com.web.control.dao;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
public class Conexao {
//Objeto que irá conter a configuração de conexão
private SessionFactory factory;
//Método construtor
public Conexao(){ };
/* Método que configura a conexão com o hibernate
* abre e retorna uma sessão */
public Session getSession(){
this.factory = new Configuration().configure().buildSessionFactory();
Session session = this.factory.openSession();
return session;
}
}
Bom, até agora muito código e pouca explicação né! Vamos agora explicar um pouco o que foi feito.
O bean é responsável por pegar os dados da tela e enviar para a camada service, ao receber os dados de volta ele irá verificar para qual tela ele deve direcionar a aplicação através do status, que nada mais é que o retorno da classe Service.
A camada service está pegando os dados e enviando para a camada DAO, caso haja algum erro na camada DAO, a service irá tratar esse erro mandando uma mensagem de status “F” que trataremos como erro, caso não dê problema apenas repassa o valor recebido da stored procedure.
A camada DAO é responsável por toda a parte de base de dados, para isso criamos a classe “dao” que irá receber os valores da service, abrir uma sessão através da classe “Conexão” (Session session = getConexao().getSession();), montar e executar a query (Transaction trans = session.beginTransaction(); query = session.getNamedQuery(“gravar”); query.setString(0, nome); query.setInteger(1, idade); retorno = String.valueOf(query.uniqueResult()); trans.commit();) .
A classe Conexão apenas cria a sessionFactory baseado no arquivo hibernate.cfg.xml.
Porém para que tudo isso funcione ainda é necessário criar o “hbm.xml” que terá como primeiro nome, o mesmo que foi dado a sua base de dados, nesse caso “HBM.hbm.xml”.
<?xml version=“1.0″ encoding=“UTF-8″?>
<!DOCTYPE hibernate-mapping PUBLIC “-//Hibernate/Hibernate Mapping DTD//EN”
“http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”>
<!– ************************************************************************************************ –>
<!– Mapeamento de Stored Procedures que usamos na aplicalção –>
<!– ************************************************************************************************ –>
<hibernate-mapping auto-import=”true” default-lazy=”false”>
<sql-query name=“gravar” callable=“true”>
<return-scalar column=“mensagem” type=“string” />
{ call gravar(?,?) }
</sql-query>
</hibernate-mapping>
Nesse arquivo é que serão mapeadas as procedures que serão chamadas e seus retornos. No caso da gravação onde teremos apenas uma mensagem, o mapeamento é simples como o apresentado acima.