Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
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.
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.
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
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
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..
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
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
16
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 {
Class.forName(com.mysql.jdbc.Driver);
return DriverManager
.getConnection(jdbc:mysql://localhost:3306/bd,root,root); }
}
}
public abstract class GenericDAO <T> {
factory =
Persistence.createEntityManagerFactory(cadastro_PU);
EntityManager em = factory.createEntityManager();
EntityTransaction t = em.getTransaction();
T obj = null;
try {
t.begin();
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
UNIDADE II
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
19
INTO
TB_CLIENTE(ID_CLIENTE,
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
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
Integer id = rs.getInt(ID_CLIENTE);
String nome = rs.getString(Nome);
rs.getDouble(Valor_Ultima_Compra);
//exibe o registro
System.out.println(\t[ + id + , + nome + , +
21
descricao varchar(100)
Fonte: Autor
22
UNIDADE II
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.
Fonte: Autor
23
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.
Fonte: Autor
24
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
Fonte: Autor
26
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
Fonte: Autor
27
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
UNIDADE II
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
29
Fonte: Autor
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
con.setAutoCommit(false);
updateSales.setInt(1, 50);
updateSales.setString(2, Colombian);
updateSales.executeUpdate();
updateTotal.setInt(1, 50);
updateTotal.setString(2, Colombian);
updateTotal.executeUpdate();
con.commit();
con.setAutoCommit(true);
} catch(Exception e){
}
32
con.rollback();
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.
34
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>
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
Fonte: <http://www.oracle.com/technetwork/java/dataaccessobject-138824.html>
36
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
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
UNIDADE II
39
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
40
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
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
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
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
UNIDADE III
Fonte: Autor
45
Fonte: Autor
46
UNIDADE III
47
48
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
@Column(name=COD_CLIENTE)
@Column(name=DAT_NASCIMENTO)
@Temporal(value=Temporaltype.DATE)
}
@PersistenceContext: utilizar a anotao @PersistenceContext
@PersistenceContext
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)
...
50
UNIDADE III
...
}
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)
...
}
public class NFItemEntity {
...
@ManyToOne
@JoinColumn(name=COD_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))
...
51
52
UNIDADE III
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:
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:
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
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
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
UNIDADE III
...
@Entity
@NamedQuery (name = qCliente,
query = SELECT c
FROM ClienteBean
55
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