Upload
michellynson-anderson-bryant
View
2
Download
1
Embed Size (px)
DESCRIPTION
programar ações no banco de dados
Citation preview
1-2
Hibernate
Roteiro• O que é? Para que Serve?
• O que fazer para usá-lo? Como funciona?
• Vantagens/Desvantagens
• Exemplo
• Componentes de uma aplicação com Hibernate
• Exemplos Básicos
• Criação de mapeamentos (HBM)
• Criteria
• HQL
• Outros Aspectos (Lazy Loading, Cache, etc.)
1-3
Hibernate
O que é? • Hibernate é uma solução para mapeamento objeto-realcional
(ORM) open-source e bastante popular em Java.
Para que Serve?• Serve para reduzir a impedância da programação orientada à
objetos utilizando bancos de dados relacionais.
• As tabelas do banco de dados são representadas através de classes e os registros de cada tabela são representados como instâncias das classes correspondentes.
• Permite que sejam feitas operações sobre os dados em HQL (Hibernate Query Language ) no lugar de SQL (Structured Query Language)
1-4
Hibernate
O que fazer para usá-lo?• Cria-se o Value Object que representará a tabela.
• Define-se o mapeamento objeto relacional em arquivos XML.
• Configura-se o hibernate para usar o objeto mapeado
Como funciona?• Utilizando os itens anteriores o Hibernate “simula” um banco de
dados orientado a objetos, aceitando operações OO (inserir/atualizar/recuperar objetos, consultar por campos de classes que são atributos da classe, inserir uma lista, inserir árvores, etc.)
1-5
Hibernate
Vantagens• Linguagem de consulta OO
• Cache
• Lazy Loading
• Suporte a vários BDs
• Independência entre o HQL e o BD utilizado
Desvantagens• Overhead
• Curva de aprendizado
• Sem suporte a Stored Procedures (em HQL)
1-6
Hibernate
VO
package aluno;
public class Aluno{ int matricula; String nome;
int idade;}
<class name="aluno.Aluno" table="tabela_aluno"> <id name="matricula" type="int"
column="matricula">
<generator class="native"> </generator> </id>
<property name="nome" type="java.lang.String" update="true" insert="true" column="nome"
length="100"not-null="true"
/> <property name="idade" type="int" update="true" insert="true" column="idade"
not-null="true" />
</class>
+
Mapeamento
1-7
Hibernate
Componentes de uma aplicação com Hibernate• Hibernate Properties File: arquivo (xml ou properties) contendo as
propriedades de conexão ao banco
• Hibernate Query Language (HQL)
• Values Objects/Transfer Object/POJO
• Hibernate Mapping File (hbm): arquivo xml que relaciona as propriedades do objeto aos campos da tabela mapeada
1-8
Hibernate
Hibernate Properties File (hibernate.properties)
## Database connection settingsconnection.driver_class com.mysql.jdbc.Driverhibernate.connection.url jdbc:mysql://localhost/minicursoconnection.username rootconnection.password
## JDBC connection pool (use the built-in)connection.pool_size 1
## SQL dialecthibernate.dialect org.hibernate.dialect.MySQLDialect
## Echo all executed SQL to stdoutshow_sql true
1-9
Hibernate
Hibernate cfg.xml (hibernate.cfg.xml)
<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<mapping resource="aluno/Aluno.hbm.xml"/>
</session-factory>
</hibernate-configuration>
1-11
Hibernate
Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();
Aluno aluno = new Aluno();aluno.nome=novoNome;
session.save(aluno);tx.commit();session.close();
Inserir• session.save(OBJETO) para inserir
• session.saveOrUpdate(OBJETO) para inserir caso o objeto seja novo ou atualizar caso o objeto já tenha chave primária definida.
1-12
Hibernate
Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();
Aluno aluno = new Aluno();aluno.nome=novoNome;
session.update(aluno);tx.commit();session.close();
Atualizar• session.update(OBJETO) para atualizar
• session.saveOrUpdate(OBJETO) para inserir caso o objeto seja novo ou atualizar caso o objeto já tenha chave primária definida.
1-13
Hibernate
Session session = sessionFactory.openSession();
Aluno aluno = (Aluno) session.get(Aluno.class, new Integer(matricula);session.close();
Recuperar• session.load(CLASSE, CHAVE_PRIMARIA) deve ser usado
somente se tiver certeza que o objeto existe (caso não exista ocorrerá erro)
• session.get(CLASSE, CHAVE_PRIMARIA): retorna o objeto ou null caso o objeto não exista
1-14
Hibernate
Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();
Aluno aluno = (Aluno) session.get(Aluno.class, new Integer(matricula);
session.delete(aluno);tx.commit();session.close();
Apagar• session.delete(OBJETO) remove o objeto passado como parâmetro
1-15
Hibernate Criação de mapeamentos (HBM)
• Mapeamentos Objeto/relacional são usualmente definidos em um documento XML.
• O documento de mapeamento foi projetado para ser de fácil leitura e edição.
• Este mapeamento é centrado em Java, ou seja, os mapeamentos são construídos ao redor de classes persistentes e não de definições de tabela.
1-16
Hibernate
VO
package aluno;
public class Aluno{ int matricula; String nome;
int idade;}
<class name="aluno.Aluno" table="tabela_aluno"> <id name="matricula" type="int"
column="matricula">
<generator class="native"> </generator> </id>
<property name="nome" type="java.lang.String" update="true" insert="true" column="nome"
length="100"not-null="true"
/> <property name="idade" type="int" update="true" insert="true" column="idade"
not-null="true" />
</class>
+
Mapeamento
1-17
Hibernate
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">...
Criação de mapeamentos (HBM): Classes• Doctype
1-18
Hibernate
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping auto-import="false"> . . .
</hibernate-mapping>
Criação de mapeamentos (HBM): Classes• Hibernate-mapping: auto-import atributo opcional que especifica
se podemos usar classes não qualificadas (sem pacote), descritas nesse mapeamento, em consultas.
1-19
Hibernate
<hibernate-mapping auto-import="false"> <class name="aluno.Aluno" table="tabela_aluno" >... </class>
</hibernate-mapping>
Criação de mapeamentos (HBM): Classes• Class:
• name: especifica o nome da classe persistente a ser mapeada
• table: especifica o nome da tabela no banco de dados
1-20
Hibernate
<class name="aluno.Aluno" table="tabela_aluno">
<id name="id" column="id" type="int"> <generator class="native"> </generator> </id>
</class>
Criação de mapeamentos (HBM): Chave Primária• id:
• name: especifica o nome do atributo na classe
• column: especifica o nome do atributo na tabela do BD
• type: tipo do atributo (EM JAVA)
• generator:
• class: especifica o gerador de chave primário utilizado
1-21
Hibernate
<class name="aluno.Aluno" table="tabela_aluno">
<property name="nome" column="nome" type="java.lang.String" not-null="true" update="true" insert="true" length="100" />
</class>
Criação de mapeamentos (HBM): Atributos Simples• property:
• name: especifica o nome do atributo na classe
• column: especifica o nome do atributo na tabela do BD
• type: tipo do atributo (EM JAVA)
• not-null: se o campo pode ser nulo ou não
• insert/update: se o campo deve ser inserido ou atualizado nas operações
• length: comprimento máximo do campo (usado para determinar tipo no BD)
1-22
Hibernate
<class name="aluno.Aluno" table="tabela_aluno">
<one-to-one name="turma" column="id_turma" class="turma.Turma" cascade="none" />
</class>
Criação de mapeamentos (HBM): Associações• Um para um:
• name: especifica o nome do atributo na classe
• column: especifica o nome do atributo na tabela do BD
• class: especifica a outra classe da associação
• cascade: especifica quais operandos devem ser “cascateados” do objeto pai para o objeto associado.
1-23
Hibernate
<class name="aluno.Aluno" table="tabela_aluno">
<many-to-one name="turma" column="id_turma" class="turma.Turma" cascade="none" />
</class>
Criação de mapeamentos (HBM): Associações• Muitos para um:
• name: especifica o nome do atributo na classe
• column: especifica o nome do atributo na tabela do BD
• class: especifica a outra classe da associação
• cascade: especifica quais operandos devem ser “cascateados” do objeto pai para o objeto associado.
1-24
Hibernate Criteria (org.hibernate.criterion.Criterion)
• Representa uma query contra uma classe persistente em particular.
1-25
Hibernate
Criteria criteria = session.createCriteria(Aluno.class);
Criteria• Criando um Criteria: session.createCriteria(CLASSE) cria um criteria para a classe persistente passada como parâmetro
1-26
Hibernate
Criteria criteria = session.createCriteria(Aluno.class);criteria.setMaxResults(50);List alunos = criteria.list();
Criteria• Atribuindo número máximo de resultados:
criteria.setMaxResults(QUANTIDADE).
1-27
Hibernate
Criteria criteria = session.createCriteria(Aluno.class);
criteria.add( Restrictions.like("nome", "Glauber%") );criteria.add( Restrictions.between("matricula", 0, 10) );List alunos = criteria.list();
Criteria• Restringindo os dados a serem recuperados
(org.hibernate.criterion.Restrictions)
1-28
Hibernate
Criteria criteria = session.createCriteria(Aluno.class);
criteria.add( Restrictions.like("nome", "Glauber%") );criteria.add( Restrictions.or( Restrictions.eq( "matricula", new Integer(10) ), Restrictions.isNull("nome") ) );List alunos = criteria.list();
Criteria• Restringindo os dados a serem recuperados
(org.hibernate.criterion.Restrictions)
1-29
Hibernate
Criteria criteria = session.createCriteria(Aluno.class);
criteria.add( Restrictions.like("nome", "Glauber%") );criteria.add( Restrictions.or( Restrictions.eq( "matricula", new Integer(10) ), Restrictions.isNull("nome") ) );criteria.addOrder( Order.asc("nome") );criteria.addOrder( Order.desc("matricula") );
List alunos = criteria.list();
Criteria• Ordenando os dados a serem recuperados
(org.hibernate.criterion.Order)
1-30
Hibernate
Query q = session.createQuery("from Aluno as this where this.nome=:nome and this.idade=:idade");q.setParameter("nome", "Glauber");q.setParameter("idade", 26);
List alunos = q.list();
HQL• Como passar parâmetros
1-31
Hibernate
Query q = session.createQuery("select this from Aluno as this where this.turma.nome=:nome");
q.setParameter("nome", "Turma 5");
List alunos = q.list();
HQL• Caminhando em associações
1-32
Hibernate
Query q = session.createQuery("select this from Aluno as this where this.nome=:nome and this.idade=:idade");q.setParameter("nome", "Glauber");q.setParameter("idade", 26);
List alunos = q.list();
HQL• Como passar parâmetros
1-33
Hibernate
Query q = session.createQuery("from Aluno");
q.setMaxResults(ITENS_POR_PAGINA);q.setFirstResult(ITENS_POR_PAGINA * PAGINA_ATUAL);
List alunos = q.list();
HQL• Exemplo de paginação
1-34
Hibernate Outros Aspectos
• Lazy Loading:
• É usado para melhorar a eficiência do programa carregando objetos ou recursos somente nos contextos em que são necessários.
• É um design pattern comumente utilizado para adiar a inicialização de um objeto ou recurso até o momento em que ele é necessário.
• É utilizado para melhorar a eficiência de programas, quando utilizado de forma apropriada.
• É o oposto de Inicialização Ávida/Ansiosa (Eager Loading).
1-35
Hibernate
public class Aluno{ private int idTurma; private Turma turma = null;
public Turma getTurma() { if (turma == null) { turma = TurmaDAO.load(idTurma); } return turma; }}
Outros Aspectos • Lazy Loading: Exemplo de implementação
• Lazy initialization: Objeto ou Recurso é originalmente atribuído com valor marcador (normalmente 'null') e a cada acesso é verificado se é necessário carregamento, este ocorrendo em tempo de execução no primeiro acesso.
1-36
Hibernate Outros Aspectos
• Lazy Loading: Exemplo de implementação
• Virtual proxy: Implementa a mesma interface do Objeto ou Recurso que é carregado 'preguiçosamente', com o proxy carregando o objeto na primeira chamada a seus métodos e delegando as chamadas para o objeto real
class Aluno{ private int id; private String nome; public String getNome() { return nome; } //...}
class AlunoProxy extends Aluno{ private Aluno aluno=null; private int id; public String getNome() { if (aluno==null) aluno=AlunoDAO.load(id); return aluno.getNome(); } //...}
1-37
Hibernate
<class name="aluno.Aluno" table="tabela_aluno">
<one-to-one name="turma" column="id_turma" class="turma.Turma" cascade="none" lazy="proxy" />
</class>
Outros Aspectos • Lazy Loading: Uso do lazy loading no hibernate
1-38
Hibernate Exercício 1
• 1- Crie o diagrama de classe para uma classe Funcionario com o nome e seu codigo.
• 2- Crie o Value object para representar o diagrama descrito acima.
• 3- Crie o arquivo de mapeamento do Value Object
• 4- Configure o Hibernate para trabalhar com esse mapeamento
• 5- Crie o DAO de Funcionario
1-39
Hibernate Exercício 1
• 1- Crie o diagrama de classe para uma classe Telefone com o número e o ddd.
• 2- Crie o Value object para representar o diagrama descrito acima.
• 3- Crie o arquivo de mapeamento do Value Object
• 4- Crie o DAO de Telefone
1-40
Hibernate Exercício 2
• 1- Crie o diagrama de classe para uma agenda telefônica. Ela deve ter uma classe Telefone com o número e o ddd, e uma classe Registro com nome, email e uma lista de Telefones.
• 2- Crie os Value objects para representar o diagrama descrito acima.
• 3- Crie os arquivos de mapeamento dos Value Objects
• 4- Crie o DAO de Registro
1-41
Hibernate Exercício 3
• 1- Crie o diagrama de classe para a seguinte situação: Um aluno, representado pelo nome, pode estar matriculado em 0 ou mais turmas. Uma turma pode ter 0 ou mais alunos.
• 2- Crie os Value objects para representar o diagrama descrito acima.
• 3- Crie os arquivos de mapeamento dos Value Objects
• 4- Crie os DAO de Aluno e Turma
1-42
Hibernate Exercício 4
• 1- Crie o diagrama de classe para a seguinte situação: Um cliente, representado pelo nome, pode efetuar uma ou mais compras, cada compra pode conter um ou mais produtos, cada produto pode estar em uma ou mais vendas e uma compra só pode ser feita por um cliente. Um produto é representado por seu nome e valor.
• 2- Crie os Value objects para representar o diagrama descrito acima.
• 3- Crie os arquivos de mapeamento dos Value Objects
• 4- Crie os DAO de Cliente e Compra
• 5- Crie um método que consulte o valor total de uma compra
• 6- Crie um método que consulte o valor total de todas as compras de um determinado cliente