You are on page 1of 57

Acessando Banco de

Dados com Java

Braslia-DF.

Elaborao
Leandro Rubim de Freitas

Produo
Equipe Tcnica de Avaliao, Reviso Lingustica e Editorao

Sumrio
Apresentao................................................................................................................................... 4
Organizao do Caderno
de Estudos e Pesquisa...................................................................................................................... 5
Introduo...................................................................................................................................... 7
Unidade i
ESTRUTURA DA API JAVA - JDBC........................................................................................................... 11
CAPTULO 1
O que o Java Database Connectivity (JDBC).................................................................. 11
captulo 2
JDBC: classes, mtodos e padres................................................................................... 15
Unidade iI
PROGRAMAO JAVA COM JDBC..................................................................................................... 18
captulo 1
CONNECTION, STATEMENT, PREPARED STATEMENT, RESULT SET, INSERT, DELETE, UPDATE, SELECT.. 18
captulo 2
Controle Transacional.................................................................................................... 31
captulo 3
Design Pattern ................................................................................................................... 34
Unidade iII
JAVA COM JPA/HIBERNATE.................................................................................................................. 42
captulo 1
Estrutura JPA e HANDS ON ................................................................................................. 42
Para (no) finalizar....................................................................................................................... 56
Referncias..................................................................................................................................... 57

Apresentao
Caro aluno
A proposta editorial deste Caderno de Estudos e Pesquisa rene elementos que se entendem
necessrios para o desenvolvimento do estudo com segurana e qualidade. Caracteriza-se pela
atualidade, dinmica e pertinncia de seu contedo, bem como pela interatividade e modernidade
de sua estrutura formal, adequadas metodologia da Educao a Distncia EaD.
Pretende-se, com este material, lev-lo reflexo e compreenso da pluralidade dos conhecimentos
a serem oferecidos, possibilitando-lhe ampliar conceitos especficos da rea e atuar de forma
competente e conscienciosa, como convm ao profissional que busca a formao continuada para
vencer os desafios que a evoluo cientfico-tecnolgica impe ao mundo contemporneo.
Elaborou-se a presente publicao com a inteno de torn-la subsdio valioso, de modo a facilitar
sua caminhada na trajetria a ser percorrida tanto na vida pessoal quanto na profissional. Utilize-a
como instrumento para seu sucesso na carreira.
Conselho Editorial

Organizao do Caderno
de Estudos e Pesquisa
Para facilitar seu estudo, os contedos so organizados em unidades, subdivididas em captulos, de
forma didtica, objetiva e coerente. Eles sero abordados por meio de textos bsicos, com questes
para reflexo, entre outros recursos editoriais que visam a tornar sua leitura mais agradvel. Ao
final, sero indicadas, tambm, fontes de consulta, para aprofundar os estudos com leituras e
pesquisas complementares.
A seguir, uma breve descrio dos cones utilizados na organizao dos Cadernos de Estudos
e Pesquisa.
Provocao
Textos que buscam instigar o aluno a refletir sobre determinado assunto antes
mesmo de iniciar sua leitura ou aps algum trecho pertinente para o autor
conteudista.
Para refletir
Questes inseridas no decorrer do estudo a fim de que o aluno faa uma pausa e reflita
sobre o contedo estudado ou temas que o ajudem em seu raciocnio. importante
que ele verifique seus conhecimentos, suas experincias e seus sentimentos. As
reflexes so o ponto de partida para a construo de suas concluses.

Sugesto de estudo complementar


Sugestes de leituras adicionais, filmes e sites para aprofundamento do estudo,
discusses em fruns ou encontros presenciais quando for o caso.

Praticando
Sugesto de atividades, no decorrer das leituras, com o objetivo didtico de fortalecer
o processo de aprendizagem do aluno.

Ateno
Chamadas para alertar detalhes/tpicos importantes que contribuam para a
sntese/concluso do assunto abordado.

Saiba mais
Informaes complementares para elucidar a construo das snteses/concluses
sobre o assunto abordado.

Sintetizando
Trecho que busca resumir informaes relevantes do contedo, facilitando o
entendimento pelo aluno sobre trechos mais complexos.

Exerccio de fixao
Atividades que buscam reforar a assimilao e fixao dos perodos que o autor/
conteudista achar mais relevante em relao a aprendizagem de seu mdulo (no
h registro de meno).
Avaliao Final
Questionrio com 10 questes objetivas, baseadas nos objetivos do curso,
que visam verificar a aprendizagem do curso (h registro de meno). a nica
atividade do curso que vale nota, ou seja, a atividade que o aluno far para saber
se pode ou no receber a certificao.
Para (no) finalizar
Texto integrador, ao final do mdulo, que motiva o aluno a continuar a aprendizagem
ou estimula ponderaes complementares sobre o mdulo estudado.

Introduo
Todas as empresas necessitam armazenar dados e informaes referentes ao seu negcio. Por exemplo,
uma padaria precisa registrar as vendas efetuadas, o seu estoque e etc. Uma empresa de comrcio
eletrnico precisa armazenar todos os dados de seus clientes, produtos, fornecedores, vendas e etc.
Atualmente, registrar as informaes relevantes de uma empresa no papel no uma boa alternativa.
Recuperar a informao armazenada dessa forma demorada e sujeita a erros, o volume de material
pode ser grande, necessitando assim de grande espao fsico para o seu armazenamento, alm do
cuidado para no perder as informaes em caso de acidentes.
A soluo utilizar o computador para armazenar os dados, que podem ser armazenados em arquivos
texto ou planilhas. Outra opo utilizar sistemas especializados no armazenamento de dados que
oferecem mais funcionalidades e recursos avanados, como backup e buscas mais eficientes. Esses
sistemas so conhecidos como Sistemas Gerenciadores de Banco de Dados SGBD.
Um Sistema de Gerenciamento de Banco de Dados o conjunto de programas de computador
responsveis pelo gerenciamento de uma base de dados. Seu principal objetivo retirar da aplicao
cliente a responsabilidade de gerenciar o acesso, manipulao e a organizao dos dados. O SGBD
disponibiliza uma interface para que seus clientes possam incluir, alterar, excluir ou consultar dados
previamente armazenados.
Os principais SGBDs utilizados nas empresas utilizam o Modelo Relacional para armazenar as
informaes e a linguagem SQL para manipular os dados armazenados nas base de dados.
Os principais SGBDs utilizados no mercado so:
Oracle Database
SQL Server
PostgreSQL
MySQL Server
O Modelo Relacional um modelo de dados baseados em entidade e relaes. Entidade um
elemento caracterizado pelos dados que so recolhidos na sua identificao vulgarmente designado
por tabela. Na construo da tabela identificam-se os dados da entidade. A atribuio de valores de
uma entidade constri um registro da tabela. A relao determina o modo como cada registro de
cada tabela se associa a registros de outras tabelas.
Figura 1 Exemplo de tabelas.

Fonte: autor

O exemplo acima mostra duas tabelas que armazena dados de Clientes e Produtos.
Uma tabela formada por registros (linhas) e os registros so formados por campos
(colunas).
A tabela Cliente armazena as informaes: cdigo, nome e cpf. Ela possui 3 registros
(linhas): Thiago, Gabriela e Jos. A tabela produto armazena 4 informaes, o cdigo,
produto, quantidade e preo. E possui 3 registros tambm: celular, livro e tablet.
As tabelas normalmente possuem uma chave primria, que um identificador nico
que garante que nenhum registro ser duplicado. Assim, todo registro possui um
identificador que nico na tabela.
Structured Query Language SQL, ou Linguagem de Consulta Estruturada a
linguagem de pesquisa declarativa padro para banco de dados relacional, atravs
dela que os principais SGBDs interagem com os bancos de dados.
A linguagem SQL surgiu em 1974 e foi desenvolvida nos laboratrios da IBM como
interface para o Sistema Gerenciador de Banco de Dados Relacional (SGBDR). Outras
linguagens do gnero surgiram e foi criado um padro para a SQL em 1986 pelo American
National Standard Institute (ANSI) e em 1987 pela International Organization for
Standards (ISSO).
Alguns dos principais comandos SQL para a manipulao de dados so: INSERT
(insero), SELECT (consulta), UPDATE (atualizao), DELETE (excluso). SQL
possibilita ainda a criao de tabelas, relaes e controle do acesso aos dados.
Neste curso, iremos abordar a linguagem SQL com mais detalhes.
O curso ir propiciar a compreenso dos conceitos fundamentais de Sistemas de
Informao e Banco de Dados, que convergem no alicerce de todos os sistemas
computacionais. Sero abordados todos os itens da Engenharia de um Software, desde
a anlise das necessidades cruciais para a criao de um sistema e o armazenamento
de dados em um banco de dados MySQL utilizando o JDBC com a linguagem de
programao Java.

Objetivos
Entender os conceitos do JDBC.
Compreender a estrutura para conectar ao banco de dados e executar comandos
com o JDBC.
Entender como codificar, compilar e executar programas em Java para comunicao
com banco de dados.
Analisar padres de programao.

Compreender padres de projetos e aplica-los na programao Java.


Compreender os princpios da criao de um sistema com acesso a banco de dados.
Com o avano da tecnologia e a arquitetura de Nuvem, bancos no relacionais
esto ganhando fora. So bancos chamados NoSQL, Para saber mais acesse:
<http://pt.wikipedia.org/wiki/NoSQL>

10

ESTRUTURA DA API
JAVA - JDBC

Unidade i

CAPTULO 1
O que o Java Database Connectivity
(JDBC)

JDBC: princpios
O Java Database Connectivity uma API (Aplication Programming Interface), ou seja, um conjunto
de padres (interfaces) criados nos primordios do Java para permitir uma padronizao das diversas
possveis implementaes que surgiriam para os diversos tipos distintos de banco de dados. Difcil o
entendimento? Para entender melhor a importncia do JDBC, vai aqui uma pequena histria:
O Java iniciou sua vida em meados de 1991, e devido a sua rpida ascenso no mercado de tecnologia,
diversos fabricantes de banco de dados se interessaram em disponibilizar seus SGBDs (Sistema
Gerenciador de Banco de Dados) ao acesso do Java. Ali, naquele momento, existia um perigo: a falta
de padronizao, o que complicaria e muito a vida do programador.
Imagine s ter que desenvolver um sistema para acesso a um SGBD, e de repente, diante de uma
necessidade de mudar ou aderir a um novo SGBD, ter que modificar todo o cdigo?
Foi ai que surgiu a ideia, criada pela ento Sun Microsystems, de utilizar o conceito de Interfaces
do Java para criar um conjunto de padres a serem seguidos por todos os fabricantes de SGBDs
interessados, o JDBC.
O JDBC possui uma srie de Interfaces, que so classes denominadas interfaces que contm
as declaraes de construtores, atributos e mtodos representando regras/padres a serem
implementadas.
Em vias de fato, supondo que a fabricante do SGBD chamado Tatu Database quisesse que seu
SGBD fosse acessado pela linguagem de programao Java, ento este simplesmente deve seguir
os padres do JDBC, implementando conforme as configurao de seu SGBD, mas seguindo os
padres e nomenclaturas do JDBC.
Mas qual a grande vantagem do modelo JDBC?

11

UNIDADE I ESTRUTURA DA API JAVA - JDBC


Simples e fcil o entendimento. Imagine que sua empresa tem um sistema em Java que acessa
ao SGBD Oracle, e que devido a troca de SGBD seja necessrio adaptar todo o sistema ao novo
SGBD, por exemplo, ao Tatu Database. A soluo simplesmente: basta trocar as bibliotecas
de acesso ao Oracle para as bibliotecas de acesso ao Tatu, pois o cdigo em si permanecer
o mesmo.
Figura 2. Estrutura JDBC.

Fonte: <http://docstore.mik.ua/orelly/java-ent/servlet/figs/jsp_0902.gif>

A figura acima representa a estrutura JDBC, onde possvel observar que independentemente
se o acesso for realizado para a plataforma Oracle, Microsoft, Sybase, ou qualquer outro SGBD, a
estrutura de classes a mesma. Nesta estrutura, uma das poucas classes que implementada a
DriverManager, que responsvel por identificar qual o conjunto de bibliotecas a ser utilizada: se o
OracleDriver, JDBC-ODBC Driver, SybaseDriver, e assim por diante.
A biblioteca OracleDriver foi produzida pela Oracle, seguindo o conjunto de interfaces criada pela
Sun, assim com o SybaseDriver foi criada pela Sybase, e assim como o JDBC-ODBC Brigde criada
para permitir a comunicao entre Drivers Java e Microsoft. Caso a nossa empresa exemplo, a
Tatu desenvolva um conjunto de Bibliotecas, ento desenvolveria a TatuDriver, para acesso ao
Tatu Database.
Conhea um pouco mais sobre os 4 tipos de JDBC disponveis:
<http://pt.wikipedia.org/wiki/JDBC>

12

ESTRUTURA DA API JAVA - JDBC

UNIDADE I

JDBC: a estrutura
O Java Database Connectivity, como citado anteriormente, uma API (Aplication Programming
Interface), ou seja, um conjunto de padres (interfaces) criados nos primordios do Java.
Interface, um contrato entre a classe e o mundo externo. Quando uma classe implementa uma
interface, ela est comprometida a fornecer o comportamento publicado pela interface..

Na estrutura JDBC, como visualizada na figura 2, possui um conjunto de interfaces e


poucas classes de implementao.
Abaixo so descritas as principais interfaces e a classe principal que rege da a escolha do driver.
Figura 3. Estrutura JDBC.

Fonte: Autor

As classes para manipulao de banco de dados esto no pacote java.sql. Para estabelecer uma
conexo com um SGBDR preciso solicitar do gerenciador de drivers (java.sql.DriverManager) a
abertura da conexo. Se o DriverManager conseguir estabelecer a conexo com o SGBD um objeto
do tipo java.sql.Connection retornado, caso contrrio uma exceo gerada
O DriverManager responsvel por encontrar o driver que ser utilizado na aplicao. Quando
uma implementao (driver) carregada ela registrada utilizando o DriverManager. A partir do
DriverManager sero criadas as conexes para a base de dados utilizando o mtodo getConnection
e passando a JDBC URL para a conexo, conforme veremos mais adiante.
A figura abaixo demonstra qual o papel do DriverManager:
Figura 4. Papel do DriverManager.

Fonte: Autor

13

UNIDADE I ESTRUTURA DA API JAVA - JDBC


A estrutura JDBC pode ser visualizada no arquivo rt.jar, contido no pacote JDK do Java. Dentro do
arquivo rt.jar, possvel encontrar todas as interfaces e classes, tal como abaixo:
Figura 5. Classes e Interfaces do arquivo rt.jar.

Fonte: Autor

14

captulo 2
JDBC: classes, mtodos e padres
Desenvolver sistemas com acesso a banco de dados tem alguns passos em comum, independente da
linguagem de programao. Para melhor entender esses passos, basta realizarmos analogia com o
processo de um telefonema.
Para realizar um telefonema necessrio, primeiramente, se ter o nmero do destinatrio. Logo
aps, a partir de um aparelho telefnico, discar a este nmero. Uma vez discado e o destinatrio
presente, ento cria-se a conexo e posteriormente a comunicao. E ao final, desligada a conexo,
encerrando-se o processo.
No processo de comunicao entre uma linguagem de programao e um banco de dados, o processo
o mesmo:
1. necessrio ter o nmero do banco de dados destinatrio, considerando o
endereo de IP (Internet Protocol) como endereo fsico, e a porta, como endereo
lgico.
2. Uma vez o banco de dados disponvel, ento estabelecida a conexo, abrindo um
canal de comunicao.
3. A partir da conexo, possvel enviar comandos de converso entre a linguagem de
programao e o banco de dados. O meio de comunicao universalmente utilizado
e padronizado a linguagem SQL (Structured Query Language).
4. Ao final, desligada a conexo, encerrando-se o processo.
Outra etapa do processo que necessria ter sempre codificada a etapa relacionada a captura de
quaisquer problemas que possam ocorrer, os chamados tratamentos de erros. uma etapa essencial
pois podem ocorrer problemas na conexo, erros de comunicao, tais como numa telefonema,
com a diferena que em um telefonema existe a ao direta do usurio, e na programao o prprio
programa deve prever as diversas situaes.
A seguir descrito um exemplo da comunicao de Java com o banco de dados. Pode-se observar que
os passos so exatamente os mesmos descritos acima e que independente da ao a ser realizada, se
Insero, Consulta, Atualizao ou Excluso, este processo ser o mesmo.

15

UNIDADE I ESTRUTURA DA API JAVA - JDBC


public class ConexaoBancoDados {
public static void main(String args[]) {
try {
Class.forName(oracle.jdbc.driver.OracleDriver);//registra o driver
Connection conn = DriverManager.getConnection(jdbc:oracle:thin:
@192.168.60.15:1521:ORCL,OPS$RM99999, senha);//abre a conexao
System.out.println(Conectado!); //realiza a comunicao com SQL
conn.close();//fecha a conexao
}catch(ClassNotFoundException e) { // Tratamento dos erros
System.err.println(O Driver JDBC nao foi encontrado: +
e.getMessage());
}catch(SQLException e) {
System.out.println(Nao foi possivel conectar com o SGBDR);
System.err.println(e.getMessage());
}
}
}
Ao observarmos que existem padres, necessrio evitar o famoso copy & paste de cdigo e
utilizarmos o processo de reutilizao. Portanto, vivel e interessante a utilizao dos conceitos de
Orientao a Objetos. Por exemplo, possvel:
Criar uma classe esttica somente para tratar a conexo.
Utilizar padres de desenvolvimento, tal como o padro Abstract Factory (que voc
ver mais a frente neste material)
Fazer uso de Generics, criando classes de acesso a dados genricas.
Utilizar frameworks de Mapeamento de Objetos com Banco de Dados Relacional,
tal como JPA/Hibernate (que voc ver mais a frente neste material).

16

ESTRUTURA DA API JAVA - JDBC

UNIDADE I

Abaixo seguem dois exemplos. O primeiro de criao de uma nica classe esttica para tratar a
conexo, e o segundo um exemplo de classe de acesso a dados genricas. Ambas promovem
reutilizao de cdigo e tambm otimizao de processamento.
public class DBManager {

public static Connection obterConexaoMySQL() throws Exception {

Class.forName(com.mysql.jdbc.Driver);
return DriverManager

.getConnection(jdbc:mysql://localhost:3306/bd,root,root); }
}
}
public abstract class GenericDAO <T> {


static EntityManagerFactory factory = null;


private Class<T> classe;
static {

factory =
Persistence.createEntityManagerFactory(cadastro_PU);

public T localizar(int id) {

EntityManager em = factory.createEntityManager();

EntityTransaction t = em.getTransaction();

T obj = null;

try {
t.begin();

obj = em.find(classe, id);

t.commit();

} catch (Exception e) {
e.printStackTrace();
if (t.isActive()) t.rollback();
} finally {

em.close();
}
return obj;
}

17

PROGRAMAO JAVA
COM JDBC

Unidade iI

captulo 1
CONNECTION, STATEMENT, PREPARED
STATEMENT, RESULT SET, INSERT, DELETE,
UPDATE, SELECT
Neste captulo voc conhecer a estrutura completa do JDBC, desde a conexo, passando pela
comunicao, tratamentos, e realizando o CRUD (Create, Retrieve, Update, Delete).
Para desenvolvimento do JDBC neste material, possvel utilizar qualquer verso do Java (acima
do JDK 1.4), qualquer verso do Eclipse e qualquer SGBD, neste material ser utilizado o MySQL.
Lembre-se que o Java pode at ser desenvolvido em ferramentas de texto, e compilado e executado
via linha de comandos, ento sinta-se a vontade para escolher a forma de desenvolvimento.
Dando inicio ao JDBC na prtica.
Como visto anteriormente, o JDBC possui diversas interfaces e classes. Uma vez sabendo o banco de
dados de acesso, a primeira atitude realizar o download do driver que contm a implementao,
para posteriormente adicionar ao projeto. Abaixo voc encontrar um passo a passo que trar
exemplo de onde realizar os respectivos downloads.
Antes de efetuar o exemplo, vamos entender um pouco cada parte do processo de desenvolvimento.

O que DriverManager?
a classe gerente do JDBC. Ela l e estabelece qual driver de conexo ser usado. Funciona como
ponte entre o JDBC e o driver escolhido.
Isso feito atravs de uma chamada ao mtodo Class.forName (localizao do driver),
passando como parmetro a classe (e seu pacote) principal da biblioteca do driver. Esta informao
deve ser obtida diretamente do site do fabricante e documentos informativos.
Nas verses atuais do Java no necessrio mais realizar este processo, pois a partir da String de
conexo a prpria JVM j reconhece qual o driver a ser acessado.

18

PROGRAMAO JAVA COM JDBC

UNIDADE II

O Class.forName tem a mesma funcionalidade da instanciao de uma classe, ou


seja, uma comando new, com a diferena que o Class.forName gera o objeto em
memria e no associa a nenhuma varivel de referncia.

Connection
Aps o registro do driver deve-se inicializar a varivel que representa a conexo propriamente dita.
Isso feito atravs de uma chamada ao mtodo getConnection da classe DriverManager, passando
como parmetro a URL de conexo, URL esta estabelecida tambm pelo fabricante do SGBD, mas
seguindo o padro JDBC.
Exemplo: DriverManager.getConnection(URL)
onde a URL segue o padro textual jdbc: <subprotocolo>:<driver>
Para acessar o Oracle, escreve-se:
jdbc:oracle:thin:@192.168.60.15:1521:ORCL
Para acessar o MySQL, escreve-se:
jdbc:mysql://localhost:3306/estatistica
Para acessar um driver ODBC, escreve-se:
jdbc:odbc:nomeODBC

Comunicao via SQL


Para a comunicao efetiva entre o Java e o Banco de Dados, utiliza-se a linguagem estrutura SQL.
Existem 3 implementaes que podem ser utilizadas via Java, so elas: Statement, PreparedStatement
e CallableStatement. Os principais mtodos destas implementaes so:
executeUpdate: Executa um comando SQL(INSERT, UPDATE, DELETE) e
retorna o nmeros de linhas afetadas.
executeQuery: Executa um comando SQL(SELECT) e retorna o(s) resultado(s)
num objeto do tipo ResultSet
Exemplos:
Incluso:
Statement stmt = conn.createStatement();

19

UNIDADE II PROGRAMAO JAVA COM JDBC


stmt.executeUpdate(INSERT

INTO

TB_CLIENTE(ID_CLIENTE,

NOME, CPF) values (SQ_CLIENTE.NEXTVAL, Felix, 0123547 8222));


Alterao:
Statement stmt = conn.createStatement();
stmt.executeUpdate(UPDATE TB_CLIENTE SET DDD = 11 WHERE
DDD is null);
Excluso:
Statement stmt = conn.createStatement();
stmt.executeUpdate(DELETE FROM TB_CLIENTE WHERE NOME =
Felix);
Seleo:
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(SELECT * FROM TB_CLIE NTE);
Para melhor aproveitamento de cada implementao em suas respectivas otimizaes, afirma-se:
Statement: Usado para passagem de declaraes SQL simples.
(SELECT * FROM votacao)
Prepared Statement: Usado quando a declarao SQL tiver um ou mais parmetros que podem ser
enviados em conjunto.
(SELECT * FROM votacao WHERE total_votos > ?)
Callable Statement: Usado para execuo de funes do tipo Stored Procedures declaradas em
alguns tipos de bancos.
CallableStatement cstmt = conn.prepareCall({ call proc2 });

ResultSet
A classe ResultSet responsvel pelo tratamento dos dados retornados do banco de dados, a partir de
uma declarao SELECT. Representa um conjunto de registros que retornam de uma SQL (SELECT).
Os registros s podem ser acessados sequencialmente - cada chamada ao mtodo next move o
cursor para o prximo registro. Inicialmente o cursor est posicionado antes do primeiro registro.
O mtodo next retorna true se for capaz de posicionar na prxima linha. As colunas do registro
podem ser acessadas atravs de um ndice inteiro onde 1 o nmero da primeira coluna ou
atravs do nome da coluna.

20

PROGRAMAO JAVA COM JDBC

UNIDADE II

Principais mtodos:
next: Move o cursor para a prxima linha
getInt: Retorna o dados da coluna designada como um int do Java
getString: Retorna o dados da coluna designada como uma String do Java
getBoolean: Retorna o dados da coluna designada como um boolean do Java
getDouble: Retorna o dados da coluna designada como um double do Java
Exemplo

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(SELECT * FROM tb_cliente);


System.out.println(Registros:);

while (rs.next()) {//enquanto houver registro...


//pega o valor da coluna e coloca numa variavel

Integer id = rs.getInt(ID_CLIENTE);
String nome = rs.getString(Nome);

Boolean ativo = rs.getBoolean(Ativo);


Double valorUltimaCompra =

rs.getDouble(Valor_Ultima_Compra);

//exibe o registro

System.out.println(\t[ + id + , + nome + , +

ativo + , + valorUltimaCompra + ]);


}

Metadados do banco de dados


Pesquise sobre as interfaces DatabaseMetaData e ResultSetMetaData. Elas
permitem obter informaes do banco de dados e de suas respectivas tabelas.
possvel obter, por exemplo: o nmero total de colunas, nomes e tipos de dados das
colunas de uma determinada tabela, etc.

21

UNIDADE II PROGRAMAO JAVA COM JDBC

Primeiro exemplo agora sim!


Download do MySQL
Para realizar o download do MySQL, acesse http://dev.mysql.com/downloads/, escolha a verso de
seu desejo. O MySQL possui a verso Server (principal) e a verso Workbench. Faa o download e
ambos, e acesso normalmente, tal como qualquer outro banco de dados.

Criao das Tabelas


Para este primeiro exemplo iremos criar um modelo bem simples de sistema, que armazena e
consulta dados estatsticos contendo o questionrio e o leque de resposta para cada questo. Para
tanto, pede-se criar a seguinte estrutura de tabelas:
TB_QUESTAO { id_questao integer PK auto,

descricao varchar(100)

TB_RESPOSTA { id_resposta integer PK auto,


id_questao FK integer,

descricao_resposta varchar (100)

Antes de partir para o prximo passo do material, brinque dentro do MySQL ou do


seu SGBD de escolha. Realize comandos de INSERT, UPDATE, DELETE e SELECT.

Criao do Projeto Java


A partir do Eclipse, crie um novo projeto como Java Project.
Figura 6. Criao do Projeto Java.

Fonte: Autor

22

PROGRAMAO JAVA COM JDBC

UNIDADE II

Criao da classe de Conexo ao Banco de Dados


Figura 7. Classe de Conexo ao Banco de Dados.

Fonte: Autor

Note que foi utilizada a URL de conexao para o MySQL, onde e passada a localizacao do MySQL
(host), porta de conexao e nome do banco de dados, alm do usurio e senha. Neste modelo
tambm foi criada a classe com o mtodo esttico, j dentro dos padres de desenvolvimento, alm
de possuir os tratamentos de erros adequados.

Criao dos JavaBeans mapeados com as tabelas


Figura 8. Classe de JavaBean: Questao.java.

Fonte: Autor

23

UNIDADE II PROGRAMAO JAVA COM JDBC


Figura 9. Classe de JavaBean: Resposta.java.

Fonte: Autor

Observe que a criao destas classes de suma importncia, visto que elas fazem analogia total com
as tabelas, o que facilita o processo de passagem de dados do banco de dados para os objetos do Java
e vice-versa.

Criao da classe de acesso aos dados


Esta a classe principal a ser criada, que contm o cdigo principal de acesso aos dados e j est
seguindo o padro PatternDAO de desenvolvimento.
Figura 10. Classe EstatisticaDAO: estrutura.

Fonte: Autor

24

PROGRAMAO JAVA COM JDBC

UNIDADE II

Primeiramente, voc deve criar a classe com a estrutura de imports das interfaces do JDBC, e
tambm com as demais classes do projeto a serem utilizadas.Esta classe devo possuir tambm as
implementaes especificas para o MySQL, e os mtodos CRUD, conforme segue:
Figura 11. Classe EstatisticaDAO: mtodo de incluso.

Fonte: Autor

Note no cdigo acima que o mtodo criarQuestao recebe o objeto do tipo Questao, que j vir
totalmente preenchido com a questo a ser inserida e tambm todas as possveis respostas.
Note tambm que ocorre um processo transacional, onde inicialmente inserida a questo,
posteriormente obtido o ID gerado automaticamente pelo banco de dados, e por ltimo inseridas as
respostas referentes aquela questo.
O mtodo a seguir o mtodo que lista todas as questo do banco de dados, inclusive com as
respostas de cada questo. Observe que durante a leitura de cada questo, acionado o mtodo
obterRespostas, que seleciona todas as respostas referente a questo em leitura.

25

UNIDADE II PROGRAMAO JAVA COM JDBC


Figura 12. Classe EstatisticaDAO: mtodo de consulta.

Fonte: Autor

26

PROGRAMAO JAVA COM JDBC

UNIDADE II

E para finalizar esta classe, segue abaixo um mtodo que excluir todas as questes e suas respectivas
respostas.
Figura 13. Classe EstatisticaDAO: mtodo de excluso.

Fonte: Autor

Criao da classe de negcios


Figura 14. Classe EstatisticaBO: classe de negcios.

Fonte: Autor

27

UNIDADE II PROGRAMAO JAVA COM JDBC


A criao de classes de negcios essencial no mundo corporativo, pois favorece que diversas
camadas de negcios se associem entre si. Seguindo este modelo, segue abaixo a classe de negcios,
onde possvel inserir quaisquer regras especficas de negcio.

Criao da classe de Teste


Figura 15. Classe de Teste

Fonte: Autor

Note na criao da classe acima que o objetivo simular a criao de questes e respostas, testando
o funcionamento da estrutura JDBC criada.

28

PROGRAMAO JAVA COM JDBC

UNIDADE II

Vinculao da biblioteca (driver) ao projeto


O ltimo passo antes da execuo do teste a configurao da biblioteca do DriverMySQL junto
ao projeto.
Para isso necessrio realizar o download do driver atravs do link: https://www.mysql.com/
products/connector/. Observe que a Oracle (detentora do MySQL) disponibiliza diversos conectores
a diversas linguagens de programao. No nosso caso, basta efetuar o download para Java.
Copie o arquivo com extenso JAR e cole diretamente no projeto, conforme figura abaixo:
Figura 17. Estrutura do projeto.

Fonte: Autor

Clique com o boto direito no driver e adicione ao classpath do projeto, para que durante a execuo
seja registrado o driver.
Figura 18. Configurar classpath.

Fonte: Autor

Realizar o teste final


Reta final! Vamos testar!
Antes de testar, tenha certeza que o banco de dados esteja criado e que os dados de usurio e senha
estejam tambm alinhados. Feito isso, a partir da classe de Testes, executa como Java Application.

29

UNIDADE II PROGRAMAO JAVA COM JDBC


Figura 19. Teste.

Fonte: Autor

Pronto! Seu primeiro projeto JDBC foi executado! O JDBC no to complicado o


quanto se imagina. Mas um pouco trabalhoso, pois alm de programar em Java
necessrio tambm utilizar a linguagem SQL. Ainda muitos dos sistemas criados e
j existentes utilizam essa estrutura de JAVA + SQL. Mas ser que existem processos
mais otimizados, tal como JPA/Hibernate? Os chamados MOR (Mapeamento ObjetoRelacional) so essenciais para maior produtividade.

30

captulo 2
Controle Transacional
Toda comunicao com banco de dados requer cuidados com acessos paralelos e integridade dos
dados. Para isso, todo SGBD e toda linguagem de programao contm tratamento especfico para
permitir a segurana e integridade dos dados. No JDBC no diferente.

O que TRANSAO ?
uma unidade que preserva a consistncia no banco de dados.
Transaes so unidades atmicas de operaes:
Em cincia da computao, uma transao atmica uma operao, ou
conjunto de operaes, em uma base de dados, ou em qualquer outro sistema
computacional, que deve ser executada completamente em caso de sucesso,
ou ser abortada completamente em caso de erro.
Figura 20. Processo transacional.

Fonte: Autor

O exemplo clssico para a necessidade de uma transao atmica aquele da transferncia entre
duas contas bancrias. No momento de uma transferncia de valores de uma conta A para uma
conta B, que envolve pelo menos uma operao de ajuste no saldo para cada conta, se o computador
responsvel pela operao desligado por falta de energia, esperado que o saldo de ambas as contas
no tenha se alterado. Neste caso so utilizados sistemas que suportam transaes atmicas.
Figura 21. Exemplo de Transao Atmica.

Fonte: Autor

31

UNIDADE II PROGRAMAO JAVA COM JDBC


Uma transao pode ser representada pela sigla ACID:
Atomicity (Atomicidade): atmico, tudo (commit) ou nada (rollback)
Consistency (Consistncia): toda transao executada deve seguir as regras de
integridade do banco de dados, mantendo o banco de dados consistente.
Isolation (Isolamento): transaes executadas de forma isolada.
Ex: transao A altera o saldo da conta B

transao B altera o saldo da conta B

Durability (Durabilidade): as alteraes efetuadas pelas transaes so


permanentes, mesmo em caso de falhas.
As operaes possveis para o controle transacional, so: COMMIT ou ROLLBACK
COMMIT: Todas operaes envolvidas em uma unidade de processo executam com sucesso;
ROLLBACK: Uma ou mais operaes envolvidas em uma unidade de processo no executam
corretamente;
Por padro, toda conexo com JDBC est com AutoCommit igual a true, ou seja, qualquer
comando SQL enviado um comando executado no banco de dados;
Para desabilitar, aps obter uma instncia de Connection, utilize o mtodo: connection.
setAutoCommit(false);
Exemplo:
try {

con.setAutoCommit(false);

PreparedStatement updateSales = con.prepareStatement(

UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ?);

updateSales.setInt(1, 50);

updateSales.setString(2, Colombian);
updateSales.executeUpdate();

PreparedStatement updateTotal = con.prepareStatement(

UPDATE COFFEES SET TOTAL = TOTAL + ? WHERE COF_NAME LIKE ?);

updateTotal.setInt(1, 50);

updateTotal.setString(2, Colombian);
updateTotal.executeUpdate();

con.commit();

con.setAutoCommit(true);

} catch(Exception e){
}

32

con.rollback();

PROGRAMAO JAVA COM JDBC

UNIDADE II

No exemplo acima possvel observar que o controle manual foi ativado logo no inicio (con.
setAutoCommit(false)). Com isso, todo e qualquer comando de atualizao, incluso e excluo
de dados s ser efetivado caso o comando COMMIT seja efetuado, tal como realizado ao final
do processo. Assim sendo, ambas instrues UPDATEs do exemplo s sero efetivadas caso no
ocorram erros.
possvel observar tambm que caso algum erro ocorra, toda a transao desfeita, atravs do
comando ROLLBACK.
Ao final do processo o controle manual desativado, atravs do comando con.setAutoCommit(true)
tornando o processo novamente automtico.
importante sempre fechar a conexo aps o uso.
Os objetos de manipulao de dados tambm devem ser fechados (Statement,
Prepared Statement).
OBS: A maior parte dos problemas de performance e consumo de recursos do
servidores tem relao com gerenciamento de conexes. Ao contrrio do que se
pensa muito frequente a abertura e no fechamento da conexo.
Atente-se sempre neste problema, pois uma m programao pode causar danos
enormes nos sistemas das corporaes.
Para complementar o estudo de Controle Transacional, vale a pena assistir ao vdeo
em: <http://www.youtube.com/watch?v=g6NRJH1IFqs>

33

captulo 3
Design Pattern
A programao exige um nvel de excelncia no cdigo, evitando retrabalhos e adaptaes mais
rpidos, devido a grande velocidade que os modelos de negcios exigem.
Com o objetivo desta otimizao e da universalidade da programao, padres de desenvolvimento
so essenciais. Desta maneira, um cdigo desenvolvido nos Estados Unidos podem ser reconhecidos
facilmente no Brasil, na Frana, na China, ou seja, em qualquer lugar do mundo.
Para o JDBC no diferente. Constantes mudanas de SGBDs nas empresas provocam grandes
alteraes estruturais e tambm de programao. Uma vez padronizados, estes trabalhos se tornam
menores ou inexistentes.
Alguns padres so essenciais, tais como o padro Singleton, TO, PatternDAO, FactoryMethod e
AbstractFactory, entre outros, descritos na sequncia.
Um Design Pattern (padrao de projeto, padrao arquitetural) e uma solucao comum para um problema
comum encontrado no desenvolvimento de software. Nao esta vinculado a nenhuma linguagem OO
especifica. A sedimentacao deste conceito veio com o lancamento do livro: Design Patterns: Elements
of Reusable Object-Oriented Software.
A utilizacao destes padroes usualmente implica em algumas vantagens:
Facilidade de comunicacao - Os padroes possuem nomes, os quais resumem uma
solucao que deve ser de conhecimento comum entre equipes de desenvolvimento.
Credibilidade - A implementacao estara utilizando solucoes amplamente testadas
e aprovadas.
Facilidade de manutencao - Padroes tendem a reduzir o acoplamento entre
componentes, o que implica num sistema de facil manutencao.
Importante: a utilizao de Design Pattern nao implica em codigos mais enxutos, mas sim na
otimizao do cdigo.

Data Access Object (DAO)


Este Pattern abstrai e encapsula todos os acessos a base de dados. O DAO gerencia a conexao com
a fonte de dados para obter e armazenar os dados. Varios niveis de flexibilidade/complexidade
diferentes podem ser aplicados em um projeto. A ideia basica e separar totalmente o mecanismo de
acesso a dados do resto da aplicacao.

34

PROGRAMAO JAVA COM JDBC

UNIDADE II

Assim, cria-se um objeto DAO para cada uma das entidades do projeto encapsulando nele os
metodos de manipulacao dos dados CRUD (Create, Read, Updade e Delete), conforme figura
abaixo estrutura 1:
Figura 22: Pattern DAO estrutura 1.

Fonte: <http://www.oracle.com/technetwork/java/dataaccessobject-138824.html>

Abaixo um exemplo a partir de um sistema de biblioteca. A classe LivroDAO simplesmente centraliza


todos os mtodos de acesso a dados.


A classe de negcios exemplifica como feito o acesso a classe DAO centralizadora, ou seja, o acesso
feito a partir de uma simples instanciao.

35

UNIDADE II PROGRAMAO JAVA COM JDBC


Outra estrutura e mais completa no quesito Orientao a Objetos a estrutura com a incluso
de interfaces. Como pode ser observado, o uso de interface estabelece um padro para a DAO,
permitindo que implementaes distintas possam ser realizadas.
Figura 23: Pattern DAO estrutura 2.

Fonte: <http://www.oracle.com/technetwork/java/dataaccessobject-138824.html>

Abaixo um exemplo a partir de um sistema de biblioteca. A classe LivroDAO simplesmente centraliza


todos os mtodos de acesso a dados.

36

PROGRAMAO JAVA COM JDBC

UNIDADE II

DAO Factory
Este Pattern utilizado quando o repositorio de dados nao esta sujeito a mudancas frequentes.
Trata-se de uma fabrica de DAOs para um tipo especifico de repositorio de dados.
Cenario de exemplo: Determinada instituicao utiliza somente banco de dados MySQL e nao existe
previsao de mudanca. Nao e conveniente criar uma estrutura complexa, somente pela possibilidade
de suportar diversos tipos de banco de dados, tendo em vista que nao ha previsao de mudanca do atual
Figura 24: DAO Factory.

Fonte: <http://www.oracle.com/technetwork/java/dataaccessobject-138824.html>

Abaixo segue um exemplo de implementao. Note que no sistema de biblioteca agora temos duas
DAOs: CategoriaDAO e LivroDAO, com suas respectivas implementaes. A grande sacada no
modelo DAOFactory que a distribuio de todas as DAO est centralizada em um nica classe
abstrata com mtodos estticos, do qual chamamos no exemplo de DAOFactory (Fbrica de DAO).
Para utilizar a DAOFactory basta acessar estaticamente o mtodo do qual se deseja obter o objeto
de acesso.

37

UNIDADE II PROGRAMAO JAVA COM JDBC

Abstract Factory
Ao contrario do DAO Factory este padrao e usado quando o repositorio de dados esta sujeito a
mudancas frequentes. Permite criar implementacoes de fabricas diferentes que criam DAOs para
diferentes repositorios de dados.
Cenarios de exemplo:
Determina instituicao utiliza banco de dados Oracle e SQL Server e ja esta em processo
de compra o banco de dados DB2 para suportar um determinado pacote comprado.
Neste cenario e justificada a criacao de uma estrutura para suportar os diversos tipos
de banco existentes e principalmente estar preparado para suportar novos tipos.
Determinado software e capaz de persistir os dados tanto num SGBDR corporativo
como em arquivos do tipo XML, localizados no computador local. Neste cenario e
justificada a criacao de uma estrutura para suportar os diferentes tipos de repositorios
de dados.
Figura 25: Abstract Factory.

Fonte: Autor

Abaixo segue um exemplo de implementao. Note que no sistema de biblioteca continuamos a ter
duas DAOs, a CategoriaDAO e a LivroDAO. Mas note que a LivroDAO possui duas implementaes,
um implementao via MySQL e outra via XML, mas ambas seguindo a mesma estrutura da interface
LivroDAO. O padro Abstract Factory facilita o manuseio quando trabalha com mais de um meio
de armazenamento, por isso a centralizao neste padro se d na distribuio das fbricas, atravs
da classe DAOFactory.
Para utilizar a DAOFactory basta acessar estaticamente o mtodo do qual se deseja obter o objeto
de acesso.

38

PROGRAMAO JAVA COM JDBC

UNIDADE II

39

UNIDADE II PROGRAMAO JAVA COM JDBC


Resume-se que a diferena entre os 3 padres explicados anteriormente da seguinte
maneira:
PatternDAO: centraliza-se o acesso aos dados por categoria.
DAOFactory: centraliza-se a distribuio dos DAOs
AbstractFactory: centraliza-se a distribuio da fbrica de DAOs

Singleton
O objetivo e gerar SOMENTE UMA instancia da classe. Essa classe deve possuir:
Apenas uma instancia da classe Um unico construtor privado Um metodo que
retorne a instancia da classe
Figura 26: Padro Singleton.

Fonte: Autor

Abaixo segue um exemplo de implementao. A classe ConnectionManager uma classe normal,


mas que possui uma varivel privada e esttica que referencia ela mesma, alm de possui um
construtor padro privado. Estas duas caractersticas remetem que somente a prpria classe pode
gerar objetos a partir dela, ou seja, o controle da gerao de seus objetos (suas instncias) est sob
o poder da prpria classe.
Este controle efetuado a partir do mtodo esttico getInstance, do qual valida se existe somente
uma instncia do objeto em memria. Caso o objeto j exista, ento o objetivo utilizar este objeto.
Caso no exista, ento um novo objeto criado e referenciado. Esta lgica permite que somente um
objeto em memria esteja ativo, otimizando espao de memria e tambm processamento.

40

PROGRAMAO JAVA COM JDBC

UNIDADE II

Este controle efetuado a partir do mtodo esttico getInstance, do qual valida se. Note na figura
anterior que para utilizar este padro, necessrio acessar o mtodo esttico getInstance, pois no
possvel gerar (ou utilizar) objetos desta classe desta outra maneira, garantindo a otimizao do
processo.

41

JAVA COM JPA/


HIBERNATE

Unidade iII

captulo 1
Estrutura JPA e HANDS ON
Neste captulo voc conhecer sobre a estrutura de Mapeamento Objeto-Relacional (MOR). O
MOR tem o objetivo de melhorar a produtividade e tambm o processamento no que tange a
relao entre objetos (da Orientao a Objetos) e tabelas (de Banco de Dados Relacional),
conforme ilustrado na figura abaixo. Nesta analogia, cada Classe mapeada para cada Tabela,
cada atributo da Classe mapeado com cada coluna da Tabela e cada objeto gerado pela Classe
associado um registro da Tabela.
Figura 27: Mapeamento Objeto-Relacional (MOR).

Fonte: Autor

Como pode ser observado nos captulos anteriores, altamente necessria a analogia entre classes
e tabelas, apesar da formas diferentes de implementao, onde as tabelas se comunicam via chaves
estrangeiras, enquanto as classes de comunicam entre as referncias das classes.
Na programao via JDBC, este processo de manipulao de dados das tabelas para as classes e
vice-versa se torna bastante manual e requer bastante programao, o que onera a produtividade
to necessria ao mercado de desenvolvimento.
Com o objetivo de melhorar a otimizao de tempo e tambm a melhora no consumo de
processamento, alguns modelos surgiram, tal como Hibernate, iBatis, JDO, entre outros. O grande
objetivo destes modelos o de retirar toda a linguagem SQL do Java e centraliz-la em outro local.

42

JAVA COM JPA/HIBERNATE

UNIDADE III

O antigo framework iBatis, hoje convertido para MyBatis, por exemplo, permite que todo o cdigo
SQL seja implementado em arquivos XML ou ainda atravs de Anotaes (veja mais em http://
pt.wikipedia.org/wiki/Annotation_(java)). Desta forma, o programa de acesso a dados passa a
conter somente cdigo em Java e que fica diretamente mapeado a seus respectivos acessos agora
centralizados.
J o Hibernate Framework, certamente o mais utilizado pelos desenvolvedores, surgiu com o
propsito de realizar o mapeamento efetivo entre classes e tabelas j diretamente na programao.
Em suas primeiras verses eram utilizados arquivos XML para cada relao classe-tabela,
realizando um processo de de-para, onde sintetizado que a classe X possui relao com a tabela
X, e que o atributo Y da classe X, possui relao com a coluna Y da tabela X, e assim sussecivamente.
Este processo permitiu que as caractersticas maiores de Banco de Dados Relacional, tais como
associaes, chaves primrias e secundrias, sequence, mapeamentos relacionais (um-para-um,
um-para-muitos, muitos-para-um e muitos-para-muitos), passassem a ser realizados em XML.
No exemplo abaixo possvel perceber o quanto o XML relacionava classes de tabelas.
Figura 28: Hibernate via XML.

Fonte: Autor

J em suas verses seguintes, o Hibernate passou a utilizar Anotaes, ou seja, uma meta-programao
(programao dentro da programao), eliminando assim a necessidade de se trabalhar com tantos
arquivos XML. Desta maneira, o que j era bom ficou ainda melhor, conforme exemplo abaixo:

43

UNIDADE III JAVA COM JPA/HIBERNATE


Note que as Anotaes @Entity, @Table, @Id, @GeneratedValue, @Column e @OneToMany,
permitem que o mapeamento seja realizado e que configuraes usuais de banco de dados sejam
efetivados a partir da prpria classe.

Estrutura JPA
Mas de fato, o que o JPA? o mesmo que MOR? o mesmo que Hibernate? Para todas as questes
a resposta NO.
O JPA (Java Persistence API) nada mais do que uma especificao que padroniza o mecanismo
de persistncia MOR e pode ser implementada por diversos fabricantes de MOR. O Hibernate, por
exemplo, uma implementao de JPA. Outra implementao bastante utilizada no mercado o
EclipseLink.
Com a estrutura JPA, as implementaes se tornam padronizadas, evitando que o programador
tenha que alterar cdigo caso o framework seja alterado. Mas para que isso de fato ocorra,
importante que a programao seja feita pelos comandos JPA.
Quando citado em comandos JPA, significa a utilizao de mtodos da API e da linguagem de
consulta especfica chamada JP-QL (Java Persistence Query Language). Isso mesmo! Ao invs
de utilizar o SQL universal, utilizada uma extenso javanesa do SQL, permitindo que queries
complexas sejam desenvolvidas a partir do prprio Java.
O JPA contm a seguinte estrutura:
Entity Manager: Unidade central para gerenciamento de entidades na JPA atravs
de uma API padronizada. Responsvel pela criao, atualizao, remoo e consulta
s entidades (CRUD), pelo controle de transaes e pelo gerenciamento de cache.
Unidade de Persistncia: conjunto fixo de classes mapeadas para o banco de
dados e registradas no arquivo persistence.xml.
Contexto de Persistncia: conjunto de instncias de entidades gerenciadas de
um Entity Manager;
Entidade Gerenciadas: quando entidades esto associadas a um contexto de
persistncia. As alteraes no estado das entidades so sincronizadas com o banco
de dados. Ao fechar um contexto de persistncia, todas suas instncias de entidades
associadas tornam-se no gerenciadas;
Entidade No Gerenciadas: entidades no associadas a um contexto de
persistncia (por exemplo quando so instanciadas). As alteraes nas entidades
no se refletem no banco de dados.
Estados da entidade, que pode ser compreendido pela figura a seguir:
new: instncia da entidade criada em memria mas no associada a um contexto
de persistncia e no possui id equivalente no banco de dados;

44

JAVA COM JPA/HIBERNATE

UNIDADE III

managed: tem um id no banco de dados e est associada a um contexto de


persistncia;
detached: tem um id no bando de dados mas no est associada ao contexto de
persistncia;
removed: instncia da entidade associada a um contexto de persistncia mas est
programada para ser removida do banco de dados.
Figura 29: Diagrama de Estados Entidade.

Fonte: Autor

HANDS ON com implementao HIBERNATE


O JPA possui diversas implementaes, dentre as quais a mais utilizada o Hibernate. Como toda
grande estrutura, o JPA/Hibernate possui vantagens e desvantagens, so elas:
Vantagens:
Contempla modelo natural de programao OO;
Acelerao do desenvolvimento (poupa trabalho manual de converso de dados
relacionais para objetos);
Transparncia de banco de dados;
Performance (cache);
Simplicidade;
Compatibilidade com os principais bancos de dados de mercado
Desvantagens:
No a melhor opo para todos os tipos de aplicao. Sistemas que fazem uso
extensivo de stored procedures, triggers ou que implementam a maior parte da

45

UNIDADE III JAVA COM JPA/HIBERNATE


lgica de negcio no banco de dados (modelo pobre) no vai se beneficiar com o
uso do Hibernate. Ele indicado para sistemas que contam com um modelo rico,
onde a maior parte da lgica de negcios fica na prpria aplicao dependendo
pouco de funes especficas do banco de dados;
Consultas muito complexas e extensas exigem grau avanado de conhecimento da
API (ajustes finos).
Uma das grandes vantagens do JPA/Hibernate, alm da produtividade, trabalhar com nveis de
cache, representados na figura abaixo. Uma vez podendo trabalhar com informaes em cache, e
mais do que isso, configurar quando e como as informaes ficam em cache, permite a economia de
processamento junto ao banco de dados o que gera impacto direto na velocidade que o usurio final
tem no acesso ao sistema.
O cache de primeiro nvel o cache bsico de sesso, mas que j permite grandes otimizaes via
processos de FETCH LAZY e FETCH EAGER, onde o processo LAZY, cujo traduo preguioso,
realiza o armazenamento das informaes somente quando solicitada a consulta ao banco de dados. J
o processo EAGER, cuja traduo ansioso, realiza o armazenamento das informaes completas em
memria, no necessitando nova consulta diretamente ao banco de dados e sim somente em memria.
O cache de segundo nvel cache configurvel, onde possvel, dentre tantas opes, configurar o tempo
de permanncia em memria das informaes, a quantidade de dados a serem armazenados, processos
transacionais. Todas estas possibilidades permitem um acesso mais performtico ao banco de dados,
refletindo diretamente em economia de tempo par ao usurio final, como citado anteriormente.
Para implementar cache de segundo nvel, existem bibliotecas disponveis, tais como EhCache,
OSCache, Jboss Cache, entre outros provedores de cache.
Note que nem sempre vivel utilizar o processo de armazenamento em cache.
Imagine o processo de compra de e-commerce. melhor termos as informaes
totalmente atualizadas em tempo real do banco de dados ou t-las previamente
armazenadas? Qual a melhor opo?
Figura 30: Cache.

Fonte: Autor

46

JAVA COM JPA/HIBERNATE

UNIDADE III

Passo a passo - inicial


Para realizar o passo a passo de instalao e execuo da dupla JPA/Hibernate, siga o contedo
anexo na plataforma.
Para auxiliar no Passo a Passo e nas suas demais interaes com o framework ORM, segue abaixo a
Cartilha necessria para este entendimento.
Para iniciar, vamos entender as principais Annotations, localizada no pacote javax.persistence e
suas respectivas funes:
Localizadas no pacote javax.persistence ;
@Entity: especifica que uma classe uma entidade.
Exemplo:
@Entity
public class ClienteEntity {
private int id;
private String nome;
// mtodos get e set
}
@Table: especifica a tabela associada entidade no banco de dados. Caso no definido assume-se
que a tabela ter o mesmo nome da classe da entidade;
Exemplo:
@Entity
@Table(name=TAB_CLIENTE)
public class ClienteEntity {
private int id;
private String nome;
// mtodos get e set
}
@Column: especifica o campo associada ao atributo da entidade. Caso no definido assume-se que
o campo ter o mesmo nome do atributo.
Parmetros:
Name: nome do campo;
Unique (default false): no permite duplicidade;
Nullable (default false): no permite valores nulos;
Insertable (default true): atributo utilizado em operaes de INSERT;
Updatable (default false): atributo utilizado em operaes de UPDATE;

47

UNIDADE III JAVA COM JPA/HIBERNATE


Exemplo:
@Entity
@Table(name=TAB_CLIENTE)
public class ClienteEntity {
@Column(name=COD_CLIENTE)
private int id;
@Column(name=NOM_CLIENTE, nullable=false)
private String nome;
// mtodos get e set
}
@Id: atributo que identificar unicamente as instncias da entidade. Deve-se sempre definir o
atributo que representar a chave primria.
Exemplo:
@Entity
@Table(name=TAB_CLIENTE)
public class ClienteEntity {
@Id
@Column(name=COD_CLIENTE)
private int id;
@Column(name=NOM_CLIENTE, nullable=false)
private String nome;
// mtodos get e set
}
@GeneratedValue: especifica a estratgia de gerao de valores para atributos que so chave
primria. Parmetros:
Strategy: indica o tipo de estratgia utilizada;
Generator: nome do gerador de chaves;
Tipos mais comuns:
GeneratorType.SEQUENCE: baseado em sequence;
GeneratorType.IDENTITY: campos identidade;
@SequenceGenerator: define um gerador de chave primria baseado em sequence de banco de
dados. Possui uma associao com o @GeneratedValue.
Parmetros:
Name: nome a ser referenciado pelo @GeneratedValue ;
sequenceName: nome da sequence de banco de dados;
allocationSize (default 50): incremento

48

JAVA COM JPA/HIBERNATE

UNIDADE III

Exemplo:
@Entity
@SequeceGenerator(name=cliente, sequenceName=SEQ_CLIENTE,
allocationSize=1)
@Table(name=TAB_CLIENTE)
public class ClienteEntity {
@Id
@GeneratedValue(strategy=GeneratorType.SEQUENCE,
generator=cliente)
@Column(name=COD_CLIENTE)
private int id;
@Column(name=NOM_CLIENTE, nullable=false)
private String nome;
// mtodos get e set
}
@Transient: Indica que determinado atributo no deve ser persistido.
Exemplo:
@Entity
@Table(name=TAB_CLIENTE)
public class ClienteEntity {
@Id
@Column(name=COD_CLIENTE)
private int id;
@Column(name=NOM_CLIENTE, nullable=false)
private String nome;
@Transient
private int chaveAcesso;
}
@Temporal: Especifica o tipo de dado a ser armazenado em atributos do tipo Date e Calendar.
Parmetros:
value:
TemporalType.TIMESTAMP: data e hora;
TemporalType.DATE: somente data;
TemporalType.TIME: somente hora;
@Entity
@Table(name=TAB_CLIENTE)
public class Cliente {

@Id

49

UNIDADE III JAVA COM JPA/HIBERNATE


@Column(name=COD_CLIENTE)

private int id;

@Column(name=DAT_NASCIMENTO)

@Temporal(value=Temporaltype.DATE)

private Date dataNascimento;

// ... Mtodos get / set

}
@PersistenceContext: utilizar a anotao @PersistenceContext

para obter, via injeo de

dependncia, uma instncia que implemente a interface EntityManager.


Exemplo:
public class ClienteBean ... {

@PersistenceContext

EntityManager manager = null;

Mapeamentos
@OneToMany: utilizar a anotao @OneToMany no atributo que representa a associao. Utilizar
o atributo cascade para indicar:
CascadeType.ALL: todas as operaes na entidade pai sero refletidas na(s) filho(s);
CascadeType.MERGE: somente operao de merge ser refletida;
CascadeType.PERSIST: somente operao de persist ser refletida;
CascadeType.REFRESH: somente operao refresh ser refletida;
CascadeType.REMOVE: somente operao remove ser refletida;
Pode-se combinar vrios tipos:
@OneToMany(cascade={CascadeType.MERGE,
CascadeType.REMOVE})
Utilizar a anotao @JoinColumn em conjunto com @OneToMany para indicar o nome da
coluna que representa a chave estrangeira na tabela filho. Pode ser utilizada em uma associao
unidirecional;
Exemplo:
public class NFEntity {

...

@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name=COD_NF)

private Collection<NFItemEntity> itens;

...

50

JAVA COM JPA/HIBERNATE

UNIDADE III

public class NFItemEntity {


...

}
A anotao @ManyToOne pode ser utilizada para indicar que uma associao bidirecional. Nas
associaes bidirecionais existe uma referncia tanto do pai para o filho quanto do filho para o
pai. Na entidade pai utilizar o atributo mappedBy para indicar o nome do atributo no filho que
representa a ligao com o pai. Dispensa o uso de @JoinColumn na entidade pai, uma vez que a
mesma definida na entidade filho.
public class NFEntity {

...

@OneToMany(cascade=CascadeType.ALL, mappedBy=nf)

private Collection<NFItemEntity> itens;

...

}
public class NFItemEntity {

...

@ManyToOne
@JoinColumn(name=COD_NF)

private NFEntity nf;

...

}
@ManyToMany: utilizada para representar associaes M:N. Possui o mesmo atributo cascade
da anotao @OneToMany. Utilizar a anotao @JoinTable associada para referenciar a tabela
associativa e os campos de chave estrangeira:
name: nome da tabela associativa;
joinColumns: colunas de chave estrangeira que referenciam a entidade diretamente.
inverseJoinColumns: colunas de chave estrangeira que referenciam a entidade no outro lado da
relao.
Utiliza-se a anotao @JoinColumn para definir as referncias diretas e inversas:
name: nome da coluna de chave estrangeira;
public class CursoEntity {

...

@ManyToMany

@JoinTable(name=TAB_ALUNO_CURSO,

joinColumns=@JoinColumn(name=COD_CURSO),
inverseJoinColumns=@JoinColumn(name=COD_ALUNO))

private Collection<AlunoEntity> alunos;

...

51

UNIDADE III JAVA COM JPA/HIBERNATE


Chaves compostas podem ser representadas atravs de uma classe com a anotao @Embeddable. A
classe de chave primria deve ser utilizada como se fosse um @Id , s que com a anotao @EmbeddedId.
Esta classe deve ser serializable. Deve implementar os mtodos equals(Object) e hashCode().
@Embeddable
public class MatriculaID implements Serializable {
@ManyToOne
@JoinColumn(name=COD_ALUNO)
private Aluno aluno;
@ManyToOne
@JoinColumn(name=COD_CURSO)
private Curso curso;
public MatriculaID(){ }
public MatriculaID(Aluno aluno, Curso curso){
this.aluno = aluno;
this.curso = curso;
}
// get e set
@Override
public boolean equals(Object arg0) {
return super.equals(arg0);
}
@Override
public int hashCode() {
return super.hashCode();
}
}
@Entity
@Table(name=TAB_ALUNO_CURSO)
public class Matricula {
@EmbeddedId
private MatriculaID id;
@column(name=DAT_MATRICULA)
private Date data;
// get e set
}

52

JAVA COM JPA/HIBERNATE

UNIDADE III

API ENTITY MANAGER


Abaixo so apresentados todos os mtodos do EntityManager, responsveis pelos processos
transacionais. So eles:
persist (Object entity): enfileira entidade para ser inserida uma entidade no banco de dados e a
torna gerenciada;
Exemplo:

VeiculoEntity veiculo = new VeiculoEntity();

veiculo.setPlaca(DHZ-5678);

veiculo.setModelo(Fusca);

manager.persist(veiculo);
merge (Object entidade): atualiza uma entidade no gerenciada no contexto de persistncia.
Caso j exista uma entiade gerenciada com o mesmo id realiza uma operao de UPDATE. Caso
contrrio realiza uma operao de INSERT;
A entidade torna-se gerenciada;
Exemplo:

VeiculoEntity veiculo = new VeiculoEntity();

veiculo.setPlaca(DHZ-5678);

veiculo.setModelo(Fusca);

manager.merge(veiculo);
refresh (Object entidade): atualiza dados da entidade com base no banco de dados. Valores no
persistidos so descartados. A entidade torna-se gerenciada.
Exemplo:

VeiculoEntity veiculo = new VeiculoEntity();

veiculo = manager.find(VeiculoEntity.class, 1);

veiculo.setPlaca(DHZ-5678);

veiculo.setModelo(Fusca);

manager.refresh(veiculo);
find (Class classeEntidade, Object PK): localiza uma entidade atravs de sua chave
primria (PK). Retorna null caso a entidade no seja localizada. Uma entidade localizada torna-se
automaticamente gerenciada.
Exemplo:
// Busca veiculo com id igual a 10
VeiculoEntity veiculo = manager.find(VeiculoEntity.class, 10);
veiculo.setPlaca(HHH-7777);

53

UNIDADE III JAVA COM JPA/HIBERNATE


remove (Object entidade): remove uma entidade acoplada. Para excluir entidades desacopladas
primeiro deve-se localiz-la atravs do mtodo find ou getReference;
Exemplo:

VeiculoEntity veiculo = manager.find(VeiculoEntity.class, 10);

manager.remove(veiculo);

Para operaes mais exatas existem a possibilidade da utilizao da linguagem de consulta especfica
para JPA, chamada JP-QL (Java Persistence Query Language).
O JP-QL define todas as operaes necessrias para se criar consultas. Permite tambm efetuar
operao como delete e update. Para se construir uma consulta, utilizar mtodo createQuery da
interface EntityManager:
...
EntityManager manager = ...
Query q = manager.createQuery(SELECT c FROM ClienteBean c);
List<ClienteBean> clientes = q.getResultList();
...
Para se definir parmetros em uma consulta deve-se utilizar o mtodo setParameter da interface
Query. Os parmetros na consulta deve ser identificado por :;
...
EntityManager manager = ...
Query q = manager.createQuery(SELECT c

FROM ClienteBean c

WHERE c.nome like :nome);

q.setParameter(nome, Joo);
List<ClienteBean> clientes = q.getResultList();
...
onde:
getResultList(): retorna uma lista com os resultados da execuo da consulta;
getSingleResult(): retorna um nico objeto (para querys que retornam apenas uma linha);
setMaxResults(int max): nmero mximo de registros a serem recuperados;
setParameter(String nome, Object valor): define o parmetro chamado nome com o valor
especificado;
setParameter(String nome, Date data, Temporaltype tipo): define o parmetro chamado
nome com uma data;
Consultas podem ser definidas junto aos entity beans e posteriormente referenciadas pelo nome.
Utilizar a anotao @NamedQuery :
name: nome de identificao da consulta;
query: consulta em si;

54

JAVA COM JPA/HIBERNATE

UNIDADE III

...
@Entity
@NamedQuery (name = qCliente,

query = SELECT c

FROM ClienteBean

WHERE c.nome like :nome)

55

Para (no) finalizar


As diversas implementaes de acesso a
banco de dados
A busca por conhecimento nunca cessa. Diversos modelos computacionais surgem a cada dia, mas o
core continua sendo o mesmo, onde comandos, instrues e processos devem ser seguidos.
Neste material foi facilmente percebido que desde os princpios de JDBC at a produtividade de
JPA/Hibernate, algumas atividades nunca mudam, como: abrir conexo, realizar a comunicao
(conversar com o banco de dados) e fechar, gerantindo a persistncia do processo.
O que vem sendo modificado no decorrer dos anos a otimizao na produo, onde uma seqncia
grande de instrues resumida a pequenos componentes, ou seja, funes antes longas e repetitivas
passam a ser centralizadas e componentizadas.
Mediante a este cenrio, faz-se uma reflexo: o programador de hoje dever ter o mesmo
conhecimento do programador de amanh? E os sistemas j existentes e construdos em tantos
diferentes modelos, sero adaptados a novos modelos produtivos ou a famosa frase: Time que est
ganhando no se mexe deve ser efetivada?
Eis o futuro. Eis alguns dos vrios questionamentos que a programao tambm requer ateno.
Navegue nestas e em outras questes prprias e entenda como sua participao pode ser importante
nesta evoluo.

56

Referncias
BAUER, Christian; KING, Gavin. Hibernate in Action. USA: Manning Publications, 2004.
BAUER, Christian; KING, Gavin. Java Persistence with Hibernate. USA: Manning Publications,
2006.
BEGIN, Clinton; GOODIN, Brandon; MEADORS, Larry. Ibatis in Action. USA: Manning
Publications, 2006.
FISHER, Maydene; ELLIS, Jon; BRUCE, Jonathan. JDBC API Tutorial and Reference. USA:
Addison-Wesley Professional, 2003.
KEITH, Mike; SCHINCARIOL, Merrick. Pro EJB 3 Java Persistence API. Apress, 2006.
REESE, George. Database Programming With JDBC and Java. USA: OReilly, 2000.
SPEEGLE, Gregory D. JDBC: Practical Guide for Java Programmers (The Practical Guides). USA:
Paperback, 2001.
WILLIAMSON; ALAN Moran. Java Database Programming: Servlets & JDBC. So Paulo:
Pearson, 2000.

57

You might also like