acessando banco de dados com java - final.pdf

57
BRASÍLIA-DF. ACESSANDO BANCO DE DADOS COM JAVA

Upload: urccoviche-fernando

Post on 06-Nov-2015

66 views

Category:

Documents


22 download

TRANSCRIPT

  • Braslia-DF.

    AcessAndo BAnco de dAdos com JAvA

  • 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

  • 4Apresentao

    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

  • 5organizao 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.

  • 6Saiba 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.

  • 7introduoTodas 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

  • 8O 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.

  • 9 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:

  • 10

  • 11

    unidAdE iEStruturA dA APi JAVA - JdBC

    CAPtuLo 1o 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?

  • 12

    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:

    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:

  • 13

    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

  • 14

    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

  • 15

    CAPtuLo 2JdBC: 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.

  • 16

    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).

  • 17

    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 {

    static EntityManagerFactory factory = null; private Class 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;}

  • 18

    unidAdE iiProgrAMAo JAVA CoM JdBC

    CAPtuLo 1ConnECtion, 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.

  • 19

    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: :

    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();

  • 20

    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.

  • 21

    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.

  • 22

    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

  • 23

    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 conexo para o MySQL, onde passada a localizao 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

  • 24

    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

  • 25

    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.

  • 26

    UNIDADE II PROGRAMAO JAVA COM JDBC

    Figura 12. Classe EstatisticaDAO: mtodo de consulta.

    Fonte: Autor

  • 27

    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

  • 28

    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.

  • 29

    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.

  • 30

    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 Objeto-

    Relacional) so essenciais para maior produtividade.

  • 31

    CAPtuLo 2Controle 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

  • 32

    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){ con.rollback();}

  • 33

    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:

  • 34

    CAPtuLo 3design 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 (padro de projeto, padro arquitetural) uma soluo comum para um problema

    comum encontrado no desenvolvimento de software. No est vinculado nenhuma linguagem OO

    especfica. A sedimentao deste conceito veio com o lanamento do livro: Design Patterns: Elements

    of Reusable Object-Oriented Software.

    A utilizao destes padres usualmente implica em algumas vantagens:

    Facilidade de comunicao - Os padres possuem nomes, os quais resumem uma soluo que deve ser de conhecimento comum entre equipes de desenvolvimento.

    Credibilidade - A implementao estar utilizando solues amplamente testadas e aprovadas.

    Facilidade de manuteno - Padres tendem a reduzir o acoplamento entre

    componentes, o que implica num sistema de fcil manuteno.

    Importante: a utilizao de Design Pattern no implica em cdigos mais enxutos, mas sim na

    otimizao do cdigo.

    data Access object (dAo)

    Este Pattern abstrai e encapsula todos os acessos base de dados. O DAO gerencia a conexo com

    a fonte de dados para obter e armazenar os dados. Vrios nveis de flexibilidade/complexidade

    diferentes podem ser aplicados em um projeto. A ideia bsica separar totalmente o mecanismo de

    acesso a dados do resto da aplicao.

  • 35

    PROGRAMAO JAVA COM JDBC UNIDADE II

    Assim, cria-se um objeto DAO para cada uma das entidades do projeto encapsulando nele os

    mtodos de manipulao dos dados CRUD (Create, Read, Updade e Delete), conforme figura

    abaixo estrutura 1:

    Figura 22: Pattern DAO estrutura 1.

    Fonte:

    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.

  • 36

    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:

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

    todos os mtodos de acesso a dados.

  • 37

    PROGRAMAO JAVA COM JDBC UNIDADE II

    dAo factory

    Este Pattern utilizado quando o repositrio de dados no est sujeito a mudanas frequentes.

    Trata-se de uma fbrica de DAOs para um tipo especfico de repositrio de dados.

    Cenrio de exemplo: Determinada instituio utiliza somente banco de dados MySQL e no existe

    previso de mudana. No conveniente criar uma estrutura complexa, somente pela possibilidade

    de suportar diversos tipos de banco de dados, tendo em vista que no h previso de mudana do atual

    Figura 24: DAO Factory.

    Fonte:

    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.

  • 38

    UNIDADE II PROGRAMAO JAVA COM JDBC

    Abstract factory

    Ao contrrio do DAO Factory este padro usado quando o repositrio de dados est sujeito a

    mudanas frequentes. Permite criar implementaes de fbricas diferentes que criam DAOs para

    diferentes repositrios de dados.

    Cenrios de exemplo:

    Determina instituio utiliza banco de dados Oracle e SQL Server e j est em processo de compra o banco de dados DB2 para suportar um determinado pacote comprado.

    Neste cenrio justificada a criao de uma estrutura para suportar os diversos tipos

    de banco existentes e principalmente estar preparado para suportar novos tipos.

    Determinado software capaz de persistir os dados tanto num SGBDR corporativo como em arquivos do tipo XML, localizados no computador local. Neste cenrio justificada a criao de uma estrutura para suportar os diferentes tipos de repositrios

    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.

  • 39

    PROGRAMAO JAVA COM JDBC UNIDADE II

  • 40

    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 gerar SOMENTE UMA instncia da classe. Essa classe deve possuir:

    Apenas uma instncia da classe Um nico construtor privado Um mtodo que retorne a instncia 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.

  • 41

    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.

  • 42

    unidAdE iiiJAVA CoM JPA/HiBErnAtE

    CAPtuLo 1Estrutura 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.

  • 43

    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:

  • 44

    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 Nao 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;

  • 45

    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

  • 46

    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

  • 47

    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:

    @Entitypublic 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;

  • 48

    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

  • 49

    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

  • 50

    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 itens; ...}

  • 51

    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 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 alunos; ...}

  • 52

    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

    }

  • 53

    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);

  • 54

    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 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 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;

  • 55

    JAVA COM JPA/HIBERNATE UNIDADE III

    ...@Entity

    @NamedQuery (name = qCliente,

    query = SELECT c FROM ClienteBean WHERE c.nome like :nome)

  • 56

    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.

  • 57

    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.