Você está na página 1de 142

A JVM

A Plataforma Java

| 2

A Java Virtual Machine

| 3

A VM por dentro (Muito simplificada)


Bytecodes 01001001 Class Loader Bytecode Verifier Runtime Interpretador Compilador JIT Memria
Dinmica, esttica e Programa

GC

Cdigo Nativo Sistema Operacional Nativo


| 4

Garbage Collector

| 5

Garbage Collector
Pode ainda ser configurado manualmente indicando quais algoritmos devem ser utilizados.

| 6

Gerncia de Memria
Apesar de podermos confiar no Garbage Collector tambm podemos ter Memory Leaks em Java

| 7

Exemplo de Leak em Java


public class AgendaTelefonicaComMemoryLeak { private String agendaTelefonica[]; private int numeroRegistros; private AgendaTelefonicaComMemoryLeak(){ agendaTelefonica = new String[10]; numeroRegistros = 0; } public void adicionarContato(String contato){ if ( numeroRegistros<agendaTelefonica.length ){ agendaTelefonica[ numeroRegistros++ ] = contato; } } //At aqui tudo bem, o algoritmo no contm Memory Leaks
| 8

Exemplo de Leak em Java


public void removerContato(String contato){ int found = -1; //Acha a posio do registro for ( int i=0; i<numeroRegistros; i++ ){ if ( agendaTelefonica[ i ].equals( contato ) ){ found = i; } } //Compacta a agenda removendo o registro if ( found != -1 ){ numeroRegistros--; for ( int i=found; i<numeroRegistros; i++ ){ agendaTelefonica[ i ] = agendaTelefonica[ i+1 ]; } } } } //Fechamento da classe
| 9

Problema

Exemplo de Leak em Java


public void removerContato(String contato){ int found = -1; //Acha a posio do registro for ( int i=0; i<numeroRegistros; i++ ){ if ( agendaTelefonica[ i ].equals( contato ) ){ found = i; } Soluo } //Compacta a agenda removendo o registro if ( found != -1 ){ numeroRegistros--; for ( int i=found; i<numeroRegistros; i++ ){ agendaTelefonica[ i ] = agendaTelefonica[ i+1 ]; //Permite que o garbage colete a String referenciada agendaTelefonica[ i+1 ] = null ; } } }
| 10

} //Fechamento da classe

Gerncia de Memria
Mesmo nesse exemplo simples o Leak no fcil de ser percebido a primeira vista Existem situaes que deixam o Leak ainda mais obscuro

| 11

Configurao do ambiente

| 12

O HSQLDB

| 13

Configurando o HSQLDB
1 Passo Montando o ambiente:
Deszipar o contedo do arquivo HSQLDB.zip na raiz de nosso projeto. Aps deszipar o arquivo temos a estrutura de diretrios: <Raiz do Projeto>
HSQLDB
data Lib UTILS

| 14

Configurando o HSQLDB
2 Passo Criando o banco de dados:
Executar o servidor HSQLDB
Execute o arquivo de lote hsqldbrunme.bat

Executar o HSQLDB Manager


Execute o arquivo de lote Manager.bat

Criando o banco de dados


Execute no HSQLDB Manager o arquivo
CREATEDB_HSQLDB.sql

Execute no HSQLDB Manager o arquivo TEST_DATA_HSQLDB.sql


| 15

Modelo OO das entidades

| 16

MR do banco

| 17

Configurando o HSQLDB
3 Passo Configurando o driver JDBC:
Para configurar o driver JDBC no projeto basta colocar o hsqldb.jar no CLASSPATH
Nas propriedades do projeto selecione Java Build Path na aba Libraries boto Add JARs

Pronto, j podemos conectar ao HSQLDB a partir de nosso projeto Java.

| 18

JDBC - Tipos importantes


Interfaces
Driver Connection Statement ResultSet PreparedStatement CallableStatement

Classes
DriverManager Date Time
| 19

Instalar um Driver JDBC e configurar o ambiente de execuo


O Driver precisa ser compatvel com o SGBD e se encontrar no CLASSPATH da aplicao

Passos para acesso a um banco de dados

| 20

Driver
Um Driver JDBC uma camada intermediria que traduz chamadas API JDBC em chamadas s APIs proprietrias do banco de dados

Um Driver precisa estar carregado antes de qualquer acesso ao banco de dados


| 21

DriverManager
Gerencia os Drivers carregados permitindo a conexo com o banco de dados
Driver a ser carregado e disponibilizado para o DriverManager
Class.forName("org.hsqldb.jdbcDriver"); Class.forName("org.hsqldb.jdbcDriver"); String url = "jdbc:hsqldb:hsql://localhost:9090/dbc"; "jdbc:hsqldb:hsql://localhost:9090/dbc"; DriverManager.getConnection(url, sa", DriverManager.getConnection(url, sa", "");

| 22

Connection
Representa a conexo com o banco de dados A partir da conexo, consultas SQL so enviadas para o banco de dados e so retornadas as respostas
Class.forName("org.hsqldb.jdbcDriver"); Class.forName("org.hsqldb.jdbcDriver"); String url = "jdbc:hsqldb:hsql://localhost:9090/dbc"; "jdbc:hsqldb:hsql://localhost:9090/dbc"; DriverManager.getConnection(url, sa", DriverManager.getConnection(url, sa", "");

A conexo obtida atravs do DriverManager

| 23

Exemplo Classe TestaConexao


public static void main(String[] args) { main(String[] args) try { // Driver sendo carregado Class.forName("org.hsqldb.jdbcDriver" Class.forName("org.hsqldb.jdbcDriver"); // Obtendo uma conexo com o banco de dados Connection con = DriverManager.getConnection( DriverManager.getConnection( "jdbc:hsqldb:hsql://localhost:9090/dbc ", jdbc:hsqldb:hsql://localhost:9090/dbc sa", ""); sa", /* Neste ponto as consultas j poderiam ser executadas, uma vez que a conexo foi estabelecida com sucesso */ // Fechando a conexo obtida con.close(); con.close(); } catch (ClassNotFoundException e) { (ClassNotFoundException // No foi possvel carregar classe do Driver } catch (SQLException e) { (SQLException // SQL Exception } }

| 24

Statement
Permite o envio de comandos SQL para o SGBD
executeQuery()
Utilizado com comandos que retornam alguma resposta

executeUpdate()
Utilizado com comandos do tipo INSERT, UPDATE e DELETE

execute()
Utilizado com comandos que retornam mltiplos resultados. Ex: Stored Procedures
Statement stmt = con.createStatement(); String sql = "INSERT INTO TB_CLIENTE VALUES('293857338-65', VALUES('293857338+ 'JORGE' )"; stmt.executeUpdate(sql);

| 25

ResultSet
Utilizado para acessar o resultado da execuo de um Statement

String sql = "SELECT * FROM TB_CLIENTE"; Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { String cpf = rs.getString("CPF"); String nome = rs.getString("NOME"); }
| 26

PreparedStatement
Representa um Statement pr-compilado

String sql = "UPDATE USUARIO SET SENHA = ? WHERE LOGIN = ?"; PreparedStatement updateSales = con.prepareStatement(sql); updateSales.setString(1, "geraldo"); updateSales.setString(2, "jglj"); updateSales.executeUpdate();
| 27

Edited by Foxit Reader Copyright(C) by Foxit Software Company,2005-2006 For Evaluation Only.

Exemplo: Insero de dados


Statement stmt = null; String cmd = "INSERT INTO tb_cliente " + "VALUES (11193843723," + Antonio Carlos"; try { stmt = con.createStatement(); stmt.executeUpdate(cmd); } catch (SQLException ex) { // Erro na execuo do comando SQL } finally { if (stmt != null) { try { stmt.close(); } catch(SQLException ex) { // Erro no fechamento do Statement } } }

| 28

Hibernate

Introduo

| 30

Estrutura de uma Aplicao Desenvolvida com Hibernate


Aplicao
Objetos Persistentes

Hibernate
hibernate.cfg.xml Mapeamento Annotations Mapeamento XML

Banco de Dados Relacional

| 31

Principais Caractersticas
Programao Orientada Objetos

| 32

Programao Orientada a Objetos


Suporta caractersticas de uma linguagem orientada a objetos
Herana Polimorfismo Composio

| 33

Suporte para Modelos de Objetos Especficos


Possui mapeamento para variveis compostas de Java:
Map Set List Collection

| 34

Alta Escalabilidade
Hibernate implementa algumas otimizaes

| 35

Linguagem de Busca
HQL (Hibernate Query Language)
Sintaxe parecida com SQL

Orientada a objetos
Herana Polimorfismo Associao

| 36

Configurao do Hibernate

Configurao do Hibernate
Pode ocorrer de duas formas:
Atravs de uma instncia de org.hibernate.cfg.Configuration Atravs do arquivo de configurao
hibernate.cfg.xml

Essa instncia ou arquivo so carregados pela SessionFactory O hibernate.cfg.xml devem est na raiz do projeto
| 38

hibernate.cfg.xml
<hibernate-configuration> <session-factory> <property name="hibernate.dialect"> org.hibernate.dialect.HSQLDialect </property> <property name="hibernate.connection.driver_class"> org.hsqldb.jdbcDriver </property> <property name="hibernate.connection.url"> jdbc:hsqldb:hsql://localhost:9090/dbc </property> <property name="hibernate.connection.username"> sa </property> <property name="hibernate.connection.password"> </property> Mapeamento das classes a serem persistidas </session-factory> </hibernate-configuration>
| 39

Classes Persistentes

Definio
So classes em uma aplicao que implementam as entidades persistentes do negcio. Hibernate funciona melhor com POJOS (Plain Old Java Objects)
De qualquer forma, Hibernate 3 restringe muito pouco da natureza dos objetos persistentes

| 41

Exemplo
public class Cliente { private String cpf; private String nome; private Endereco endereco; //Construtor vazio uma exigncia do hibernate public Cliente() { ... } //Porm outros contrutores podem ser definidos public Cliente(String newCpf, String newNome) { ... } ... }

| 42

Declare gets e sets para Campos Persistentes


Permite que as propriedades no sejam necessariamente public
public class Cliente { ... public String getCpf() { ... } public void setCpf() { ... } etc... }

| 43

Implemente uma Propriedade Identificadora

| 44

Implementando Herana
Deve implementar gets e sets Deve implementar um construtor sem parmetros Herda a chave primria da classe pai
public class Conta extends ContaAbstrata { ... private Set transacoes; public Conta() { } public Set getTransacoes () { } public void setTransacoes (Set novasTransacoes) { } ... }
| 45

Mapeamento O/R

Mapeamento O/R
Pode ser descrito em documentos XML, porm essa prtica est caindo em desuso. Atualmente recomendado usar Annotations para mapear as classes. O mapeamento em torno de classes persistentes, ao invs de tabelas

| 47

Equivalente com Annotations


@Entity @Table (name =tb_cliente) public class Cliente { @Id @Column ( name=cpf) private String cpf; @Column ( name=nome") private String nome; @Transient private Endereco endereco; Resto da classe continua igual }

| 48

Adicionando a classe mapeada


Devemos adicionar a classe anotada ao arquivo hibernate.cfg.xml
... <property name="hibernate.connection.url"> jdbc:hsqldb:hsql://localhost:9090/dbc </property> <property name="hibernate.connection.username"> sa </property> <property name="hibernate.connection.password"> </property> <mapping class=classe com pacote completo"/> </session-factory> </hibernate-configuration>

| 49

Utilizando a classe mapeada


Com a classe anotada e adicionada ao hibernate.cfg.xml j podemos utilizar ela para persistir os dados. Para isso temos apenas que executar 3 passos:
Configurar uma SessionFactory Criar uma Session Manipular a entidade mapeada
Inserir, Alterar, Excluir, Consultar e Listar

| 50

Configurando a SessionFactory
Carregar o arquivo de configurao hibernate.cfg.xml e criar a Factory
//Cria uma nova configurao AnnotationConfiguration acfg = new AnnotationConfiguration(); //Carrega a configurao do hibernate.cfg.xml se ele existir acfg.configure(); //Cria a SessionFactory que prover todas as sessions necessrias SessionFactory sessionFactory = acfg.buildSessionFactory();

| 51

Criando uma sesso


//Cria uma nova configurao AnnotationConfiguration acfg = new AnnotationConfiguration(); //Carrega a configurao do hibernate.cfg.xml se ele existir acfg.configure(); //Cria a SessionFactory que prover todas as sessions necessrias SessionFactory sessionFactory = acfg.buildSessionFactory();

//Cria-se uma nova sesso Session session = sessionFactory.openSession();

| 52

Salvando um cliente
//Cria uma nova configurao

AnnotationConfiguration acfg = new AnnotationConfiguration();


//Carrega a configurao do hibernate.cfg.xml se ele existir

acfg.configure();
//Cria a SessionFactory que prover todas as sessions necessrias

SessionFactory sessionFactory = acfg.buildSessionFactory();


//Cria uma nova sesso

Session session = sessionFactory.openSession();

//Cria-se um objeto cliente local Cliente cliente = new Cliente(12332134598,Teste de insero); //Salva o objeto cliente no banco (Sem a sujeira do SQL embutido) session.save(cliente); //Fecha-se a sesso aps o uso session.close();
| 53

Atualizando um cliente
...

//Recupera o cliente do banco Cliente cliente = (Cliente) session.get( Cliente.class, cpf ); //Altera uma propriedade Cliente.setNome(Nome Alterado); //Atualiza o objeto cliente no banco session.saveOrUpdate(cliente); //Fecha-se a sesso aps o uso session.close();

| 54

Removendo um cliente
...

//Recupera o cliente do banco Cliente cliente = (Cliente) session.get( Cliente.class, cpf ); //Atualiza o objeto cliente no banco session.delete(cliente); //Fecha-se a sesso aps o uso session.close();

| 55

Listando todos os clientes


...

//Recupera todos os clientes do banco (VIA HQL) Query q = session.createQuery( from Cliente ); //Recupera a lista gerada pela consulta List<Cliente> clientes = q.list(); //Exibe os clientes for (Cliente c : clientes){ System.out.print( " Nome: " +c.getNome() ); System.out.println( " CPF: " +c.getCpf() ); } //Fecha-se a sesso aps o uso session.close();
| 56

Conhecendo mais sobre Hibernate Annotations e Tipos de Relacionamentos

@Id
Existem vrias formas de se definir um Id de objeto/registro

| 58

Auto-incremento com @GeneratedValue


@Entity @Table (name =tb_gerente) public class Gerente { @Id @GeneratedValue( strategy=GenerationType.IDENTITY ) @Column ( name=id) private int Id; @Column ( name=nome") private String nome; @Column ( name=fone") private String fone; }
| 59

Relacionamentos
Com o Hibernate possvel mapear os trs tipos de relacionamentos dos banco de dados relacionais:
1:N ou N:1 - @OneToMany ou @ManyToOne N:N @ManyToMany 1:1 - @OneToOne

O Hibernate s faz uma exigncia quanto aos relacionamentos, os dois lados devem definir as regras de acesso.
| 60

Um para Um 1:1

| 61

Um para Um 1:1
@Entity @Table (name =tb_cliente) public class Cliente { @Id @Column ( name=cpf) private String cpf; @Column ( name=nome") private String nome; @OneToOne( cascade=CascadeType.ALL ) @PrimaryKeyJoinColumn private Endereco endereco; }
| 62

@Entity @Table (name =tb_endereco) public class Endereco { @Id @Column ( name=tb_cliente_cpf ) private String clienteCpf; @Column ( name=CEP") private String CEP; }

Um para N 1:N

| 63

Um para N 1:N
@Entity @Table (name =tb_cliente) public class Cliente { @OneToMany( mappedBy= cliente, fetch = FetchType.LAZY ) private Collection contas; } } ... @ManyToOne( fetch = FetchType.EAGER ) @JoinColumn( name= tb_cliente_cpf ) private Cliente cliente; @Entity @Table( name="tb_conta" ) public abstract class ContaAbstrata { ...

| 64

Hibernate Query Language


Case Sensitivity
Nomes de classe Java Propriedades .banco.Agencia != banco.AGENCIA

Case Insensitivity
Palavras chave HQL SELECT == select

| 65

Clusula from
frombanco.Agencia Agencia tabela [alias] FROM frombanco.Agencia AS Agencia FROM tabela [as] [alias]
FROM banco.Agencia, contaBancaria.Conta Podem ser usadas vrias classes

FROM banco.Agencia AS Agencia, contaBancaria.ContaCorrente AS Conta

| 66

Clusula select
Indica que objetos e propriedades sero retornados
SELECT Agencia FROM .contaBancaria.ContaCorrente

Pode retornar vrios objetos e/ou propriedades Cliente FROM SELECT Agencia,
.contaBancaria.ContaCorrente

| 67

Funes Agregadas
Queries em HQL podem retornar o valor de funes agregadas
SELECT count(Conta.Cartoes) FROM .contaBancaria.ContaCorrente as Conta

As funes suportadas:
avg (...) sum(...) min(...) max(...) count(*) count( ), count (distinct ...), count (all ...)

| 68

Clusula where
Usada para diminuir o nmero de instncias retornadas
FROM .contaBancaria.ContaCorrente AS Conta WHERE Conta.numero = 1111111111 SELECT Poupanca FROM .contaBancaria.Poupanca AS Poupanca, .contaBancaria.ContaCorrente AS Conta WHERE poupanca.contaCorrente.numero = Conta.numero AND Conta.numero = 1111111111 FROM .contaBancaria.Conta AS conta WHERE conta.class = .contaBancaria.ContaCorrente

| 69

Expresses
Expresses que podem ser usadas na clusula where
Operadores Matemticos: +, -, *, / Comparadores Binrios: =, >=, <=, <, >, !=, like Operadores Lgicos: and, or, not Concatenao de Strings: || Funes escalares SQL: upper(), lower() Parnteses para agrupamento: () in, between, is null Parmetros JDBC ? Literais SQL: dbc, 69 Constantes Java public static final: .transacao.DOC.TipoContaCorrente

| 70

Java I/O

A classe File

| 72

Você também pode gostar