SlideShare uma empresa Scribd logo
1 de 67
Baixar para ler offline
JDBC
Versão 1.0.0
Sumário
I Sobre essa Apostila 2
II Informações Básicas 4
III GNU Free Documentation License 9
IV Java DataBase Connectivity 18
1 Sobre JDBC 19
2 Plano de ensino 20
2.1 Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.2 Público Alvo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3 Pré-requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.4 Descrição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.5 Metodologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.6 Cronograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.7 Programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.8 Avaliação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.9 Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3 CONCEITOS BÁSICOS 23
3.1 Introdução ao JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.1.1 Sistemas de banco de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.1.2 Vantagens dos sistemas de banco de dados . . . . . . . . . . . . . . . . . . 23
3.1.3 Linguagens de banco de dados . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.1.4 Java Database Connectivity . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.2 Instalação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.2.1 MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.2.2 Visão Detalhada da Instalação . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.2.3 Instalando ambiente Java e JDBC . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2.4 Tipos de Drivers JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2.5 Instalando o driver para MySQL em sua máquina . . . . . . . . . . . . . . . . 29
3.3 Bases e passos para Conexão com Banco de Dados Java . . . . . . . . . . . . . . . 29
3.4 Obtendo valores com ResultSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.4.1 Tipos de ResultSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
1
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
3.4.2 Métodos de ResultSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.4.3 Metadados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.5 Criando Tabelas com comandos SQL . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.6 Obtendo Dados de tabelas SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4 CONCEITOS AVANÇADOS 43
4.1 Inserindo Dados em Tabelas SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.2 Atualizando Tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.3 Usando comandos Prepared . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.4 Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.4.1 Capturando Exceções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.4.2 Capturando Warnings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.5 Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.5.1 Usando Transações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.5.2 Desativando modo registro automático(Auto commit) . . . . . . . . . . . . . . 61
4.5.3 Registrando uma Transação . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.5.4 Usando transações para preservar a integridade dos dados . . . . . . . . . . 62
4.5.5 Configurando e usando Rolling Back para um Savepoint . . . . . . . . . . . . 63
4.5.6 Lançando um Savepoint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.5.7 Quando chamar o método rollback . . . . . . . . . . . . . . . . . . . . . . . . 64
2
Parte I
Sobre essa Apostila
3
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
Conteúdo
O conteúdo dessa apostila é fruto da compilação de diversos materiais livres publicados na in-
ternet, disponíveis em diversos sites ou originalmente produzido no CDTC (http://www.cdtc.org.br.)
O formato original deste material bem como sua atualização está disponível dentro da licença
GNU Free Documentation License, cujo teor integral encontra-se aqui reproduzido na seção de
mesmo nome, tendo inclusive uma versão traduzida (não oficial).
A revisão e alteração vem sendo realizada pelo CDTC (suporte@cdtc.org.br) desde outubro
de 2006. Críticas e sugestões construtivas serão bem-vindas a qualquer hora.
Autores
A autoria deste é de responsabilidade de Edson Hungria Júnior (hungria@cdtc.org.br) .
O texto original faz parte do projeto Centro de Difusão de Tecnologia e Conhecimento que
vêm sendo realizado pelo ITI (Instituto Nacional de Tecnologia da Informação) em conjunto com
outros parceiros institucionais, e com as universidades federais brasileiras que tem produzido e
utilizado Software Livre apoiando inclusive a comunidade Free Software junto a outras entidades
no país.
Informações adicionais podem ser obtidas através do email ouvidoria@cdtc.org.br, ou da
home page da entidade, através da URL http://www.cdtc.org.br.
Garantias
O material contido nesta apostila é isento de garantias e o seu uso é de inteira responsabi-
lidade do usuário/leitor. Os autores, bem como o ITI e seus parceiros, não se responsabilizam
direta ou indiretamente por qualquer prejuízo oriundo da utilização do material aqui contido.
Licença
Copyright ©2006, Instituto Nacional de Tecnologia da Informação (cdtc@iti.gov.br) .
Permission is granted to copy, distribute and/or modify this document under the terms
of the GNU Free Documentation License, Version 1.1 or any later version published by
the Free Software Foundation; with the Invariant Chapter being SOBRE ESSA APOS-
TILA. A copy of the license is included in the section entitled GNU Free Documentation
License.
4
Parte II
Informações Básicas
5
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
Sobre o CDTC
Objetivo Geral
O Projeto CDTC visa a promoção e o desenvolvimento de ações que incentivem a dissemina-
ção de soluções que utilizem padrões abertos e não proprietários de tecnologia, em proveito do
desenvolvimento social, cultural, político, tecnológico e econômico da sociedade brasileira.
Objetivo Específico
Auxiliar o Governo Federal na implantação do plano nacional de software não-proprietário e
de código fonte aberto, identificando e mobilizando grupos de formadores de opinião dentre os
servidores públicos e agentes políticos da União Federal, estimulando e incentivando o mercado
nacional a adotar novos modelos de negócio da tecnologia da informação e de novos negócios
de comunicação com base em software não-proprietário e de código fonte aberto, oferecendo
treinamento específico para técnicos, profissionais de suporte e funcionários públicos usuários,
criando grupos de funcionários públicos que irão treinar outros funcionários públicos e atuar como
incentivadores e defensores dos produtos de software não proprietários e código fonte aberto, ofe-
recendo conteúdo técnico on-line para serviços de suporte, ferramentas para desenvolvimento de
produtos de software não proprietários e do seu código fonte livre, articulando redes de terceiros
(dentro e fora do governo) fornecedoras de educação, pesquisa, desenvolvimento e teste de pro-
dutos de software livre.
Guia do aluno
Neste guia, você terá reunidas uma série de informações importantes para que você comece
seu curso. São elas:
• Licenças para cópia de material disponível;
• Os 10 mandamentos do aluno de Educação a Distância;
• Como participar dos foruns e da wikipédia;
• Primeiros passos.
É muito importante que você entre em contato com TODAS estas informações, seguindo o
roteiro acima.
Licença
Copyright ©2006, Instituto Nacional de Tecnologia da Informação (cdtc@iti.gov.br).
6
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
É dada permissão para copiar, distribuir e/ou modificar este documento sob os termos
da Licença de Documentação Livre GNU, Versão 1.1 ou qualquer versão posterior
públicada pela Free Software Foundation; com o Capitulo Invariante SOBRE ESSA
APOSTILA. Uma cópia da licença está inclusa na seção entitulada "Licença de Docu-
mentação Livre GNU".
Os 10 mandamentos do aluno de educação online
• 1. Acesso à Internet: ter endereço eletrônico, um provedor e um equipamento adequado é
pré-requisito para a participação nos cursos a distância;
• 2. Habilidade e disposição para operar programas: ter conhecimentos básicos de Informá-
tica é necessário para poder executar as tarefas;
• 3. Vontade para aprender colaborativamente: interagir, ser participativo no ensino a distân-
cia conta muitos pontos, pois irá colaborar para o processo ensino-aprendizagem pessoal,
dos colegas e dos professores;
• 4. Comportamentos compatíveis com a etiqueta: mostrar-se interessado em conhecer seus
colegas de turma respeitando-os e se fazendo ser respeitado pelos mesmos;
• 5. Organização pessoal: planejar e organizar tudo é fundamental para facilitar a sua revisão
e a sua recuperação de materiais;
• 6. Vontade para realizar as atividades no tempo correto: anotar todas as suas obrigações e
realizá-las em tempo real;
• 7. Curiosidade e abertura para inovações: aceitar novas idéias e inovar sempre;
• 8. Flexibilidade e adaptação: requisitos necessário à mudança tecnológica, aprendizagens
e descobertas;
• 9. Objetividade em sua comunicação: comunicar-se de forma clara, breve e transparente é
ponto - chave na comunicação pela Internet;
• 10. Responsabilidade: ser responsável por seu próprio aprendizado. O ambiente virtual não
controla a sua dedicação, mas reflete os resultados do seu esforço e da sua colaboração.
Como participar dos fóruns e Wikipédia
Você tem um problema e precisa de ajuda?
Podemos te ajudar de 2 formas:
A primeira é o uso dos fóruns de notícias e de dúvidas gerais que se distinguem pelo uso:
. O fórum de notícias tem por objetivo disponibilizar um meio de acesso rápido a informações
que sejam pertinentes ao curso (avisos, notícias). As mensagens postadas nele são enviadas a
7
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
todos participantes. Assim, se o monitor ou algum outro participante tiver uma informação que
interesse ao grupo, favor postá-la aqui.
Porém, se o que você deseja é resolver alguma dúvida ou discutir algum tópico específico do
curso. É recomendado que você faça uso do Fórum de dúvidas gerais que lhe dá recursos mais
efetivos para esta prática.
. O fórum de dúvidas gerais tem por objetivo disponibilizar um meio fácil, rápido e interativo
para solucionar suas dúvidas e trocar experiências. As mensagens postadas nele são enviadas
a todos participantes do curso. Assim, fica muito mais fácil obter respostas, já que todos podem
ajudar.
Se você receber uma mensagem com algum tópico que saiba responder, não se preocupe com a
formalização ou a gramática. Responda! E não se esqueça de que antes de abrir um novo tópico
é recomendável ver se a sua pergunta já foi feita por outro participante.
A segunda forma se dá pelas Wikis:
. Uma wiki é uma página web que pode ser editada colaborativamente, ou seja, qualquer par-
ticipante pode inserir, editar, apagar textos. As versões antigas vão sendo arquivadas e podem
ser recuperadas a qualquer momento que um dos participantes o desejar. Assim, ela oferece um
ótimo suporte a processos de aprendizagem colaborativa. A maior wiki na web é o site "Wikipé-
dia", uma experiência grandiosa de construção de uma enciclopédia de forma colaborativa, por
pessoas de todas as partes do mundo. Acesse-a em português pelos links:
• Página principal da Wiki - http://pt.wikipedia.org/wiki/
Agradecemos antecipadamente a sua colaboração com a aprendizagem do grupo!
Primeiros Passos
Para uma melhor aprendizagem é recomendável que você siga os seguintes passos:
• Ler o Plano de Ensino e entender a que seu curso se dispõe a ensinar;
• Ler a Ambientação do Moodle para aprender a navegar neste ambiente e se utilizar das
ferramentas básicas do mesmo;
• Entrar nas lições seguindo a seqüência descrita no Plano de Ensino;
• Qualquer dúvida, reporte ao Fórum de Dúvidas Gerais.
Perfil do Tutor
Segue-se uma descrição do tutor ideal, baseada no feedback de alunos e de tutores.
O tutor ideal é um modelo de excelência: é consistente, justo e profissional nos respectivos
valores e atitudes, incentiva mas é honesto, imparcial, amável, positivo, respeitador, aceita as
idéias dos estudantes, é paciente, pessoal, tolerante, apreciativo, compreensivo e pronto a ajudar.
8
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
A classificação por um tutor desta natureza proporciona o melhor feedback possível, é crucial, e,
para a maior parte dos alunos, constitui o ponto central do processo de aprendizagem.’ Este tutor
ou instrutor:
• fornece explicações claras acerca do que ele espera e do estilo de classificação que irá
utilizar;
• gosta que lhe façam perguntas adicionais;
• identifica as nossas falhas, mas corrige-as amavelmente’, diz um estudante, ’e explica por-
que motivo a classificação foi ou não foi atribuída’;
• tece comentários completos e construtivos, mas de forma agradável (em contraste com um
reparo de um estudante: ’os comentários deixam-nos com uma sensação de crítica, de
ameaça e de nervossismo’)
• dá uma ajuda complementar para encorajar um estudante em dificuldade;
• esclarece pontos que não foram entendidos, ou corretamente aprendidos anteriormente;
• ajuda o estudante a alcançar os seus objetivos;
• é flexível quando necessário;
• mostra um interesse genuíno em motivar os alunos (mesmo os principiantes e, por isso,
talvez numa fase menos interessante para o tutor);
• escreve todas as correções de forma legível e com um nível de pormenorização adequado;
• acima de tudo, devolve os trabalhos rapidamente;
9
Parte III
GNU Free Documentation License
10
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
(Traduzido pelo João S. O. Bueno através do CIPSGA em 2001)
Esta é uma tradução não oficial da Licença de Documentação Livre GNU em Português Brasi-
leiro. Ela não é publicada pela Free Software Foundation, e não se aplica legalmente a distribuição
de textos que usem a GFDL - apenas o texto original em Inglês da GNU FDL faz isso. Entretanto,
nós esperamos que esta tradução ajude falantes de português a entenderem melhor a GFDL.
This is an unofficial translation of the GNU General Documentation License into Brazilian Por-
tuguese. It was not published by the Free Software Foundation, and does not legally state the
distribution terms for software that uses the GFDL–only the original English text of the GFDL does
that. However, we hope that this translation will help Portuguese speakers understand the GFDL
better.
Licença de Documentação Livre GNU Versão 1.1, Março de 2000
Copyright (C) 2000 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
É permitido a qualquer um copiar e distribuir cópias exatas deste documento de licença, mas
não é permitido alterá-lo.
INTRODUÇÃO
O propósito desta Licença é deixar um manual, livro-texto ou outro documento escrito "livre"no
sentido de liberdade: assegurar a qualquer um a efetiva liberdade de copiá-lo ou redistribui-lo,
com ou sem modificações, comercialmente ou não. Secundariamente, esta Licença mantém
para o autor e editor uma forma de ter crédito por seu trabalho, sem ser considerado responsável
pelas modificações feitas por terceiros.
Esta Licença é um tipo de "copyleft"("direitos revertidos"), o que significa que derivações do
documento precisam ser livres no mesmo sentido. Ela complementa a GNU Licença Pública Ge-
ral (GNU GPL), que é um copyleft para software livre.
Nós fizemos esta Licença para que seja usada em manuais de software livre, por que software
livre precisa de documentação livre: um programa livre deve ser acompanhado de manuais que
provenham as mesmas liberdades que o software possui. Mas esta Licença não está restrita a
manuais de software; ela pode ser usada para qualquer trabalho em texto, independentemente
do assunto ou se ele é publicado como um livro impresso. Nós recomendamos esta Licença prin-
cipalmente para trabalhos cujo propósito seja de introdução ou referência.
APLICABILIDADE E DEFINIÇÕES
Esta Licença se aplica a qualquer manual ou outro texto que contenha uma nota colocada pelo
detentor dos direitos autorais dizendo que ele pode ser distribuído sob os termos desta Licença.
O "Documento"abaixo se refere a qualquer manual ou texto. Qualquer pessoa do público é um
11
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
licenciado e é referida como "você".
Uma "Versão Modificada"do Documento se refere a qualquer trabalho contendo o documento
ou uma parte dele, quer copiada exatamente, quer com modificações e/ou traduzida em outra
língua.
Uma "Seção Secundária"é um apêndice ou uma seção inicial do Documento que trata ex-
clusivamente da relação dos editores ou dos autores do Documento com o assunto geral do
Documento (ou assuntos relacionados) e não contém nada que poderia ser incluído diretamente
nesse assunto geral (Por exemplo, se o Documento é em parte um livro texto de matemática, a
Seção Secundária pode não explicar nada de matemática).
Essa relação poderia ser uma questão de ligação histórica com o assunto, ou matérias relaci-
onadas, ou de posições legais, comerciais, filosóficas, éticas ou políticas relacionadas ao mesmo.
As "Seções Invariantes"são certas Seções Secundárias cujos títulos são designados, como
sendo de Seções Invariantes, na nota que diz que o Documento é publicado sob esta Licença.
Os "Textos de Capa"são certos trechos curtos de texto que são listados, como Textos de Capa
Frontal ou Textos da Quarta Capa, na nota que diz que o texto é publicado sob esta Licença.
Uma cópia "Transparente"do Documento significa uma cópia que pode ser lida automatica-
mente, representada num formato cuja especificação esteja disponível ao público geral, cujos
conteúdos possam ser vistos e editados diretamente e sem mecanismos especiais com editores
de texto genéricos ou (para imagens compostas de pixels) programas de pintura genéricos ou
(para desenhos) por algum editor de desenhos grandemente difundido, e que seja passível de
servir como entrada a formatadores de texto ou para tradução automática para uma variedade
de formatos que sirvam de entrada para formatadores de texto. Uma cópia feita em um formato
de arquivo outrossim Transparente cuja constituição tenha sido projetada para atrapalhar ou de-
sencorajar modificações subsequentes pelos leitores não é Transparente. Uma cópia que não é
"Transparente"é chamada de "Opaca".
Exemplos de formatos que podem ser usados para cópias Transparentes incluem ASCII sim-
ples sem marcações, formato de entrada do Texinfo, formato de entrada do LaTex, SGML ou XML
usando uma DTD disponibilizada publicamente, e HTML simples, compatível com os padrões, e
projetado para ser modificado por pessoas. Formatos opacos incluem PostScript, PDF, formatos
proprietários que podem ser lidos e editados apenas com processadores de texto proprietários,
SGML ou XML para os quais a DTD e/ou ferramentas de processamento e edição não estejam
disponíveis para o público, e HTML gerado automaticamente por alguns editores de texto com
finalidade apenas de saída.
A "Página do Título"significa, para um livro impresso, a página do título propriamente dita,
mais quaisquer páginas subsequentes quantas forem necessárias para conter, de forma legível,
o material que esta Licença requer que apareça na página do título. Para trabalhos que não
tenham uma página do título, "Página do Título"significa o texto próximo da aparição mais proe-
minente do título do trabalho, precedendo o início do corpo do texto.
12
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
FAZENDO CÓPIAS EXATAS
Você pode copiar e distribuir o Documento em qualquer meio, de forma comercial ou não
comercial, desde que esta Licença, as notas de copyright, e a nota de licença dizendo que esta
Licença se aplica ao documento estejam reproduzidas em todas as cópias, e que você não acres-
cente nenhuma outra condição, quaisquer que sejam, às desta Licença.
Você não pode usar medidas técnicas para obstruir ou controlar a leitura ou confecção de
cópias subsequentes das cópias que você fizer ou distribuir. Entretanto, você pode aceitar com-
pensação em troca de cópias. Se você distribuir uma quantidade grande o suficiente de cópias,
você também precisa respeitar as condições da seção 3.
Você também pode emprestar cópias, sob as mesmas condições colocadas acima, e também
pode exibir cópias publicamente.
FAZENDO CÓPIAS EM QUANTIDADE
Se você publicar cópias do Documento em número maior que 100, e a nota de licença do
Documento obrigar Textos de Capa, você precisará incluir as cópias em capas que tragam, clara
e legivelmente, todos esses Textos de Capa: Textos de Capa da Frente na capa da frente, e
Textos da Quarta Capa na capa de trás. Ambas as capas também precisam identificar clara e
legivelmente você como o editor dessas cópias. A capa da frente precisa apresentar o título com-
pleto com todas as palavras do título igualmente proeminentes e visíveis. Você pode adicionar
outros materiais às capas. Fazer cópias com modificações limitadas às capas, tanto quanto estas
preservem o título do documento e satisfaçam a essas condições, pode ser tratado como cópia
exata em outros aspectos.
Se os textos requeridos em qualquer das capas for muito volumoso para caber de forma
legível, você deve colocar os primeiros (tantos quantos couberem de forma razoável) na capa
verdadeira, e continuar os outros nas páginas adjacentes.
Se você publicar ou distribuir cópias Opacas do Documento em número maior que 100, você
precisa ou incluir uma cópia Transparente que possa ser lida automaticamente com cada cópia
Opaca, ou informar, em ou com, cada cópia Opaca a localização de uma cópia Transparente
completa do Documento acessível publicamente em uma rede de computadores, à qual o público
usuário de redes tenha acesso a download gratuito e anônimo utilizando padrões públicos de
protocolos de rede. Se você utilizar o segundo método, você precisará tomar cuidados razoavel-
mente prudentes, quando iniciar a distribuição de cópias Opacas em quantidade, para assegurar
que esta cópia Transparente vai permanecer acessível desta forma na localização especificada
por pelo menos um ano depois da última vez em que você distribuir uma cópia Opaca (direta-
mente ou através de seus agentes ou distribuidores) daquela edição para o público.
É pedido, mas não é obrigatório, que você contate os autores do Documento bem antes de
redistribuir qualquer grande número de cópias, para lhes dar uma oportunidade de prover você
com uma versão atualizada do Documento.
13
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
MODIFICAÇÕES
Você pode copiar e distribuir uma Versão Modificada do Documento sob as condições das se-
ções 2 e 3 acima, desde que você publique a Versão Modificada estritamente sob esta Licença,
com a Versão Modificada tomando o papel do Documento, de forma a licenciar a distribuição
e modificação da Versão Modificada para quem quer que possua uma cópia da mesma. Além
disso, você precisa fazer o seguinte na versão modificada:
A. Usar na Página de Título (e nas capas, se houver alguma) um título distinto daquele do Do-
cumento, e daqueles de versões anteriores (que deveriam, se houvesse algum, estarem listados
na seção "Histórico do Documento"). Você pode usar o mesmo título de uma versão anterior se
o editor original daquela versão lhe der permissão;
B. Listar na Página de Título, como autores, uma ou mais das pessoas ou entidades responsá-
veis pela autoria das modificações na Versão Modificada, conjuntamente com pelo menos cinco
dos autores principais do Documento (todos os seus autores principais, se ele tiver menos que
cinco);
C. Colocar na Página de Título o nome do editor da Versão Modificada, como o editor;
D. Preservar todas as notas de copyright do Documento;
E. Adicionar uma nota de copyright apropriada para suas próprias modificações adjacente às
outras notas de copyright;
F. Incluir, imediatamente depois das notas de copyright, uma nota de licença dando ao público
o direito de usar a Versão Modificada sob os termos desta Licença, na forma mostrada no tópico
abaixo;
G. Preservar nessa nota de licença as listas completas das Seções Invariantes e os Textos de
Capa requeridos dados na nota de licença do Documento;
H. Incluir uma cópia inalterada desta Licença;
I. Preservar a seção entitulada "Histórico", e seu título, e adicionar à mesma um item dizendo
pelo menos o título, ano, novos autores e editor da Versão Modificada como dados na Página de
Título. Se não houver uma sessão denominada "Histórico"no Documento, criar uma dizendo o
título, ano, autores, e editor do Documento como dados em sua Página de Título, então adicionar
um item descrevendo a Versão Modificada, tal como descrito na sentença anterior;
J. Preservar o endereço de rede, se algum, dado no Documento para acesso público a uma
cópia Transparente do Documento, e da mesma forma, as localizações de rede dadas no Docu-
mento para as versões anteriores em que ele foi baseado. Elas podem ser colocadas na seção
"Histórico". Você pode omitir uma localização na rede para um trabalho que tenha sido publicado
pelo menos quatro anos antes do Documento, ou se o editor original da versão a que ela se refira
der sua permissão;
K. Em qualquer seção entitulada "Agradecimentos"ou "Dedicatórias", preservar o título da
14
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
seção e preservar a seção em toda substância e fim de cada um dos agradecimentos de contri-
buidores e/ou dedicatórias dados;
L. Preservar todas as Seções Invariantes do Documento, inalteradas em seus textos ou em
seus títulos. Números de seção ou equivalentes não são considerados parte dos títulos da seção;
M. Apagar qualquer seção entitulada "Endossos". Tal sessão não pode ser incluída na Versão
Modificada;
N. Não reentitular qualquer seção existente com o título "Endossos"ou com qualquer outro
título dado a uma Seção Invariante.
Se a Versão Modificada incluir novas seções iniciais ou apêndices que se qualifiquem como
Seções Secundárias e não contenham nenhum material copiado do Documento, você pode optar
por designar alguma ou todas aquelas seções como invariantes. Para fazer isso, adicione seus
títulos à lista de Seções Invariantes na nota de licença da Versão Modificada. Esses títulos preci-
sam ser diferentes de qualquer outro título de seção.
Você pode adicionar uma seção entitulada "Endossos", desde que ela não contenha qual-
quer coisa além de endossos da sua Versão Modificada por várias pessoas ou entidades - por
exemplo, declarações de revisores ou de que o texto foi aprovado por uma organização como a
definição oficial de um padrão.
Você pode adicionar uma passagem de até cinco palavras como um Texto de Capa da Frente
, e uma passagem de até 25 palavras como um Texto de Quarta Capa, ao final da lista de Textos
de Capa na Versão Modificada. Somente uma passagem de Texto da Capa da Frente e uma de
Texto da Quarta Capa podem ser adicionados por (ou por acordos feitos por) qualquer entidade.
Se o Documento já incluir um texto de capa para a mesma capa, adicionado previamente por
você ou por acordo feito com alguma entidade para a qual você esteja agindo, você não pode
adicionar um outro; mas você pode trocar o antigo, com permissão explícita do editor anterior que
adicionou a passagem antiga.
O(s) autor(es) e editor(es) do Documento não dão permissão por esta Licença para que seus
nomes sejam usados para publicidade ou para assegurar ou implicar endossamento de qualquer
Versão Modificada.
COMBINANDO DOCUMENTOS
Você pode combinar o Documento com outros documentos publicados sob esta Licença, sob
os termos definidos na seção 4 acima para versões modificadas, desde que você inclua na com-
binação todas as Seções Invariantes de todos os documentos originais, sem modificações, e liste
todas elas como Seções Invariantes de seu trabalho combinado em sua nota de licença.
O trabalho combinado precisa conter apenas uma cópia desta Licença, e Seções Invariantes
Idênticas com multiplas ocorrências podem ser substituídas por apenas uma cópia. Se houver
múltiplas Seções Invariantes com o mesmo nome mas com conteúdos distintos, faça o título de
15
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
cada seção único adicionando ao final do mesmo, em parênteses, o nome do autor ou editor
origianl daquela seção, se for conhecido, ou um número que seja único. Faça o mesmo ajuste
nos títulos de seção na lista de Seções Invariantes nota de licença do trabalho combinado.
Na combinação, você precisa combinar quaisquer seções entituladas "Histórico"dos diver-
sos documentos originais, formando uma seção entitulada "Histórico"; da mesma forma combine
quaisquer seções entituladas "Agradecimentos", ou "Dedicatórias". Você precisa apagar todas as
seções entituladas como "Endosso".
COLETÂNEAS DE DOCUMENTOS
Você pode fazer uma coletânea consitindo do Documento e outros documentos publicados
sob esta Licença, e substituir as cópias individuais desta Licença nos vários documentos com
uma única cópia incluida na coletânea, desde que você siga as regras desta Licença para cópia
exata de cada um dos Documentos em todos os outros aspectos.
Você pode extrair um único documento de tal coletânea, e distribuí-lo individualmente sob
esta Licença, desde que você insira uma cópia desta Licença no documento extraído, e siga esta
Licença em todos os outros aspectos relacionados à cópia exata daquele documento.
AGREGAÇÃO COM TRABALHOS INDEPENDENTES
Uma compilação do Documento ou derivados dele com outros trabalhos ou documentos se-
parados e independentes, em um volume ou mídia de distribuição, não conta como uma Ver-
são Modificada do Documento, desde que nenhum copyright de compilação seja reclamado pela
compilação. Tal compilação é chamada um "agregado", e esta Licença não se aplica aos outros
trabalhos auto-contidos compilados junto com o Documento, só por conta de terem sido assim
compilados, e eles não são trabalhos derivados do Documento.
Se o requerido para o Texto de Capa na seção 3 for aplicável a essas cópias do Documento,
então, se o Documento constituir menos de um quarto de todo o agregado, os Textos de Capa
do Documento podem ser colocados em capas adjacentes ao Documento dentro do agregado.
Senão eles precisarão aparecer nas capas de todo o agregado.
TRADUÇÃO
Tradução é considerada como um tipo de modificação, então você pode distribuir traduções
do Documento sob os termos da seção 4. A substituição de Seções Invariantes por traduções
requer uma permissão especial dos detentores do copyright das mesmas, mas você pode incluir
traduções de algumas ou de todas as Seções Invariantes em adição às versões orignais dessas
Seções Invariantes. Você pode incluir uma tradução desta Licença desde que você também in-
clua a versão original em Inglês desta Licença. No caso de discordância entre a tradução e a
16
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
versão original em Inglês desta Licença, a versão original em Inglês prevalecerá.
TÉRMINO
Você não pode copiar, modificar, sublicenciar, ou distribuir o Documento exceto como expres-
samente especificado sob esta Licença. Qualquer outra tentativa de copiar, modificar, sublicen-
ciar, ou distribuir o Documento é nula, e resultará automaticamente no término de seus direitos
sob esta Licença. Entretanto, terceiros que tenham recebido cópias, ou direitos de você sob esta
Licença não terão suas licenças terminadas, tanto quanto esses terceiros permaneçam em total
acordo com esta Licença.
REVISÕES FUTURAS DESTA LICENÇA
A Free Software Foundation pode publicar novas versões revisadas da Licença de Documen-
tação Livre GNU de tempos em tempos. Tais novas versões serão similares em espirito à versão
presente, mas podem diferir em detalhes ao abordarem novos porblemas e preocupações. Veja
http://www.gnu.org/copyleft/.
A cada versão da Licença é dado um número de versão distinto. Se o Documento especificar
que uma versão particular desta Licença "ou qualquer versão posterior"se aplica ao mesmo, você
tem a opção de seguir os termos e condições daquela versão específica, ou de qualquer versão
posterior que tenha sido publicada (não como rascunho) pela Free Software Foundation. Se o
Documento não especificar um número de Versão desta Licença, você pode escolher qualquer
versão já publicada (não como rascunho) pela Free Software Foundation.
ADENDO: Como usar esta Licença para seus documentos
Para usar esta Licença num documento que você escreveu, inclua uma cópia desta Licença
no documento e ponha as seguintes notas de copyright e licenças logo após a página de título:
Copyright (c) ANO SEU NOME.
É dada permissão para copiar, distribuir e/ou modificar este documento sob os termos da Licença
de Documentação Livre GNU, Versão 1.1 ou qualquer versão posterior publicada pela Free Soft-
ware Foundation; com as Seções Invariantes sendo LISTE SEUS TÍTULOS, com os Textos da
Capa da Frente sendo LISTE, e com os Textos da Quarta-Capa sendo LISTE. Uma cópia da li-
cença está inclusa na seção entitulada "Licença de Documentação Livre GNU".
Se você não tiver nenhuma Seção Invariante, escreva "sem Seções Invariantes"ao invés de
dizer quais são invariantes. Se você não tiver Textos de Capa da Frente, escreva "sem Textos de
Capa da Frente"ao invés de "com os Textos de Capa da Frente sendo LISTE"; o mesmo para os
Textos da Quarta Capa.
Se o seu documento contiver exemplos não triviais de código de programas, nós recomenda-
mos a publicação desses exemplos em paralelo sob a sua escolha de licença de software livre,
17
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
tal como a GNU General Public License, para permitir o seu uso em software livre.
18
Parte IV
Java DataBase Connectivity
19
Capítulo 1
Sobre JDBC
Java Database Connectivity (JDBC) é, basicamente, "uma API padrão Java para executar
código SQL". Consiste de classes e interfaces escritas em Java que fornecem uma API padrão
para desenvolvedores, tornando possível o envio de instruções SQL para qualquer base de dados
relacional.
20
Capítulo 2
Plano de ensino
2.1 Objetivo
Qualificar técnicos e programadores na API Java chamada JDBC.
2.2 Público Alvo
Técnicos e Programadores que desejam trabalhar com banco de dados e a linguagem Java.
2.3 Pré-requisitos
Os usuários deverão , necessariamente, ter conhecimento básico acerca da lógica de progra-
mação, de banco de dados e, principalmente, conhecer a linguagem de programação Java.
Recomenda-se enfaticamente ter feito os cursos de Java Básico e Banco de Dados MySQL.
2.4 Descrição
O curso será realizado na modalidade Educação a Distância e utilizará a Plataforma Moodle
como ferramenta de aprendizagem. O curso tem duração de uma semana e possui um conjunto
de atividades (lições, fóruns, glossários, questionários e outros) que deverão ser executadas de
acordo com as instruções fornecidas. O material didático estará disponível on-line de acordo com
as datas pré-estabelecidas em cada tópico. A versão adotada do Java é a 1.5.0, caso possua ou-
tra versão, poderão ocorrer diferenças, não necessariamente vitais, com relação a este material.
Todo o material está no formato de lições e estará disponível ao longo do curso. As lições
poderão ser acessadas quantas vezes forem necessárias. Aconselhamos a leitura de "Ambien-
tação do Moodle", para que você conheça o produto de Ensino a Distância, evitando dificuldades
advindas do "desconhecimento"sobre o mesmo.
Ao final de cada lição haverá uma questão referente módulo ao estudado anteriormente que
também poderá conter perguntas sobre os textos indicados caso existam. No final do curso ha-
verá uma prova de Avaliação de Aprendizagem no formato da construção de um programa. Utilize
21
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
o material de cada semana e os exemplos disponibilizados para se preparar para prova.
As lições contêm o conteúdo principal. Elas poderão ser acessadas quantas vezes forem ne-
cessárias, desde que esteja dentro da semana programada. Ao final de uma lição, você receberá
uma nota de acordo com o seu desempenho. Responda com atenção às perguntas de cada li-
ção, pois elas serão consideradas na sua nota final. Caso sua nota numa determinada lição seja
menor do que 6.0, sugerimos que você faça novamente esta lição.
Os instrutores estarão a sua disposição ao longo de todo curso. Qualquer dúvida deve ser
disponibilizada no fórum ou enviada por e-mail. Diariamente os monitores darão respostas e es-
clarecimentos.
2.5 Metodologia
O curso está dividido da seguinte maneira:
2.6 Cronograma
Semana 1 - Conceitos Básicos
• Introdução ao JDBC;
• Instalação;
• Bases para Conexão com JDBC;
• Manipulação de Tabelas.
Semana 2 - Conceitos Avançados
• Inserção e Atualização de Tabelas;
• PreparedStatements, Performance, Captura de erros e Advertências;
• Transactions.
2.7 Programa
O curso JDBC oferecerá o seguinte conteúdo:
• instalação, Conceitos Básicos e Conceitos Avançados de JDBC;
• uso de ferramenta de Banco de Dados MySQL em JDBC.
22
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
2.8 Avaliação
Toda a avaliação será feita on-line.
Aspectos a serem considerados na avaliação:
• iniciativa e autonomia no processo de aprendizagem e de produção de conhecimento;
• capacidade de pesquisa e abordagem criativa na solução dos problemas apresentados.
Instrumentos de avaliação:
• participação ativa nas atividades programadas;
• avaliação de Aprendizagem ao final do curso;
• o participante fará várias avaliações referente ao conteúdo do curso. Para a aprovação e
obtenção do certificado o participante deverá obter nota final maior ou igual a 6.0 de acordo
com a fórmula abaixo:
• Nota Final = ((ML x 7) + (AF x 3)) / 10
• AF = Nota da Avaliação de Aprendizagem.
• ML = Média aritmética das Avaliações de Lições.
2.9 Bibliografia
• Site oficial: http://www.sun.com
• Site oficial (JDBC): http://java.sun.com/javase/technologies/database/
• Site relacionados: http://www.jdbc-tutorial.com/
23
Capítulo 3
CONCEITOS BÁSICOS
Conceitos iniciais de Sistemas de Banco de Dados , Linguagens de banco de dados e tecno-
logia JDBC.
3.1 Introdução ao JDBC
3.1.1 Sistemas de banco de dados
A disponibilidade de armazenamento massivo, barato e de acesso direto gerou uma demanda
tremenda por pesquisas e desenvolvimento na área de sistemas de banco de dados. Um sistema
de banco de dados envolve mais coisas do que uma simples coleção integrada de dados. Ele
engloba dados, o hardware em que os dados se encontram, o software controlador do armaze-
namento, recuperação de dados ou Sistema de Gerenciamento de Bancos de Dados(SGBD)
e, finalmente, os próprios usuários.
3.1.2 Vantagens dos sistemas de banco de dados
• Redução da redundância;
• A inconsistência pode ser evitada;
• Compartilhamento de dados;
• Imposição de padrões;
• Aplicação de restrições de segurança;
• Manutenção da integridade.
A independência de dados é um dos aspectos mais relevantes de um SGBD. Ou seja, a ma-
neira como os dados são fisicamente armazenados ou acessados não é preocupação dos apli-
cativos. A independência dos dados oferece a conveniência pela qual vários aplicativos podem
ter diferentes visualizações dos mesmos dados. Do ponto de vista do sistema, a independência
dos dados torna possível que a estrutura de armazenamento e a estratégia de acesso sejam
modificadas em resposta às alterações nos requisitos da instalação, mas sem a necessidade de
modificar aplicativos em funcionamento.
24
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
3.1.3 Linguagens de banco de dados
Os usuários acessam um banco de dados(BD) por instruções em uma linguagem própria de
banco de dados. Os programas aplicativos podem utilizar uma linguagem de alto nível conven-
cional como Java, C, C++, Visual Basic, COBOL ou Pascal. Um usuário pode fazer solicitações
do banco de dados em uma linguagem de consulta especialmente projetada, o que torna fácil
expressar as solicitações no contexto de um aplicativo específico.
Existem linguagens de programação que têm um conjunto de primitivas que permitem a cria-
ção de bancos de dados de forma fácil, mas que são deficientes em outros aspectos. Já outras
foram desenvolvidas para ter um alto desempenho, porém são complexas para trabalhar com
bancos de dados. Java encontrou uma maneira de manter as características desenvolvendo uma
tecnologia para acesso a banco de dados sendo independente de plataforma e de fornecedor. No
entanto, a comunicação de Java puro com banco de dados é difícil de se fazer, devido a grande
quantidade de bancos de dados com linguagens proprietárias no mercado.
Para resolver isso, foi criada então, pelos projetistas da Javasoft, uma interface entre Java e
outra linguagem que todos os bancos de dados suportam. A linguagem escolhida foi o SQL
(Structured Query Language) e a partir daí, os fabricantes de bancos de dados passaram a
fornecer os drivers para SQL, criou-se o JDBC.
3.1.4 Java Database Connectivity
O Java Data Base Connectivity(JDBC) é uma API (Application Program Interface), inclusa no
J2SE e também na J2EE, que provê conectividade entre a linguagem de programação Java e os
SGBD (Sistemas Gerenciadores de Banco de Dados) relacionais, por meio de comandos SQL.
A tecnologia JDBC permite a utilização da portabilidade intrínseca de Java nos conectando a um
universo de dados em ambientes heterogêneos. O uso dessa API JDBC torna desnecessária a
escrita de um programa para acessar, por exemplo, o banco de dados Sybase, outro para acessar
o banco de dados Oracle, outro para acessar um banco de dados Informix, etc. Com o uso da API
JDBC, pode-se escrever um único programa que será capaz de enviar código SQL a cada banco
de dados específico. Além disso, com uma aplicação escrita em Java não há a preocupação de
compatibilidade de plataforma. Essa combinação, portanto, torna possível escrever uma vez e
rodar em qualquer lugar.
A biblioteca da JBDC provê um conjunto de interfaces de acesso ao BD, sendo que uma im-
plementação em particular dessas interfaces é chamada de Driver. São os próprios fabricantes
dos bancos de dados, ou terceiros, quem implementam os Drivers JDBC para cada BD, pois são
eles que conhecem os detalhes dos BDs. Cada BD possui um Driver JDBC específico que é
usado de forma padrão. A API padrão do Java já vem com o driver JDBC-ODBC, que é uma
ponte entre a aplicação Java e o BD através da configuração de um recurso ODBC na máquina.
Já os drivers de outros fornecedores devem ser adicionados ao CLASSPATH da aplicação para
que possam ser usados. Desta maneira, pode-se mudar o driver sem que se mude a aplicação.
Java é uma excelente linguagem base para as aplicações de banco de dados, já que é uma
linguagem robusta, de fácil entendimento e uso, segura e é normalmente baixada automatica-
mente numa rede. JDBC é o mecanismo certo para fazer aplicações Java se comunicarem com
25
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
os variados bancos de dados existentes. Com Java e a API JDBC é possível, por exemplo, pu-
blicar uma página web contendo um applet que utiliza informações obtidas de algum banco de
dados.
Figura 1 - Tecnologia
A figura acima ilustra a tecnologia do JDBC. Os programadores Java devem conseguir aces-
sar um banco de dados efetuando declarações SQL padrão, através de uma API JDBC. Estas
declarações são enviadas ao gerenciador de drivers JDBC, que se encarrega de utilizar os dri-
vers disponíveis para o banco de dados. Quando já está implementado um driver JDBC para o
determinado banco de dados, o gerenciador passa as declarações SQL para o driver através de
uma API do driver JDBC. Caso não tenha um driver JDBC disponível, então é utilizada uma ponte
JDBC/ODBC, que envia as declarações SQL para o driver ODBC (interface de programação C
para SQL).
26
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
3.2 Instalação
3.2.1 MySQL
shell> apt-cache search mysql-server
A saída será semelhante a esta:
mysql-server - empty transitional package
mysql-server-4.1 - empty transitional package
mysql-server-5.0 - mysql database server binaries
phpbb2-conf-mysql - Automatic configurator for phpbb2 on MySQL database
scoop - Web-based collaborative media application
webmin-mysql - mysql-server control module for webmin
A útlima versão do MySQL-server neste exemplo é a 5.0 . Agora para instalar basta digitar-
mos o comando:
shell> apt-get install mysql-server-5.0
A saída será semelhante a esta:
Lendo Lista de Pacotes... Pronto
Construindo Árvore de Dependências... Pronto
Os pacotes extra a seguir serão instalados:
gcc-4.0-base libdbd-mysql-perl libdbi-perl
libgcc1 libmysqlclient15 libncurses5 libnet-daemon- erl libplrpc-perl
libreadline4 libreadline5 libstdc++6 mysql-client-5.0 mysql-common readline-common
Pacotes sugeridos :
dbishell libcompress-zlib-perl
Os NOVOS pacotes a seguir serão instalados:
gcc-4.0-base libdbd-mysql-perl libdbi-perl
libmysqlclient15 libnet-daemon-perl libplrpc-perl libstdc++6 mysql-client-5.0
mysql-common mysql-server-5.0 readline-common
Os pacotes a seguir serão atualizados :
libgcc1 libncurses5 libreadline4 libreadline5
4 pacotes atualizados, 11 pacotes novos instalados,
0 a serem removidos e 712 não atualizados.
É preciso fazer o download de 26,9MB de arquivos.
Depois de desempacotamento, 59,4MB adicionais de espaço em disco serão usados.
Quer continuar? [S/n]
Digite S para que os pacotes sejam recebidos.
Uma tela de configuração aparecerá, bastando continuar. Pronto, seu Banco de Dados esta
pronto para ser utilizado!
3.2.2 Visão Detalhada da Instalação
1. Baixe o arquivo com o código fonte do MySQL em
27
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-5.0.22.tar.gz/from/
http://www.linorg.usp.br/mysql/
Este é um servidor brasileiro. Caso haja algum problema acesse
http://dev.mysql.com/downloads/mysql/5.0.html.
2. Acesse o terminal e escolha um diretório para descompacatar o arquivo tar.gz baixado.
3. Distribuições fontes do MySQL são fornecidas como arquivos .tar compactados e tem
nomes como mysql-versão.tar.gz. Dentro do diretório escolhido para instalação digite o comando:
tar xvzf mysql-versão.tar.gz
4. Adicione um usuário e grupo para o mysql executar assim:
groupadd mysql
useradd -g mysql mysql
Useradd e groupadd podem mudar em diferentes versões de Unix. Elas podem também ser
chamadas adduser e addgroup. Você pode escolher outros nomes para o usuário e grupo em
vez de mysql.
6. Acesse o diretório onde o arquivo foi descompactado:
cd diretorio
7. Configure e compile tudo:
./configure --prefix=/usr/local/mysql
make
Obs.: –prefix indicará o diretório onde os arquivos binários ficarão armazenados. Neste ponto
o mysql já está operacional, porém não está instalado no diretório padrão do sistema.
8. Instalar tudo:
make install
Você deve executar este comando como root.
9. Crie as tabelas de permissões do MySQL.
bin/mysql_install_db
10. Altere o dono dos binários para root e do diretório de dados para o usuário que irá executar
o mysqld:
chown -R root /usr/local/mysql
chown -R mysql /usr/local/mysql/var
chgrp -R mysql /usr/local/mysql
O primeiro comando altera o atributo de propriedade dos arquivos para o usuário root, o
segundo altera o atributo de propriedade do diretório de dados para o usuário mysql, e o terceiro
altera o atributo de grupo para o grupo mysql.
11. Inicie o servidor MySQL com o seguinte comando:
/usr/local/mysql/bin/mysqld_safe --user=mysql &
28
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
3.2.3 Instalando ambiente Java e JDBC
Esta lição irá auxiliá-lo a instalar o ambiente de desenvolvimento JDBC. Para isso siga os
seguintes passos:
1. Instale a versão mais atualizada da plataforma Java em sua máquina. Você poderá encon-
trar a última versão de Java aqui:
http://java.sun.com/products/JDK/CurrentRelease
Ou você poderá optar por:
# aptitude install sun-java5-jdk
Aí ele irá baixar os pacotes: gsfonts-x11 java-common libltdl3 odbcinst1debian1 sun-java5-bin
sun-java5-demo sun-java5-jdk sun-java5-jre unixodbc.
Aceite os termos da SUN.
Dê uma conferida aí:
# java -version
java version "1.5.0_10"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_10-b03)
Java HotSpot(TM) Client VM (build 1.5.0_10-b03, mixed mode, sharing)
Agora já podemos usar o javac, mas vamos passar um pouco disso.
2.Instale o driver.
Um driver JDBC pode vir de várias fontes tais como: softwares de banco de dados, do pró-
prio Java DB, Oracle, MySQL e etc. Normalmente o driver deverá conter instruções para a sua
instalação.
3.2.4 Tipos de Drivers JDBC
Tipo 1 - Driver Ponte JDBC-ODBC
São drivers que implementam a API JDBC como um mapa de acesso conectando-se a uma
outra API. Estes tipos de drivers são geralmente dependentes de bibliotecas nativas, o que limita
a portabilidade.
Tipo 2 - Driver API-Nativa Parcialmente Java
É uma "casca"sobre uma implementação nativa de um driver de acesso ao banco. São drivers
escritos parcialmente em Java e parcialmente pelo seu código nativo. Um erro neste driver nativo
pode derrubar a JVM e também tem portabilidade reduzida.
Tipo 3 - Driver Java c/ Net-Protocol
Usa cliente puramente Java utilizando um middleware para a conexão com o banco de dados.
Tipo 4 - Driver Java Puro
Driver totalmente implementado em Java. Conhece todo o protocolo de comunicação com o
BD e pode acessar o BD sem software extra. É o tipo de driver mais indicado.
29
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
3.2.5 Instalando o driver para MySQL em sua máquina
Baixe direto neste link:
http://download.softagency.net/MySQL/Downloads
/Connector-J/mysql-connector-java-5.0.7.zip
Após baixar descompacte numa pasta qualquer. Abra a pasta que foi criada e copie o arquivo
mysql-connector-java-5.0.7-bin.jar para a pasta de instalação do java (JDK) e coloque dentro de
jre/lib/ext. No meu caso a pasta é a seguinte:
/usr/lib/jvm/java-1.5.0-sun/jre/lib/ext
Instale um Gerenciador de Banco de Dados caso necessite ou use somente o terminal.
3.3 Bases e passos para Conexão com Banco de Dados Java
Antes de criar uma conexão JDBC com o BD é necessário importar o pacote "java.sql", exem-
plo:
import java . sql . * ;
O asterisco(*) indica que todas as classes pertencentes ao pacote java.sql serão importadas.
1. Carregando o driver do BD.
Neste passo do processo de conexão com o JDBC nós iremos carregar a classe driver atra-
vés da seguinte chamada: Class.forName(), onde o "nome"da classe driver é passado como
argumento. Ou seja, a String passada ao método forName() é o nome completo qualificado da
classe que implementa o Driver JDBC de cada banco de dados. Cada driver possui um nome
diferente, consulte a documentação do fabricante. Desta forma o carregamento do driver é feito
de forma dinâmica (via Class.forName), dando flexibilidade ao código. Para maior flexibilidade, o
nome poderia estar contido em um arquivo de configuração externo, podendo ser alterado sem a
necessidade de recompilar o fonte Java. Depois de carregado, a classe driver cria uma instância
de si mesma. A partir dai, um cliente poderá conectar-se ao servidor do banco de dados através
do driver.
Para a aplicação Java comunicar-se com um banco de dados e acessar os seus dados, uma
conexão com o BD deve ser estabelecida da seguinte forma:
• carregamento do driver JDBC específico;
• criação da conexão com o BD.
A partir da conexão é possível interagir com o BD, fazendo consultas, atualização e busca a
informações.
try {
Class . forName ( "com.mysql.jdbc.Driver" ) ; / / Ou qualquer outro d r i v e r
}
catch ( Exception x ) {
5 System . out . p r i n t l n ( " Não foi possível carregar o driver!" ) ;
}
Após ter carregado o driver é possível fazer então a conexão com o BD.
30
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
2.Criando a conexão
A classe JDBC DriverManager define objetos que podem conectar aplicações Java ao driver
JDBC. O DriverManager é considerado a espinha dorsal(backbone) da arquitetura JDBC, é ele
quem gerencia quais drivers estão instalados no sistema. Quando um cliente requisita uma co-
nexão e determina qual a URL, o DriverManager é que reconhece a URL e encontra o driver a
ser usado para criar a conexão com o servidor. Uma aplicação pode estabelecer várias conexões
com uma única base de dados, já uma conexão JDBC representa uma sessão com uma base
de dados específica e, neste contexto de conexão, é que os parâmetros escritos em SQL são
executados e resultados são retornados. Seu método getConnection(), juntamente com o geren-
ciamento do nome do usuário, senha e da URL JDBC estabelece a conexão retornando o objeto
da mesma.
Existe outra interface também muito utilizada chamada DataSource, que permite detalhar me-
lhor a fonte de dados da camada superior tornando a aplicação mais transparente.
Sintaxe JDBC URL:
jdbc : <nomedoBanco>:<subnome>[ ListadePropriedades ]
O <nomedoBanco> é a parte da URL que identifica o BD específico. Um BD pode estar em di-
ferentes lugares tais como: no diretórito de trabalho, na CLASSPATH, em um arquivo JAR, em um
Java DB ou em qualquer lugar do seu sistema. Cada BD pode conter também um subprotocolo
que é específico, mas que vem determinado no manual de uso e documentação do driver.
• Cada driver tem seu próprio subprotocolo;
• Cada subprotocolo tem sua própria sintaxe para a fonte.
String u r l = "jdbc:mysql://localhost:3306/mysql"
try {
Connection dbConnection = DriverManager . getConnection ( url , "usuario" ,"senha" ) ;
}
5 catch ( SQLException x ) {
System . out . p r i n t l n ( "Não foi possível estabelecer a conexão!" ) ;
}
No exemplo anterior nota-se que primeiramente foi atribuído à variável "url"a própria url de
conexão com o banco. Em seguida, dentro do bloco de captura de erros "try"criou-se a conexão
com o banco, sendo passado como parâmetros para DriverManager.getConnection respectiva-
mente a url, o nome de usuário e senha do utilizador da base de dados. Ao final, tem-se a captura
de erros pelo bloco "catch", caso a conexão não seja estabelecida.
As principais classes e interfaces do pacote java.sql são:
• DriverManager - gerencia o driver e cria uma conexão com o banco;
• Connection - classe que representa a conexão com o bando de dados;
• Statement - controla e executa uma instrução SQL;
• CallableStatement - representa um procedimento armazenado. Pode ser usado para exe-
cutar procedimentos armazenados em um RDBMS que os suportam;
31
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
• PreparedStatement - controla e executa uma instrução SQL. Pode ser mais adequada do
que a Statement por ser mais ágil e adequado para comandos usados várias vezes;
• ResultSet - contém o conjunto de dados retornado por uma consulta SQL;
• ResultsetMetaData - classe que trata dos metadados do banco;
• SQLException - classe para exceções, encapsula erros básicos de banco de dados.
A interface Connection possui os métodos para criar um Statement, fazer o commit ou roll-
back de uma transação, verificar se o auto commit está ligado e poder ligá-lo ou desligá-lo, etc.
As interfaces Statement e PreparedStatement possuem métodos para executar comandos SQL.
ResultSet possui método para recuperar os dados resultantes de uma consulta, além de retornar
os metadados da consulta. ResultsetMetaData possui métodos para recuperar as meta informa-
ções do banco.
Com a conexão estabelecida já é possível interagir com o BD de várias formas:
• criar tabelas e outros elementos;
• inserir, alterar e remover registros;
• buscar registros;
• buscar as meta-dados do banco.
As três primeiras interações se dão por meio das interfaces Statement ou PreparedStatement,
que veremos a seguir. Todos os exemplos estão baseados no uso do driver JDBC fornecido pela
MySQL. Porém, os mesmos exemplos podem ser usados com qualquer banco de dados rela-
cional que possua um driver JDBC, necessitando apenas trocar o nome do driver e a URL de
conexão. Lembrando que o JAR do driver JDBC, fornecido pelo fabricante, precisa ser disponibi-
lizado no CLASSPATH da aplicação.
3. Criando objetos de Statement
Para executar comandos SQL é necessário, primeiramente, instanciar um objeto de Statement
através do método createStatement() de Connection, o qual retorna um objeto Statement, que é
usado para executar um comando SQL no BD. O método executeUpdate() de Statement recebe o
SQL que será executado. Este método deve ser usado para DDLs e comandos SQL de INSERT,
UPDATE ou DELETE. Depois os métodos close() de Statement e Connection são invocados para
liberar os recursos. Porém, o Statement só pode ser liberado com o método close() ao final das
execuções de todos os comandos SQL.
/ / Criando a conexão
Statement statement = dbConnection . createStatement ( ) ;
/ / Fechando a conexão
5 statement . close ( ) ;
dbConnection . close ( ) ;
Três tipos de Statements
• Statement: executa comandos simples de SQL sem parâmetros.
32
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
Statement createStatement ( ) ;
• Prepared Statement: executa comandos SQL pré-compilados com ou sem parâmetros,
agilizando sua execução e sendo útil para comandos executados repetidas vezes;
prepareStatement ( String sql ) ; / / Retorna um novo objeto de PreparedStatement
• Callable Statement: executa uma chamada a procedimentos SQL contidos na base de
dados. Esses procedimentos são um grupo de comandos SQL que formam uma unidade
lógica e que executam tarefas específicas, além de serem usados para encapsular um con-
junto de operações ou "queries"(consultas) a serem executadas no servidor da base de
dados. O objeto de CallableStatement contém apenas a chamada ao procedimento arqui-
vado, não contendo o próprio procedimento.
CallableStatement prepareCall ( String sql ) ;
/ / Retorna um novo objeto de CallableStatement .
4. Executando comandos SQL através dos objetos de Statement e retornando o
Java ResultSet
A recuperação de dados do BD é trivial e é feita através da execução de uma query SQL,
sendo que os dados podem ser recuperados através da interface ResultSet, retornada na execu-
ção da query(consulta).
Como ja foi dito, a interface Statement define métodos que serão usados para interagir com
o BD pela execução de comandos SQL. A classe Statement possui três métodos para executar
comandos: executeQuery(), executeUpdate(), and execute(). Para um comando SELECT, usa-se
o método executeQuery. Para comandos que criam ou modificam tabelas o método a ser usado
é o executeUpdate.
Nota: Comandos para criar, alterar ou deletar uma tabela são executados como métodos
executeUpdate, sendo exemplos de comandos DDL(Linguagem de Definição de Dados). Uma
DDL permite ao usuário definir tabelas novas e elementos associados. A maioria dos bancos de
dados de SQL tem extensões proprietárias no DDL. O execute() executa um comando SQL que
foi escrito como um objeto de String.
3.4 Obtendo valores com ResultSet
As linhas que satisfazem uma determinada consulta são chamadas "Result set". O número
de linhas retornadas pelo ResultSet pode ser zero ou mais. Um usuário pode acessar arquivos
provenientes de ResultSet usando um cursor que percorre uma linha do topo ao início. Um cursor
pode apontar para as linhas do ResultSet, tendo a habilidade de determinar o caminho pelo qual
a linha está sendo acessada naquele momento. A API JDBC suporta um cursor capaz de se
mover em ambas as direções (para frente e para trás) e, ainda, permitindo que o cursor se mova
para uma linha específica ou para uma linha que esteja em uma posição em relação a outra linha.
33
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
A interface ResultSet provê métodos para obtenção e manipulação dos resultados de consul-
tas. Os objetos de ResultSet podem ter diferentes funcionalidades e características tais como
tipicidade, concorrência e controlabilidade do cursor.
O ResultSet provê acesso a uma tabela de dados gerada pela execução do Statement. As
linhas da tabela são tomadas em sequência. O ResultSet mantém o cursor apontando para a
linha atual do arquivo. O método next() de ResultSet é usado para mover o cursor para a próxima
linha do registro. Este método retorna false caso não existam mais registros e retorna true caso
contrário. Os valores dos registros podem ser recuperados com o método getString(), que recebe
o nome do campo ou seu "alias"(campo).
3.4.1 Tipos de ResultSet
O tipo de objeto de ResultSet determina o nível de sua funcionalidade em dua áreas. Na
forma como o cursor pode ser manipulado e em como mudança atuais feitas em arquivos fonte
subjacentes são refletidas pelos objetos de ResultSet. A sensibilidade do objeto de ResultSet é
determinada por um dos seguintes tipos:
• TYPE_FORWARD_ONLY - o ResultSet neste caso é unidirecional, sendo que o cursor se
move apenas para frente, da primeira até a última linha;
• TYPE_SCROLL_INSENSITIVE - o ResultSet neste caso é multidirecional, sendo que seu
cursor pode mover-se em ambos os sentidos(para frente e para trás) e também pode se
mover em uma posição absoluta(determinada).
• TYPE_SCROLL_SENSITIVE - o ResultSet neste caso também é multidirecional, sendo que
seu cursor pode se mover em ambos os sentidos (para frente e para trás) e, ainda, pode
mover-se para uma posição absoluta(determinada).
Agora você irá ver como mandar comandos SELECT para um programa escrito na linguagem
de programação JAVA e como obter os resultados visualizáveis. Antes de usar os benefícios
desses tipos é necessário que você crie um objetos multidirecional de ResultSet. O seguinte
código ilustra como criar esse tipo de objeto.
Statement stmt = con . createStatement ( ResultSet .TYPE_SCROLL_SENSITIVE,
ResultSet .CONCUR_READ_ONLY) ;
ResultSet srs = stmt . executeQuery ( "....." ) ;
O primeiro argumento é uma das três constantes adicionadas a API de ResultSet para indicar
o tipo de objeto de ResultSe. Seja TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE e
TYPE_SCROLL_SENSITIVE. Já o segundo argumento é uma das duas constantes para espe-
cificar se um ResultSet é read-only(apenas leitura) ou atualizável. Seja CONCUR_READ_ONLY
e CONCUR_UPDATABLE. Se você não especificar uma constante para o tipo e para atualização
do objeto de ResultSet, então será usado automaticamente os tipos TYPE_FORWARD_ONLY e
CONCUR_READ_ONLY.
3.4.2 Métodos de ResultSet
Além do método getString(), a interface ResultSet dispõe de vários outros métodos que recu-
peram dados do BD diretamente nos tipos mais adequados. Esses métodos recebem o nome do
34
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
alias ou o número do campo no select, iniciando-se por um(1). Quando um objeto de ResultSet
é criado, o cursor é posicionado antes da primeira linha. Para mover o cursor são utilizados os
seguintes métodos:
• next() - move o cursor para frente uma linha. Este método retorna false caso não existam
mais registros e retorna true caso contrário;
• previous() - move o cursor para trás uma linha. Este método retorna true se o cursor está
posicionado em uma linha e falso caso o cursor esteja posicionado antes da primeira linha;
• first() - move o cursor para a primeira linha no objeto de ResultSet. Retorna true se o cursor
estiver posicionado na primeira linha e false se o objeto de ResultSet não tiver nenhuma
linha;
• last() - move o cursor para a última linha do objeto de ResultSet. Retorna true se o cursor
estiver posicionado na última linha e false se o objeto de ResultSet não tiver nenhuma linha;
• beforeFirst() - posiciona o cursor no início do objeto de ResultSet, antes da primeira linha.
Se o objeto de ResultSet não tiver nenhuma linha este método não terá efeito algum;
• afterLast() - posiciona o cursor ao final o objeto de ResultSet, depois da última linha. Se o
objeto de ResultSet não tiver nenhuma linha este método não terá efeito algum;
• relative(int rows) - mover o cursor para posição relativa à atual posição;
• absolute(int n) - posiciona o cursor para a linha "n"do objeto de ResultSet;
Métodos de getxxx
Métodos de ResultSet Tipos de dados SQL
getInt() Integer
getLong() Big int
getFloat() Real
getDouble() Float
getBignum() Decimal
getBoolean() Bit
getString() Char, Varchar
getDate() Date
getTime() Time
getTimestamp() Time stamp
getObject() Qualquer Tipo
3.4.3 Metadados
Existe, ainda, a interface ResultSetMetaData que contém informações sobre os tipos e pro-
priedades das linhas de ResultSet. Ela pode lhe fornecer informações como número de colunas
recebidas, nome, tipo de colunas, se as colunas aceitam dados nulos, campos de data e etc.
A classe ResultSetMetaData é construída pelo objeto de Connection e pode ser criada da se-
guinte maneira:
ResultSet rs = stmt . executeQuery ( query ) ;
ResultSetMetaData meta = rs . getMetaData ( ) ;
35
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
3.5 Criando Tabelas com comandos SQL
Pode-se criar tabelas de várias maneiras. Seja usando o banco de dados em linha de co-
mando ou IDE interface gráfica, ou ainda, usando JDBC SQL escrito em um aplicativo(essa será
a forma abordada). Tabelas são compostas de linhas e colunas. Cada linha representa um ar-
quivo no banco de dados. Colunas são também conhecidas como campos ou atributos.
Você pode relacionar uma tabela com outra no banco de dados pela comparação de uma
coluna com o valor de uma outra coluna de uma outra tabela. Se as tabelas não tiverem colunas
em comum, então não há como relacionar as tabelas. Por ser possível conectar essas tabelas
pode-se extrair dados de tabelas múltiplas com uma única consulta, isso se seu mecanismo de
consulta suportar aquele tipo de consulta.
Para executar consultas ou atualizações utilizando o objeto Statement os comandos são:
QUERY (SELECT)
ResultSet rs = statement . executeQuery ( "select * from Empregados" ) ;
ACTION COMMAND (UPDATE/DELETE)
5 int iReturnValue = statement . executeUpdate ( "update Pedidos
set Prodnome = ?CAIXA' where Prod_ID = 1234567" ) ;
Para integrar as tabelas em um único banco, você precisará ter certeza de que cada tabela tem
uma coluna que contém um valor único para aquela tabela. Essa coluna específica é chamada
chave. Logo abaixo segue um programa JDBC que mostra o uso de executeUpdate() para criação
de tabelas.
Empregado_ID eh chave primária que forma a relação entre as duas tabelas.
import javax . swing . JOptionPane ;
import java . sql . * ;
public class JDBCCriandoTabela {
5 / / JDBC Criando Tabelas
static String userid="" , password = "" ;
static String u r l = "jdbc:mysql://localhost:3306/dbexemplo" ; / / String u r l
= " jdbc : mySubprotocol : myDataSource " ;
static Statement stmt ;
static Connection con ;
10 public static void main ( String args [ ] ) {
JOptionPane . showMessageDialog ( null , "Programaçãoo JDBC mostrando
Criação de Tabelas" ) ;
int escolha = −1;
15 do{
escolha = pegueEscolha ( ) ;
i f ( escolha != 0) {
pegueSelecionados ( escolha ) ;
}
20 }
while ( escolha != 0) ;
System . e x i t (0) ;
}
25 public static int pegueEscolha ( )
{
36
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
String escolha ;
int esco ;
escolha = JOptionPane . showInputDialog ( null ,
30 "1. create Empregados Tablen"+
"2. Cria Tabela Produtosn"+
"0. Exit(Sair)nn"+
"Entre com sua escolha" ) ;
esco = Integer . parseInt ( escolha ) ;
35 return esco ;
}
public static void pegueSelecionados ( int escolha ) {
40 i f ( escolha ==1) {
criaEmpregados ( ) ;
}
i f ( escolha ==2) {
criaPedidos ( ) ;
45 }
}
public static Connection getConnection ( )
{
50
try {
Class . forName ( "com.mysql.jdbc.Driver" ) ; / / Class . forName ( "
myDriver . ClassName " ) ;
} catch ( java . lang . ClassNotFoundException e ) {
55 System . err . p r i n t ( "ClassNotFoundException: " ) ;
System . err . p r i n t l n ( e . getMessage ( ) ) ;
}
try {
60 con = DriverManager . getConnection ( url , userid , password ) ;
} catch ( SQLException ex ) {
System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
}
65
return con ;
}
/ *CREATE TABLE Empregados (
70 Empregado_ID INTEGER,
Nome VARCHAR(30)
) ; * /
public static void criaEmpregados ( )
{
75 Connection con = getConnection ( ) ;
String c r i a S t r i n g ;
c r i a S t r i n g = "create Empregados Table (" +
"Empregado_ID INTEGER, " +
80 "Nome VARCHAR(30))" ;
try {
stmt = con . createStatement ( ) ;
stmt . executeUpdate ( c r i a S t r i n g ) ;
stmt . close ( ) ;
37
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
85 con . close ( ) ;
} catch ( SQLException ex ) {
System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
}
90 JOptionPane . showMessageDialog ( null , "Tabela Empregados Criada" ) ;
}
/ *CREATE TABLE Pedidos (
Prod_ID INTEGER,
95 ProdutoNome VARCHAR(20) ,
Empregado_ID INTEGER
) ; * /
public static void criaPedidos ( )
100 {
Connection con = getConnection ( ) ;
String c r i a S t r i n g ;
c r i a S t r i n g = "create Pedidos Table (" +
105 "Prod_ID INTEGER, " +
"ProdutoNome VARCHAR(20), "+
"Empregado_ID INTEGER )" ;
110 try {
stmt = con . createStatement ( ) ;
stmt . executeUpdate ( c r i a S t r i n g ) ;
stmt . close ( ) ;
115 con . close ( ) ;
} catch ( SQLException ex ) {
System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
}
120 JOptionPane . showMessageDialog ( null , "Pedidos Table Criada" ) ;
}
} / / Fim da Classe
3.6 Obtendo Dados de tabelas SQL
Nós podemos usar comandos SELECT em um programa Java para obter dados e imprimi-los
para as respectivas tabelas. O JDBC retorna resultados em objetos de ResultSet, por isso é pre-
ciso declarar um instância da classe ResultSet para manter os resultados. SELECT é a palavra
chave SQL que executa a consulta. Invocamos o método executeQuery(), usando o comando
texto como um parâmetro. O resultado da consulta é capturado em resultados do objeto de Re-
sultSet. Note que o executeQuery() sempre retorna um ResultSet, embora não seja necessário
haver quaisquer linhas.
O valor retornado por uma executeQuery é um objeto de ResultSet contendo o resultado da
consulta enviada pelo DBMS. Lembre-se também que para proceder para as próximas linhas de
ResultSet usamos o método next(), que move o ponteiro através das linhas de dados. O ResultSet
38
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
mantém o cursor apontando para a linha atual. Pelo fato do cursor estar posicionado inicialmente
antes da primeira linha, precisamos antes chamar netx() para visualizar as colunas. Logo abaixo
segue um programa JDBC que mostra o uso de executeUpdate() para obtenção de valores de
ResultSet.
import javax . swing . JOptionPane ;
import java . sql . * ;
public class JDBCObtendoDados{
5 / / JDBC Obtendo Dados da Tabela
static String userid="" , password = "" ;
static String u r l = "jdbc:mysql://localhost:3306/dbexemplo" ;
/ / String u r l = " jdbc : mySubprotocol : myDataSource " ;
static Statement stmt ;
10 static Connection con ;
public static void main ( String args [ ] ) {
JOptionPane . showMessageDialog ( null ,
"Programação JDBC mostrando Obtenção de Dados de Tabelas" ) ;
15 int escolha = −1;
do{
escolha = pegueEscolha ( ) ;
i f ( escolha != 0) {
20 pegueSelecionados ( escolha ) ;
}
}
while ( escolha != 0) ;
System . e x i t (0) ;
25 }
public static int pegueEscolha ( )
{
String escolha ;
30 int esco ;
escolha = JOptionPane . showInputDialog ( null ,
"1. Crie Tabela Empregadosn"+
"2. Crie Tabela Produtosn"+
"3. Insira dados na Tabela Empregadosn"+
35 "4. Insira dados na Tabela Pedidosn"+
"5. Obtenha dados da Tabela Empregadosn"+
"6. Obtenha dados da Tabela Pedidosn"+
"0. Exit(sair)nn"+
"Entre com sua escolha" ) ;
40 esco = Integer . parseInt ( escolha ) ;
return esco ;
}
45 public static void pegueSelecionados ( int escolha ) {
i f ( escolha ==1) {
criaEmpregados ( ) ;
}
i f ( escolha ==2) {
50 criaPedidos ( ) ;
}
i f ( escolha ==3) {
insiraEmpregados ( ) ;
}
39
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
55 i f ( escolha ==4) {
insiraPedidos ( ) ;
}
i f ( escolha ==5) {
obtenhaEmpregados ( ) ;
60 }
i f ( escolha ==6) {
obtenhaPedidos ( ) ;
}
}
65
public static Connection getConnection ( )
{
try {
70 Class . forName ( "sun.jdbc.odbc.JdbcOdbcDriver" ) ;
/ / Class . forName ( " myDriver . ClassName " ) ;
} catch ( java . lang . ClassNotFoundException e ) {
System . err . p r i n t ( "ClassNotFoundException: " ) ;
75 System . err . p r i n t l n ( e . getMessage ( ) ) ;
}
try {
con = DriverManager . getConnection ( url ,
80 userid , password ) ;
} catch ( SQLException ex ) {
System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
}
85
return con ;
}
/ *CREATE TABLE Empregados (
90 Empregado_ID INTEGER,
Nome VARCHAR(30)
) ; * /
95 public static void criaEmpregados ( )
{
Connection con = getConnection ( ) ;
String c r i a S t r i n g ;
100 c r i a S t r i n g = "create Empregados Table (" +
"Empregado_ID INTEGER, " +
"Nome VARCHAR(30))" ;
try {
stmt = con . createStatement ( ) ;
105 stmt . executeUpdate ( c r i a S t r i n g ) ;
stmt . close ( ) ;
con . close ( ) ;
} catch ( SQLException ex ) {
110 System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
}
JOptionPane . showMessageDialog ( null , "Tabela Empregados Criada" ) ;
}
40
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
115 / *CREATE TABLE Pedidos (
Prod_ID INTEGER,
ProdutoNome VARCHAR(20) ,
Empregado_ID INTEGER
) ; * /
120
public static void criaPedidos ( )
{
Connection con = getConnection ( ) ;
125 String c r i a S t r i n g ;
c r i a S t r i n g = "create Pedidos Table (" +
"Prod_ID INTEGER, " +
"ProdutoNome VARCHAR(20), "+
"Empregado_ID INTEGER )" ;
130
try {
stmt = con . createStatement ( ) ;
stmt . executeUpdate ( c r i a S t r i n g ) ;
135
stmt . close ( ) ;
con . close ( ) ;
} catch ( SQLException ex ) {
140 System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
}
JOptionPane . showMessageDialog ( null , "Tabela Pedidos Criada" ) ;
}
145 / * Empregado_ID Nome
6323 Helmuth
5768 Banderas
1234 Savio
5678 Michel * /
150 public static void insiraEmpregados ( )
{
Connection con = getConnection ( ) ;
String insiraString1 , insiraStr ing 2 , i ns iraStri ng 3 , i n s i r a S t r i n g 4 ;
155 i n s i r a S t r i n g 1 = "insert into Empregados values(6323, 'Helmuth')" ;
i n s i r a S t r i n g 2 = "insert into Empregados values(5768, 'Banderas')" ;
i n s i r a S t r i n g 3 = "insert into Empregados values(1234, 'Savio')" ;
i n s i r a S t r i n g 4 = "insert into Empregados values(5678, 'Michel')" ;
160
try {
stmt = con . createStatement ( ) ;
stmt . executeUpdate ( i n s i r a S t r i n g 1 ) ;
stmt . executeUpdate ( i n s i r a S t r i n g 2 ) ;
165 stmt . executeUpdate ( i n s i r a S t r i n g 3 ) ;
stmt . executeUpdate ( i n s i r a S t r i n g 4 ) ;
stmt . close ( ) ;
con . close ( ) ;
170
} catch ( SQLException ex ) {
System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
41
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
}
JOptionPane . showMessageDialog ( null , "Dados Inseridos na Tabela
Empregados" ) ;
175 }
/ * Prod_ID ProdutoNome Empregado_ID
543 Cinto 6323
432 Garrafa 1234
180 876 Anel 5678
* /
public static void insiraPedidos ( )
{
Connection con = getConnection ( ) ;
185
String insiraString1 , insiraStr ing 2 , i ns iraStri ng 3 , i n s i r a S t r i n g 4 ;
i n s i r a S t r i n g 1 = "insert into Pedidos values(543, 'Cinto', 6323)" ;
i n s i r a S t r i n g 2 = "insert into Pedidos values(432, 'Garrafa', 1234)" ;
i n s i r a S t r i n g 3 = "insert into Pedidos values(876, 'Anel', 5678)" ;
190
try {
stmt = con . createStatement ( ) ;
stmt . executeUpdate ( i n s i r a S t r i n g 1 ) ;
195 stmt . executeUpdate ( i n s i r a S t r i n g 2 ) ;
stmt . executeUpdate ( i n s i r a S t r i n g 3 ) ;
stmt . close ( ) ;
con . close ( ) ;
200
} catch ( SQLException ex ) {
System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
}
JOptionPane . showMessageDialog ( null , "Dados Inseridos na Tabela Pedidos"
) ;
205 }
public static void obtenhaEmpregados ( ) {
Connection con = getConnection ( ) ;
String r e s u l t = null ;
210 String selecioneString ;
selecioneString = "select * from Empregados" ;
r e s u l t ="Empregado_IDttNomen" ;
try {
stmt = con . createStatement ( ) ;
215 ResultSet rs = stmt . executeQuery ( selecioneString ) ;
while ( rs . next ( ) ) {
int id = rs . g e t I n t ( "Empregado_ID" ) ;
String nome = rs . getString ( "Nome" ) ;
r e s u l t += id+"tt"+ nome+"n" ;
220 }
stmt . close ( ) ;
con . close ( ) ;
} catch ( SQLException ex ) {
225 System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
}
JOptionPane . showMessageDialog ( null , r e s u l t ) ;
}
42
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
230 public static void obtenhaPedidos ( ) {
Connection con = getConnection ( ) ;
String r e s u l t = null ;
String selecioneString ;
selecioneString = "select * from Pedidos" ;
235 r e s u l t ="Prod_IDttProdutoNomettEmpregado_IDn" ;
try {
stmt = con . createStatement ( ) ;
ResultSet rs = stmt . executeQuery ( selecioneString ) ;
while ( rs . next ( ) ) {
240 int pr_id = rs . g e t I n t ( "Prod_ID" ) ;
String prodNome = rs . getString ( "ProdutoNome" ) ;
int id = rs . g e t I n t ( "Empregado_ID" ) ;
r e s u l t +=pr_id+"tt"+ prodNome+"tt"+id+"n" ;
}
245 stmt . close ( ) ;
con . close ( ) ;
} catch ( SQLException ex ) {
System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
250 }
JOptionPane . showMessageDialog ( null , r e s u l t ) ;
}
} / / Fim da Classe
43
Capítulo 4
CONCEITOS AVANÇADOS
Como usar Inserções, atualizar Tabelas, melhorar a performance, capturar erros e advertên-
cias, usar Transactions, Roll Backs e Savepoints.
4.1 Inserindo Dados em Tabelas SQL
Nós iremos inserir dados nas tabelas Empregados e Ordem criadas anteriormente. Será uma
linha de cada vez para fornecer a informação a ser armazenada em cada coluna daquela linha.
Os valores a serem inseridos nas colunas são listados na mesma ordem em que as colunas foram
declaradas quando a tabela foi criada. Logo abaixo segue um programa JDBC que mostra o uso
de executeUpdate() para criação de tabela e inserção de dados na mesma.
import javax . swing . JOptionPane ;
import java . sql . * ;
public class JDBCInserindoDados {
5 / / JDBC Exemplo de Insercao
static String userid="" , password = "" ;
static String u r l = "jdbc:mysql://localhost:3306/dbexemplo" ; / / String u r l
= " jdbc : mySubprotocol : myDataSource " ;
static Statement stmt ;
static Connection con ;
10 public static void main ( String args [ ] ) {
JOptionPane . showMessageDialog ( null , "Programação JDBC mostrando Inserção de
Dados em Tabelas" ) ;
int escolha = −1;
15 do{
escolha = pegueEscolha ( ) ;
i f ( escolha != 0) {
pegueSelecionados ( escolha ) ;
}
20 }
while ( escolha != 0) ;
System . e x i t (0) ;
}
25 public static int pegueEscolha ( )
{
String escolha ;
44
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
int esco ;
escolha = JOptionPane . showInputDialog ( null ,
30 "1. create Empregados Tablen"+
"2. Cria Tabela Produtosn"+
"3. Insira dados na Tabela Empregadosn"+
"4. Insira dados na Tabela Produtosn"+
"0. Exit(sair)nn"+
35 "Entre com sua escolha" ) ;
esco = Integer . parseInt ( escolha ) ;
return esco ;
}
40
public static void pegueSelecionados ( int escolha ) {
i f ( escolha ==1) {
criaEmpregados ( ) ;
}
45 i f ( escolha ==2) {
criaPedidos ( ) ;
}
i f ( escolha ==3) {
insiraEmpregados ( ) ;
50 }
i f ( escolha ==4) {
insiraPedidos ( ) ;
}
}
55
public static Connection getConnection ( )
{
try {
60 Class . forName ( "com.mysql.jdbc.Driver" ) ; / / Class . forName ( "
myDriver . ClassName " ) ;
} catch ( java . lang . ClassNotFoundException e ) {
System . err . p r i n t ( "ClassNotFoundException: " ) ;
System . err . p r i n t l n ( e . getMessage ( ) ) ;
65 }
try {
con = DriverManager . getConnection ( url ,
userid , password ) ;
70
} catch ( SQLException ex ) {
System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
}
75 return con ;
}
/ *CREATE TABLE Empregados (
Empregado_ID INTEGER,
80 Nome VARCHAR(30)
) ; * /
public static void criaEmpregados ( )
85 {
45
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
Connection con = getConnection ( ) ;
String c r i a S t r i n g ;
c r i a S t r i n g = "create Empregados Table (" +
90 "Empregado_ID INTEGER, " +
"Nome VARCHAR(30))" ;
try {
stmt = con . createStatement ( ) ;
stmt . executeUpdate ( c r i a S t r i n g ) ;
95 stmt . close ( ) ;
con . close ( ) ;
} catch ( SQLException ex ) {
System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
100 }
JOptionPane . showMessageDialog ( null , "Tabela Empregados Criada" ) ;
}
/ *CREATE TABLE Pedidos (
105 Prod_ID INTEGER,
ProdutoNome VARCHAR(20) ,
Empregado_ID INTEGER
) ; * /
110 public static void criaPedidos ( )
{
Connection con = getConnection ( ) ;
String c r i a S t r i n g ;
115 c r i a S t r i n g = "create Pedidos Table (" +
"Prod_ID INTEGER, " +
"ProdutoNome VARCHAR(20), "+
"Empregado_ID INTEGER )" ;
120
try {
stmt = con . createStatement ( ) ;
stmt . executeUpdate ( c r i a S t r i n g ) ;
125 stmt . close ( ) ;
con . close ( ) ;
} catch ( SQLException ex ) {
System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
130 }
JOptionPane . showMessageDialog ( null , "Tabela Pedidos Criada" ) ;
}
/ * Empregado_ID Nome
135 6323 Helmuth
5768 Banderas
1234 Savio
5678 Michel * /
public static void insiraEmpregados ( )
140 {
Connection con = getConnection ( ) ;
String insiraString1 , insiraStr ing 2 , i ns iraStri ng 3 , i n s i r a S t r i n g 4 ;
i n s i r a S t r i n g 1 = "insert into Empregados values(6323, 'Helmuth')" ;
46
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
145 i n s i r a S t r i n g 2 = "insert into Empregados values(5768, 'Banderas')" ;
i n s i r a S t r i n g 3 = "insert into Empregados values(1234, 'Savio')" ;
i n s i r a S t r i n g 4 = "insert into Empregados values(5678, 'Michel')" ;
150 try {
stmt = con . createStatement ( ) ;
stmt . executeUpdate ( i n s i r a S t r i n g 1 ) ;
stmt . executeUpdate ( i n s i r a S t r i n g 2 ) ;
stmt . executeUpdate ( i n s i r a S t r i n g 3 ) ;
155 stmt . executeUpdate ( i n s i r a S t r i n g 4 ) ;
stmt . close ( ) ;
con . close ( ) ;
160 } catch ( SQLException ex ) {
System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
}
JOptionPane . showMessageDialog ( null , "Dados Inseridos na Tabela Empregados" ) ;
}
165
/ * Prod_ID ProdutoNome Empregado_ID
543 Cinto 6323
432 Garrafa 1234
876 Anel 5678
170 * /
public static void insiraPedidos ( )
{
Connection con = getConnection ( ) ;
175 String insiraString1 , i nsiraStri ng2 , i ns ira Stri ng3 , i n s i r a S t r i n g 4 ;
i n s i r a S t r i n g 1 = "insert into Pedidos values(543, 'Cinto', 6323)" ;
i n s i r a S t r i n g 2 = "insert into Pedidos values(432, 'Garrafa', 1234)" ;
i n s i r a S t r i n g 3 = "insert into Pedidos values(876, 'Anel', 5678)" ;
180
try {
stmt = con . createStatement ( ) ;
stmt . executeUpdate ( i n s i r a S t r i n g 1 ) ;
stmt . executeUpdate ( i n s i r a S t r i n g 2 ) ;
185 stmt . executeUpdate ( i n s i r a S t r i n g 3 ) ;
stmt . close ( ) ;
con . close ( ) ;
190 } catch ( SQLException ex ) {
System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
}
JOptionPane . showMessageDialog ( null , "Dados Inseridos na Tabela Pedidos" ) ;
}
195 } / / Fim da Classe
4.2 Atualizando Tabelas
Podemos usar os comandos Update em programas Java para atualizar os arquivos de uma
tabela. Logo abaixo segue um programa JDBC que mostra o uso de executeUpdate() para atua-
47
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
lização de uma tabela. O valor retornado por um executeUpdate é do tipo int (inteiro) que indica
quantas linhas da tabelas foram atualizadas.
Exemplo : int n = stmt . executeUpdate ( ) ;
import javax . swing . JOptionPane ;
import java . sql . * ;
5 public class JDBCAtualizandoTabelas {
/ / JDBC Atualizando Tabelas
static String userid="" , password = "" ;
static String u r l = "jdbc:mysql://localhost:3306/dbexemplo" ; / / String u r l
= " jdbc : mySubprotocol : myDataSource " ;
static Statement stmt ;
10 static Connection con ;
public static void main ( String args [ ] ) {
JOptionPane . showMessageDialog ( null , "Programação JDBC mostrando Atualização de
Dados em Tabelas" ) ;
int escolha = −1;
15
do{
escolha = pegueEscolha ( ) ;
i f ( escolha != 0) {
pegueSelecionados ( escolha ) ;
20 }
} while ( escolha != 0) ;
System . e x i t (0) ;
}
25 public static int pegueEscolha ( ) {
String escolha ;
int esco ;
escolha = JOptionPane . showInputDialog ( null ,
30 "1. Crie Tabela Empregadosn"+
"2. Crie Tabela Produtosn"+
"3. Insira dados na Tabela Empregadosn"+
"4. Insira dados na Tabela Pedidosn"+
"5. Obtenha dados da Tabela Empregadosn"+
35 "6. Obtenha dados da Tabela Pedidosn"+
"7. Atualiza dados da Tabela Empregadosn"+
"0. Exit(sair)nn"+
"Entre com sua escolha" ) ;
esco = Integer . parseInt ( escolha ) ;
40 return esco ;
}
public static void pegueSelecionados ( int escolha ) {
45 i f ( escolha ==1) {
criaEmpregados ( ) ;
}
i f ( escolha ==2) {
criaPedidos ( ) ;
50 }
i f ( escolha ==3) {
insiraEmpregados ( ) ;
}
i f ( escolha ==4) {
48
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
55 insiraPedidos ( ) ;
}
i f ( escolha ==5) {
obtenhaEmpregados ( ) ;
}
60 i f ( escolha ==6) {
obtenhaPedidos ( ) ;
}
i f ( escolha ==7) {
atualizaEmpregados ( ) ;
65 }
}
public static Connection getConnection ( ) {
70 try {
Class . forName ( "com.mysql.jdbc.Driver" ) ; / / Class . forName ( " myDriver .
ClassName " ) ;
} catch ( java . lang . ClassNotFoundException e ) {
System . err . p r i n t ( "ClassNotFoundException: " ) ;
75 System . err . p r i n t l n ( e . getMessage ( ) ) ;
}
try {
con = DriverManager . getConnection ( url ,
80 userid , password ) ;
} catch ( SQLException ex ) {
System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
}
85
return con ;
}
/ *CREATE TABLE Empregados (
90 Empregado_ID INTEGER,
Nome VARCHAR(30)
) ; * /
95 public static void criaEmpregados ( ) {
Connection con = getConnection ( ) ;
String c r i a S t r i n g ;
c r i a S t r i n g = "create table Empregados (" +
100 "Empregado_ID INTEGER, " +
"Nome VARCHAR(30))" ;
try {
stmt = con . createStatement ( ) ;
105 stmt . executeUpdate ( c r i a S t r i n g ) ;
stmt . close ( ) ;
con . close ( ) ;
} catch ( SQLException ex ) {
110 System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
}
JOptionPane . showMessageDialog ( null , "Tabela Empregados Criada" ) ;
49
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
}
115 / *CREATE TABLE Pedidos (
Prod_ID INTEGER,
ProdutoNome VARCHAR(20) ,
Empregado_ID INTEGER
) ; * /
120
public static void criaPedidos ( ) {
Connection con = getConnection ( ) ;
String c r i a S t r i n g ;
125 c r i a S t r i n g = "create table Pedidos (" +
"Prod_ID INTEGER, " +
"ProdutoNome VARCHAR(20), "+
"Empregado_ID INTEGER )" ;
130
try {
stmt = con . createStatement ( ) ;
stmt . executeUpdate ( c r i a S t r i n g ) ;
stmt . close ( ) ;
135 con . close ( ) ;
} catch ( SQLException ex ) {
System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
}
140 JOptionPane . showMessageDialog ( null , "Tabela Pedidos Criada" ) ;
}
/ * Empregado_ID Nome
6323 Helmuth
145 5768 Banderas
1234 Savio
5678 Michel * /
public static void insiraEmpregados ( ) {
150
Connection con = getConnection ( ) ;
String insiraString1 , insiraStri ng 2 , in si raStri ng3 , i n s i r a S t r i n g 4 ;
i n s i r a S t r i n g 1 = "insert into Empregados values(6323, 'Helmuth')" ;
i n s i r a S t r i n g 2 = "insert into Empregados values(5768, 'Banderas')" ;
155 i n s i r a S t r i n g 3 = "insert into Empregados values(1234, 'Savio')" ;
i n s i r a S t r i n g 4 = "insert into Empregados values(5678, 'Michel')" ;
try {
160 stmt = con . createStatement ( ) ;
stmt . executeUpdate ( i n s i r a S t r i n g 1 ) ;
stmt . executeUpdate ( i n s i r a S t r i n g 2 ) ;
stmt . executeUpdate ( i n s i r a S t r i n g 3 ) ;
stmt . executeUpdate ( i n s i r a S t r i n g 4 ) ;
165 stmt . close ( ) ;
con . close ( ) ;
} catch ( SQLException ex ) {
System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
170 }
JOptionPane . showMessageDialog ( null , "Data Inserted into Empregados Table" ) ;
50
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
}
/ * Prod_ID ProdutoNome Empregado_ID
175 543 Cinto 6323
432 Garrafa 1234
876 Anel 5678
* /
180 public static void insiraPedidos ( ) {
Connection con = getConnection ( ) ;
String insiraString1 , insiraSt ring2 , insi raStri n g3 , i n s i r a S t r i n g 4 ;
i n s i r a S t r i n g 1 = "insert into Pedidos values(543, 'Cinto', 6323)" ;
185 i n s i r a S t r i n g 2 = "insert into Pedidos values(432, 'Garrafa', 1234)" ;
i n s i r a S t r i n g 3 = "insert into Pedidos values(876, 'Anel', 5678)" ;
try {
190 stmt = con . createStatement ( ) ;
stmt . executeUpdate ( i n s i r a S t r i n g 1 ) ;
stmt . executeUpdate ( i n s i r a S t r i n g 2 ) ;
stmt . executeUpdate ( i n s i r a S t r i n g 3 ) ;
stmt . close ( ) ;
195 con . close ( ) ;
} catch ( SQLException ex ) {
System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
}
200 JOptionPane . showMessageDialog ( null , "Dados Inseridos na Tabela Pedidos" ) ;
}
public static void obtenhaEmpregados ( ) {
Connection con = getConnection ( ) ;
205 String r e s u l t = null ;
String selecioneString ;
selecioneString = "select * from Empregados" ;
r e s u l t ="Empregado_IDttNomen" ;
210 try {
stmt = con . createStatement ( ) ;
ResultSet rs = stmt . executeQuery ( selecioneString ) ;
while ( rs . next ( ) ) {
int id = rs . g e t I n t ( "Empregado_ID" ) ;
215 String nome = rs . getString ( "Nome" ) ;
r e s u l t += id+"tt"+ nome+"n" ;
}
stmt . close ( ) ;
con . close ( ) ;
220
} catch ( SQLException ex ) {
System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
}
JOptionPane . showMessageDialog ( null , r e s u l t ) ;
225 }
public static void obtenhaPedidos ( ) {
Connection con = getConnection ( ) ;
String r e s u l t = null ;
230 String selecioneString ;
51
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
selecioneString = "select * from Pedidos" ;
r e s u l t ="Prod_IDttProdutoNomettEmpregado_IDn" ;
try {
235 stmt = con . createStatement ( ) ;
ResultSet rs = stmt . executeQuery ( selecioneString ) ;
while ( rs . next ( ) ) {
int pr_id = rs . g e t I n t ( "Prod_ID" ) ;
String prodNome = rs . getString ( "ProdutoNome" ) ;
240 int id = rs . g e t I n t ( "Empregado_ID" ) ;
r e s u l t +=pr_id+"tt"+ prodNome+"tt"+id+"n" ;
}
stmt . close ( ) ;
con . close ( ) ;
245
} catch ( SQLException ex ) {
System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
}
JOptionPane . showMessageDialog ( null , r e s u l t ) ;
250 }
public static void atualizaEmpregados ( ) {
Connection con = getConnection ( ) ;
255 String atualizaString1 ;
atualizaString1 = "update Empregados set nome = 'helmuthsaatkamp' where
Empregado_ID = 6323" ;
try {
stmt = con . createStatement ( ) ;
260 stmt . executeUpdate ( atualizaString1 ) ;
stmt . close ( ) ;
con . close ( ) ;
} catch ( SQLException ex ) {
265 System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ;
}
JOptionPane . showMessageDialog ( null , "Dados Atualizados dentro da Tabela
Empregados" ) ;
}
} / / Fim da Classe
4.3 Usando comandos Prepared
Comando Prepared são comandos SQL pré-compilados, estes comandos são úteis se o
mesmo comando for executado repetidamente, por exemplo, em um loop. Tais comandos pou-
pam tempo apenas se você pretende excutar o mesmo novamente.
Para usá-los é preciso primeiramente criar um objeto PreparedStatement pela chamada do
método Connection.prepareStatement(), que é um método especialmente útil em situações onde
se pretende usar um loop ou while para selecionar parâmetros para uma sucessão de valores.
Se você quiser executar um objeto de Statement várias vezes ao invés de objetos de PreparedS-
tatement terá o tempo de execução reduzido na maioria das vezes.
52
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
A sintaxe é simples, basta inserir interrogações para qualquer parâmetro que você irá substi-
tuir antes de enviar o SQL à base de dados. Tal como acontece com CallableStatements, você
terá que chamar o close() para ter certeza de que os recursos do banco de dados sejam liber-
tados o mais depressa possível. Logo abaixo segue um programa JDBC que mostra o uso de
comandos Prepared para inserir dados em uma tabela usando programação jdbc.
Você precisa fornecer valores para serem usados no lugar do ponto de interrogação determi-
nados (caso existam) antes que você possa executar um objeto PreparedStatement. Você pode
fazer isto chamando um dos métodos setXXX definido na classe PreparedStatement. Existe
um método setXXX para cada tipo primitivo declarado na linguagem de programação Java. Um
exemplo de um objeto de PreparedStatement:
PreparedStatement pstmt = con . prepareStatement (
"update Orders set pname = ? where Prod_Id = ?" ) ;
pstmt . s e t I n t (2 , 100) ;
pstmt . setString (1 , "Bob" ) ;
5 pstmt . executeUpdate ( ) ;
Uma característica importante de um objeto PreparedStatement é que, ao contrário de um
objeto de Statement, é dada uma instrução SQL quando é criado. Esta instrução SQL é enviada
para o DBMS diretamente, onde é compilada. Com o resultado, o objeto PreparedStatement con-
tém não apenas uma instrução SQL, mas uma instrução SQL que tem sido pré-compilada. Isto
significa que, quando o PreparedStatement é executado, o DBMS pode simplesmente executar o
comando SQL PreparedStatement sem ter de compilá-lo primeiro.
Embora objetos PreparedStatement possam ser usados para instruções SQL sem parâme-
tros, você provavelmente irá usá- los com mais freqüência para instruções SQL que têm parâme-
tros. A vantagem de usar comandos SQL que têm parâmetros é que você pode usar a mesma
declaração e fornecê- la com valores diferentes a cada vez que você executá - las.
import javax . swing . JOptionPane ;
import java . sql . * ;
public class JDBCPreparedStatements {
5
static String userid="" , password = "" ;
static String u r l = "jdbc:mysql://localhost:3306/dbexemplo" ; / / String u r l
= " jdbc : mySubprotocol : myDataSource " ;
static Statement stmt ;
static PreparedStatement pstmt ;
10 static Connection con ;
public static void main ( String args [ ] ) {
JOptionPane . showMessageDialog ( null , "Programação JDBC mostrando Atualização de
Dados em Tabelas e Prepared Statements" ) ;
int escolha = −1;
15
do{
escolha = pegueEscolha ( ) ;
i f ( escolha != 0) {
pegueSelecionados ( escolha ) ;
20 }
}
while ( escolha != 0) ;
53
JDBC Guide
JDBC Guide
JDBC Guide
JDBC Guide
JDBC Guide
JDBC Guide
JDBC Guide
JDBC Guide
JDBC Guide
JDBC Guide
JDBC Guide
JDBC Guide
JDBC Guide

Mais conteúdo relacionado

Mais procurados

Selinux
SelinuxSelinux
SelinuxTiago
 
Servidor de emails_seguro
Servidor de emails_seguroServidor de emails_seguro
Servidor de emails_seguroTiago
 
Tcl tk
Tcl tkTcl tk
Tcl tkTiago
 
Screen
ScreenScreen
ScreenTiago
 
X dialog
X dialogX dialog
X dialogTiago
 
Tunelamento
TunelamentoTunelamento
TunelamentoTiago
 
Wx python
Wx pythonWx python
Wx pythonTiago
 
Squid guard
Squid guardSquid guard
Squid guardTiago
 
Pascal
PascalPascal
PascalTiago
 
Apostila cdtc dotproject
Apostila cdtc dotprojectApostila cdtc dotproject
Apostila cdtc dotprojectTiago
 
Ruby on rails
Ruby on railsRuby on rails
Ruby on railsTiago
 
Programacao php moodle
Programacao php moodleProgramacao php moodle
Programacao php moodleTiago
 
Drupal
DrupalDrupal
DrupalTiago
 

Mais procurados (20)

Selinux
SelinuxSelinux
Selinux
 
Servidor de emails_seguro
Servidor de emails_seguroServidor de emails_seguro
Servidor de emails_seguro
 
Tcl tk
Tcl tkTcl tk
Tcl tk
 
Screen
ScreenScreen
Screen
 
X dialog
X dialogX dialog
X dialog
 
Samba
SambaSamba
Samba
 
Tunelamento
TunelamentoTunelamento
Tunelamento
 
Wx python
Wx pythonWx python
Wx python
 
Zope
ZopeZope
Zope
 
Squid guard
Squid guardSquid guard
Squid guard
 
Sql
SqlSql
Sql
 
Pascal
PascalPascal
Pascal
 
Uml
UmlUml
Uml
 
Qemu
QemuQemu
Qemu
 
Apostila cdtc dotproject
Apostila cdtc dotprojectApostila cdtc dotproject
Apostila cdtc dotproject
 
Vim
VimVim
Vim
 
Inkscape
InkscapeInkscape
Inkscape
 
Ruby on rails
Ruby on railsRuby on rails
Ruby on rails
 
Programacao php moodle
Programacao php moodleProgramacao php moodle
Programacao php moodle
 
Drupal
DrupalDrupal
Drupal
 

Semelhante a JDBC Guide

Jspservlets
JspservletsJspservlets
JspservletsTiago
 
Javascript
JavascriptJavascript
JavascriptTiago
 
Postgre sql
Postgre sqlPostgre sql
Postgre sqlTiago
 
Postfix
PostfixPostfix
PostfixTiago
 
Java basico
Java basicoJava basico
Java basicoTiago
 
Quanta
QuantaQuanta
QuantaTiago
 
Post gis
Post gisPost gis
Post gisTiago
 
Inst configdebian
Inst configdebianInst configdebian
Inst configdebianTiago
 
Open solaris
Open solarisOpen solaris
Open solarisTiago
 
Iptables
IptablesIptables
IptablesTiago
 
Python gtk
Python gtkPython gtk
Python gtkTiago
 
Drivers de dispostivos_linux
Drivers de dispostivos_linuxDrivers de dispostivos_linux
Drivers de dispostivos_linuxTiago
 
Introducao a acessibilidade_web
Introducao a acessibilidade_webIntroducao a acessibilidade_web
Introducao a acessibilidade_webTiago
 
Monitoramento
MonitoramentoMonitoramento
MonitoramentoTiago
 
Nessus
NessusNessus
NessusTiago
 
Planejamento em desenvolvimento_de_sistemas
Planejamento em desenvolvimento_de_sistemasPlanejamento em desenvolvimento_de_sistemas
Planejamento em desenvolvimento_de_sistemasTiago
 

Semelhante a JDBC Guide (20)

Jspservlets
JspservletsJspservlets
Jspservlets
 
Javascript
JavascriptJavascript
Javascript
 
Postgre sql
Postgre sqlPostgre sql
Postgre sql
 
Postfix
PostfixPostfix
Postfix
 
Java basico
Java basicoJava basico
Java basico
 
Horde
HordeHorde
Horde
 
Quanta
QuantaQuanta
Quanta
 
Squid
SquidSquid
Squid
 
Zope
ZopeZope
Zope
 
Post gis
Post gisPost gis
Post gis
 
Inst configdebian
Inst configdebianInst configdebian
Inst configdebian
 
Open solaris
Open solarisOpen solaris
Open solaris
 
Iptables
IptablesIptables
Iptables
 
Python gtk
Python gtkPython gtk
Python gtk
 
Drivers de dispostivos_linux
Drivers de dispostivos_linuxDrivers de dispostivos_linux
Drivers de dispostivos_linux
 
Ltsp
LtspLtsp
Ltsp
 
Introducao a acessibilidade_web
Introducao a acessibilidade_webIntroducao a acessibilidade_web
Introducao a acessibilidade_web
 
Monitoramento
MonitoramentoMonitoramento
Monitoramento
 
Nessus
NessusNessus
Nessus
 
Planejamento em desenvolvimento_de_sistemas
Planejamento em desenvolvimento_de_sistemasPlanejamento em desenvolvimento_de_sistemas
Planejamento em desenvolvimento_de_sistemas
 

Mais de Tiago

6572501 ldp-apostila-de-turbo-pascal
6572501 ldp-apostila-de-turbo-pascal6572501 ldp-apostila-de-turbo-pascal
6572501 ldp-apostila-de-turbo-pascalTiago
 
Guia rapido de_pascal
Guia rapido de_pascalGuia rapido de_pascal
Guia rapido de_pascalTiago
 
Python bge
Python bgePython bge
Python bgeTiago
 
Curso python
Curso pythonCurso python
Curso pythonTiago
 
Curso python
Curso pythonCurso python
Curso pythonTiago
 
Aula 01 python
Aula 01 pythonAula 01 python
Aula 01 pythonTiago
 
Threading in c_sharp
Threading in c_sharpThreading in c_sharp
Threading in c_sharpTiago
 
Retirar acentos de_determinado_texto_em_c_sharp
Retirar acentos de_determinado_texto_em_c_sharpRetirar acentos de_determinado_texto_em_c_sharp
Retirar acentos de_determinado_texto_em_c_sharpTiago
 
Remover caracteres especiais_texto_em_c_sharp
Remover caracteres especiais_texto_em_c_sharpRemover caracteres especiais_texto_em_c_sharp
Remover caracteres especiais_texto_em_c_sharpTiago
 
Obter ip da_internet_em_c_sharp
Obter ip da_internet_em_c_sharpObter ip da_internet_em_c_sharp
Obter ip da_internet_em_c_sharpTiago
 
Metodo using no_c_sharp
Metodo using no_c_sharpMetodo using no_c_sharp
Metodo using no_c_sharpTiago
 
Introdução ao c# para iniciantes
Introdução ao c# para iniciantesIntrodução ao c# para iniciantes
Introdução ao c# para iniciantesTiago
 
Interfaces windows em c sharp
Interfaces windows em c sharpInterfaces windows em c sharp
Interfaces windows em c sharpTiago
 
Filestream sistema arquivos
Filestream  sistema arquivosFilestream  sistema arquivos
Filestream sistema arquivosTiago
 
Curso linux professor rafael
Curso linux professor rafaelCurso linux professor rafael
Curso linux professor rafaelTiago
 
Curso de shell
Curso de shellCurso de shell
Curso de shellTiago
 
Controle lpt em_c_sharp
Controle lpt em_c_sharpControle lpt em_c_sharp
Controle lpt em_c_sharpTiago
 
Classes csharp
Classes csharpClasses csharp
Classes csharpTiago
 
C# o basico
C#   o basicoC#   o basico
C# o basicoTiago
 
C# classes
C#   classesC#   classes
C# classesTiago
 

Mais de Tiago (20)

6572501 ldp-apostila-de-turbo-pascal
6572501 ldp-apostila-de-turbo-pascal6572501 ldp-apostila-de-turbo-pascal
6572501 ldp-apostila-de-turbo-pascal
 
Guia rapido de_pascal
Guia rapido de_pascalGuia rapido de_pascal
Guia rapido de_pascal
 
Python bge
Python bgePython bge
Python bge
 
Curso python
Curso pythonCurso python
Curso python
 
Curso python
Curso pythonCurso python
Curso python
 
Aula 01 python
Aula 01 pythonAula 01 python
Aula 01 python
 
Threading in c_sharp
Threading in c_sharpThreading in c_sharp
Threading in c_sharp
 
Retirar acentos de_determinado_texto_em_c_sharp
Retirar acentos de_determinado_texto_em_c_sharpRetirar acentos de_determinado_texto_em_c_sharp
Retirar acentos de_determinado_texto_em_c_sharp
 
Remover caracteres especiais_texto_em_c_sharp
Remover caracteres especiais_texto_em_c_sharpRemover caracteres especiais_texto_em_c_sharp
Remover caracteres especiais_texto_em_c_sharp
 
Obter ip da_internet_em_c_sharp
Obter ip da_internet_em_c_sharpObter ip da_internet_em_c_sharp
Obter ip da_internet_em_c_sharp
 
Metodo using no_c_sharp
Metodo using no_c_sharpMetodo using no_c_sharp
Metodo using no_c_sharp
 
Introdução ao c# para iniciantes
Introdução ao c# para iniciantesIntrodução ao c# para iniciantes
Introdução ao c# para iniciantes
 
Interfaces windows em c sharp
Interfaces windows em c sharpInterfaces windows em c sharp
Interfaces windows em c sharp
 
Filestream sistema arquivos
Filestream  sistema arquivosFilestream  sistema arquivos
Filestream sistema arquivos
 
Curso linux professor rafael
Curso linux professor rafaelCurso linux professor rafael
Curso linux professor rafael
 
Curso de shell
Curso de shellCurso de shell
Curso de shell
 
Controle lpt em_c_sharp
Controle lpt em_c_sharpControle lpt em_c_sharp
Controle lpt em_c_sharp
 
Classes csharp
Classes csharpClasses csharp
Classes csharp
 
C# o basico
C#   o basicoC#   o basico
C# o basico
 
C# classes
C#   classesC#   classes
C# classes
 

Último

Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicas
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicasCenários de Aprendizagem - Estratégia para implementação de práticas pedagógicas
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicasRosalina Simão Nunes
 
ATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptx
ATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptxATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptx
ATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptxOsnilReis1
 
ABRIL VERDE.pptx Slide sobre abril ver 2024
ABRIL VERDE.pptx Slide sobre abril ver 2024ABRIL VERDE.pptx Slide sobre abril ver 2024
ABRIL VERDE.pptx Slide sobre abril ver 2024Jeanoliveira597523
 
Pedologia- Geografia - Geologia - aula_01.pptx
Pedologia- Geografia - Geologia - aula_01.pptxPedologia- Geografia - Geologia - aula_01.pptx
Pedologia- Geografia - Geologia - aula_01.pptxleandropereira983288
 
A Arte de Escrever Poemas - Dia das Mães
A Arte de Escrever Poemas - Dia das MãesA Arte de Escrever Poemas - Dia das Mães
A Arte de Escrever Poemas - Dia das MãesMary Alvarenga
 
CD_B3_C_ Criar e editar conteúdos digitais em diferentes formatos_índice.pdf
CD_B3_C_ Criar e editar conteúdos digitais em diferentes formatos_índice.pdfCD_B3_C_ Criar e editar conteúdos digitais em diferentes formatos_índice.pdf
CD_B3_C_ Criar e editar conteúdos digitais em diferentes formatos_índice.pdfManuais Formação
 
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptxAD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptxkarinedarozabatista
 
D9 RECONHECER GENERO DISCURSIVO SPA.pptx
D9 RECONHECER GENERO DISCURSIVO SPA.pptxD9 RECONHECER GENERO DISCURSIVO SPA.pptx
D9 RECONHECER GENERO DISCURSIVO SPA.pptxRonys4
 
Gerenciando a Aprendizagem Organizacional
Gerenciando a Aprendizagem OrganizacionalGerenciando a Aprendizagem Organizacional
Gerenciando a Aprendizagem OrganizacionalJacqueline Cerqueira
 
Apresentação | Eleições Europeias 2024-2029
Apresentação | Eleições Europeias 2024-2029Apresentação | Eleições Europeias 2024-2029
Apresentação | Eleições Europeias 2024-2029Centro Jacques Delors
 
Livro O QUE É LUGAR DE FALA - Autora Djamila Ribeiro
Livro O QUE É LUGAR DE FALA  - Autora Djamila RibeiroLivro O QUE É LUGAR DE FALA  - Autora Djamila Ribeiro
Livro O QUE É LUGAR DE FALA - Autora Djamila RibeiroMarcele Ravasio
 
Nova BNCC Atualizada para novas pesquisas
Nova BNCC Atualizada para novas pesquisasNova BNCC Atualizada para novas pesquisas
Nova BNCC Atualizada para novas pesquisasraveccavp
 
Habilidades Motoras Básicas e Específicas
Habilidades Motoras Básicas e EspecíficasHabilidades Motoras Básicas e Específicas
Habilidades Motoras Básicas e EspecíficasCassio Meira Jr.
 
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptx
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptxSlides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptx
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptxLuizHenriquedeAlmeid6
 
UFCD_10392_Intervenção em populações de risco_índice .pdf
UFCD_10392_Intervenção em populações de risco_índice .pdfUFCD_10392_Intervenção em populações de risco_índice .pdf
UFCD_10392_Intervenção em populações de risco_índice .pdfManuais Formação
 
Mapa mental - Classificação dos seres vivos .docx
Mapa mental - Classificação dos seres vivos .docxMapa mental - Classificação dos seres vivos .docx
Mapa mental - Classificação dos seres vivos .docxBeatrizLittig1
 
Slides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptx
Slides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptxSlides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptx
Slides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptxLuizHenriquedeAlmeid6
 
11oC_-_Mural_de_Portugues_4m35.pptxTrabalho do Ensino Profissional turma do 1...
11oC_-_Mural_de_Portugues_4m35.pptxTrabalho do Ensino Profissional turma do 1...11oC_-_Mural_de_Portugues_4m35.pptxTrabalho do Ensino Profissional turma do 1...
11oC_-_Mural_de_Portugues_4m35.pptxTrabalho do Ensino Profissional turma do 1...licinioBorges
 
Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)
Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)
Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)Mary Alvarenga
 

Último (20)

Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicas
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicasCenários de Aprendizagem - Estratégia para implementação de práticas pedagógicas
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicas
 
ATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptx
ATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptxATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptx
ATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptx
 
ABRIL VERDE.pptx Slide sobre abril ver 2024
ABRIL VERDE.pptx Slide sobre abril ver 2024ABRIL VERDE.pptx Slide sobre abril ver 2024
ABRIL VERDE.pptx Slide sobre abril ver 2024
 
Pedologia- Geografia - Geologia - aula_01.pptx
Pedologia- Geografia - Geologia - aula_01.pptxPedologia- Geografia - Geologia - aula_01.pptx
Pedologia- Geografia - Geologia - aula_01.pptx
 
A Arte de Escrever Poemas - Dia das Mães
A Arte de Escrever Poemas - Dia das MãesA Arte de Escrever Poemas - Dia das Mães
A Arte de Escrever Poemas - Dia das Mães
 
CD_B3_C_ Criar e editar conteúdos digitais em diferentes formatos_índice.pdf
CD_B3_C_ Criar e editar conteúdos digitais em diferentes formatos_índice.pdfCD_B3_C_ Criar e editar conteúdos digitais em diferentes formatos_índice.pdf
CD_B3_C_ Criar e editar conteúdos digitais em diferentes formatos_índice.pdf
 
Bullying, sai pra lá
Bullying,  sai pra láBullying,  sai pra lá
Bullying, sai pra lá
 
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptxAD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
 
D9 RECONHECER GENERO DISCURSIVO SPA.pptx
D9 RECONHECER GENERO DISCURSIVO SPA.pptxD9 RECONHECER GENERO DISCURSIVO SPA.pptx
D9 RECONHECER GENERO DISCURSIVO SPA.pptx
 
Gerenciando a Aprendizagem Organizacional
Gerenciando a Aprendizagem OrganizacionalGerenciando a Aprendizagem Organizacional
Gerenciando a Aprendizagem Organizacional
 
Apresentação | Eleições Europeias 2024-2029
Apresentação | Eleições Europeias 2024-2029Apresentação | Eleições Europeias 2024-2029
Apresentação | Eleições Europeias 2024-2029
 
Livro O QUE É LUGAR DE FALA - Autora Djamila Ribeiro
Livro O QUE É LUGAR DE FALA  - Autora Djamila RibeiroLivro O QUE É LUGAR DE FALA  - Autora Djamila Ribeiro
Livro O QUE É LUGAR DE FALA - Autora Djamila Ribeiro
 
Nova BNCC Atualizada para novas pesquisas
Nova BNCC Atualizada para novas pesquisasNova BNCC Atualizada para novas pesquisas
Nova BNCC Atualizada para novas pesquisas
 
Habilidades Motoras Básicas e Específicas
Habilidades Motoras Básicas e EspecíficasHabilidades Motoras Básicas e Específicas
Habilidades Motoras Básicas e Específicas
 
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptx
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptxSlides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptx
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptx
 
UFCD_10392_Intervenção em populações de risco_índice .pdf
UFCD_10392_Intervenção em populações de risco_índice .pdfUFCD_10392_Intervenção em populações de risco_índice .pdf
UFCD_10392_Intervenção em populações de risco_índice .pdf
 
Mapa mental - Classificação dos seres vivos .docx
Mapa mental - Classificação dos seres vivos .docxMapa mental - Classificação dos seres vivos .docx
Mapa mental - Classificação dos seres vivos .docx
 
Slides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptx
Slides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptxSlides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptx
Slides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptx
 
11oC_-_Mural_de_Portugues_4m35.pptxTrabalho do Ensino Profissional turma do 1...
11oC_-_Mural_de_Portugues_4m35.pptxTrabalho do Ensino Profissional turma do 1...11oC_-_Mural_de_Portugues_4m35.pptxTrabalho do Ensino Profissional turma do 1...
11oC_-_Mural_de_Portugues_4m35.pptxTrabalho do Ensino Profissional turma do 1...
 
Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)
Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)
Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)
 

JDBC Guide

  • 2. Sumário I Sobre essa Apostila 2 II Informações Básicas 4 III GNU Free Documentation License 9 IV Java DataBase Connectivity 18 1 Sobre JDBC 19 2 Plano de ensino 20 2.1 Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.2 Público Alvo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.3 Pré-requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.4 Descrição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.5 Metodologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.6 Cronograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.7 Programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.8 Avaliação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.9 Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3 CONCEITOS BÁSICOS 23 3.1 Introdução ao JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.1.1 Sistemas de banco de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.1.2 Vantagens dos sistemas de banco de dados . . . . . . . . . . . . . . . . . . 23 3.1.3 Linguagens de banco de dados . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.1.4 Java Database Connectivity . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.2 Instalação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.2.1 MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.2.2 Visão Detalhada da Instalação . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.2.3 Instalando ambiente Java e JDBC . . . . . . . . . . . . . . . . . . . . . . . . 28 3.2.4 Tipos de Drivers JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.2.5 Instalando o driver para MySQL em sua máquina . . . . . . . . . . . . . . . . 29 3.3 Bases e passos para Conexão com Banco de Dados Java . . . . . . . . . . . . . . . 29 3.4 Obtendo valores com ResultSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.4.1 Tipos de ResultSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 1
  • 3. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF 3.4.2 Métodos de ResultSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3.4.3 Metadados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.5 Criando Tabelas com comandos SQL . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.6 Obtendo Dados de tabelas SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 4 CONCEITOS AVANÇADOS 43 4.1 Inserindo Dados em Tabelas SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 4.2 Atualizando Tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4.3 Usando comandos Prepared . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 4.4 Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 4.4.1 Capturando Exceções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 4.4.2 Capturando Warnings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 4.5 Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 4.5.1 Usando Transações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 4.5.2 Desativando modo registro automático(Auto commit) . . . . . . . . . . . . . . 61 4.5.3 Registrando uma Transação . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 4.5.4 Usando transações para preservar a integridade dos dados . . . . . . . . . . 62 4.5.5 Configurando e usando Rolling Back para um Savepoint . . . . . . . . . . . . 63 4.5.6 Lançando um Savepoint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 4.5.7 Quando chamar o método rollback . . . . . . . . . . . . . . . . . . . . . . . . 64 2
  • 4. Parte I Sobre essa Apostila 3
  • 5. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF Conteúdo O conteúdo dessa apostila é fruto da compilação de diversos materiais livres publicados na in- ternet, disponíveis em diversos sites ou originalmente produzido no CDTC (http://www.cdtc.org.br.) O formato original deste material bem como sua atualização está disponível dentro da licença GNU Free Documentation License, cujo teor integral encontra-se aqui reproduzido na seção de mesmo nome, tendo inclusive uma versão traduzida (não oficial). A revisão e alteração vem sendo realizada pelo CDTC (suporte@cdtc.org.br) desde outubro de 2006. Críticas e sugestões construtivas serão bem-vindas a qualquer hora. Autores A autoria deste é de responsabilidade de Edson Hungria Júnior (hungria@cdtc.org.br) . O texto original faz parte do projeto Centro de Difusão de Tecnologia e Conhecimento que vêm sendo realizado pelo ITI (Instituto Nacional de Tecnologia da Informação) em conjunto com outros parceiros institucionais, e com as universidades federais brasileiras que tem produzido e utilizado Software Livre apoiando inclusive a comunidade Free Software junto a outras entidades no país. Informações adicionais podem ser obtidas através do email ouvidoria@cdtc.org.br, ou da home page da entidade, através da URL http://www.cdtc.org.br. Garantias O material contido nesta apostila é isento de garantias e o seu uso é de inteira responsabi- lidade do usuário/leitor. Os autores, bem como o ITI e seus parceiros, não se responsabilizam direta ou indiretamente por qualquer prejuízo oriundo da utilização do material aqui contido. Licença Copyright ©2006, Instituto Nacional de Tecnologia da Informação (cdtc@iti.gov.br) . Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with the Invariant Chapter being SOBRE ESSA APOS- TILA. A copy of the license is included in the section entitled GNU Free Documentation License. 4
  • 7. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF Sobre o CDTC Objetivo Geral O Projeto CDTC visa a promoção e o desenvolvimento de ações que incentivem a dissemina- ção de soluções que utilizem padrões abertos e não proprietários de tecnologia, em proveito do desenvolvimento social, cultural, político, tecnológico e econômico da sociedade brasileira. Objetivo Específico Auxiliar o Governo Federal na implantação do plano nacional de software não-proprietário e de código fonte aberto, identificando e mobilizando grupos de formadores de opinião dentre os servidores públicos e agentes políticos da União Federal, estimulando e incentivando o mercado nacional a adotar novos modelos de negócio da tecnologia da informação e de novos negócios de comunicação com base em software não-proprietário e de código fonte aberto, oferecendo treinamento específico para técnicos, profissionais de suporte e funcionários públicos usuários, criando grupos de funcionários públicos que irão treinar outros funcionários públicos e atuar como incentivadores e defensores dos produtos de software não proprietários e código fonte aberto, ofe- recendo conteúdo técnico on-line para serviços de suporte, ferramentas para desenvolvimento de produtos de software não proprietários e do seu código fonte livre, articulando redes de terceiros (dentro e fora do governo) fornecedoras de educação, pesquisa, desenvolvimento e teste de pro- dutos de software livre. Guia do aluno Neste guia, você terá reunidas uma série de informações importantes para que você comece seu curso. São elas: • Licenças para cópia de material disponível; • Os 10 mandamentos do aluno de Educação a Distância; • Como participar dos foruns e da wikipédia; • Primeiros passos. É muito importante que você entre em contato com TODAS estas informações, seguindo o roteiro acima. Licença Copyright ©2006, Instituto Nacional de Tecnologia da Informação (cdtc@iti.gov.br). 6
  • 8. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF É dada permissão para copiar, distribuir e/ou modificar este documento sob os termos da Licença de Documentação Livre GNU, Versão 1.1 ou qualquer versão posterior públicada pela Free Software Foundation; com o Capitulo Invariante SOBRE ESSA APOSTILA. Uma cópia da licença está inclusa na seção entitulada "Licença de Docu- mentação Livre GNU". Os 10 mandamentos do aluno de educação online • 1. Acesso à Internet: ter endereço eletrônico, um provedor e um equipamento adequado é pré-requisito para a participação nos cursos a distância; • 2. Habilidade e disposição para operar programas: ter conhecimentos básicos de Informá- tica é necessário para poder executar as tarefas; • 3. Vontade para aprender colaborativamente: interagir, ser participativo no ensino a distân- cia conta muitos pontos, pois irá colaborar para o processo ensino-aprendizagem pessoal, dos colegas e dos professores; • 4. Comportamentos compatíveis com a etiqueta: mostrar-se interessado em conhecer seus colegas de turma respeitando-os e se fazendo ser respeitado pelos mesmos; • 5. Organização pessoal: planejar e organizar tudo é fundamental para facilitar a sua revisão e a sua recuperação de materiais; • 6. Vontade para realizar as atividades no tempo correto: anotar todas as suas obrigações e realizá-las em tempo real; • 7. Curiosidade e abertura para inovações: aceitar novas idéias e inovar sempre; • 8. Flexibilidade e adaptação: requisitos necessário à mudança tecnológica, aprendizagens e descobertas; • 9. Objetividade em sua comunicação: comunicar-se de forma clara, breve e transparente é ponto - chave na comunicação pela Internet; • 10. Responsabilidade: ser responsável por seu próprio aprendizado. O ambiente virtual não controla a sua dedicação, mas reflete os resultados do seu esforço e da sua colaboração. Como participar dos fóruns e Wikipédia Você tem um problema e precisa de ajuda? Podemos te ajudar de 2 formas: A primeira é o uso dos fóruns de notícias e de dúvidas gerais que se distinguem pelo uso: . O fórum de notícias tem por objetivo disponibilizar um meio de acesso rápido a informações que sejam pertinentes ao curso (avisos, notícias). As mensagens postadas nele são enviadas a 7
  • 9. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF todos participantes. Assim, se o monitor ou algum outro participante tiver uma informação que interesse ao grupo, favor postá-la aqui. Porém, se o que você deseja é resolver alguma dúvida ou discutir algum tópico específico do curso. É recomendado que você faça uso do Fórum de dúvidas gerais que lhe dá recursos mais efetivos para esta prática. . O fórum de dúvidas gerais tem por objetivo disponibilizar um meio fácil, rápido e interativo para solucionar suas dúvidas e trocar experiências. As mensagens postadas nele são enviadas a todos participantes do curso. Assim, fica muito mais fácil obter respostas, já que todos podem ajudar. Se você receber uma mensagem com algum tópico que saiba responder, não se preocupe com a formalização ou a gramática. Responda! E não se esqueça de que antes de abrir um novo tópico é recomendável ver se a sua pergunta já foi feita por outro participante. A segunda forma se dá pelas Wikis: . Uma wiki é uma página web que pode ser editada colaborativamente, ou seja, qualquer par- ticipante pode inserir, editar, apagar textos. As versões antigas vão sendo arquivadas e podem ser recuperadas a qualquer momento que um dos participantes o desejar. Assim, ela oferece um ótimo suporte a processos de aprendizagem colaborativa. A maior wiki na web é o site "Wikipé- dia", uma experiência grandiosa de construção de uma enciclopédia de forma colaborativa, por pessoas de todas as partes do mundo. Acesse-a em português pelos links: • Página principal da Wiki - http://pt.wikipedia.org/wiki/ Agradecemos antecipadamente a sua colaboração com a aprendizagem do grupo! Primeiros Passos Para uma melhor aprendizagem é recomendável que você siga os seguintes passos: • Ler o Plano de Ensino e entender a que seu curso se dispõe a ensinar; • Ler a Ambientação do Moodle para aprender a navegar neste ambiente e se utilizar das ferramentas básicas do mesmo; • Entrar nas lições seguindo a seqüência descrita no Plano de Ensino; • Qualquer dúvida, reporte ao Fórum de Dúvidas Gerais. Perfil do Tutor Segue-se uma descrição do tutor ideal, baseada no feedback de alunos e de tutores. O tutor ideal é um modelo de excelência: é consistente, justo e profissional nos respectivos valores e atitudes, incentiva mas é honesto, imparcial, amável, positivo, respeitador, aceita as idéias dos estudantes, é paciente, pessoal, tolerante, apreciativo, compreensivo e pronto a ajudar. 8
  • 10. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF A classificação por um tutor desta natureza proporciona o melhor feedback possível, é crucial, e, para a maior parte dos alunos, constitui o ponto central do processo de aprendizagem.’ Este tutor ou instrutor: • fornece explicações claras acerca do que ele espera e do estilo de classificação que irá utilizar; • gosta que lhe façam perguntas adicionais; • identifica as nossas falhas, mas corrige-as amavelmente’, diz um estudante, ’e explica por- que motivo a classificação foi ou não foi atribuída’; • tece comentários completos e construtivos, mas de forma agradável (em contraste com um reparo de um estudante: ’os comentários deixam-nos com uma sensação de crítica, de ameaça e de nervossismo’) • dá uma ajuda complementar para encorajar um estudante em dificuldade; • esclarece pontos que não foram entendidos, ou corretamente aprendidos anteriormente; • ajuda o estudante a alcançar os seus objetivos; • é flexível quando necessário; • mostra um interesse genuíno em motivar os alunos (mesmo os principiantes e, por isso, talvez numa fase menos interessante para o tutor); • escreve todas as correções de forma legível e com um nível de pormenorização adequado; • acima de tudo, devolve os trabalhos rapidamente; 9
  • 11. Parte III GNU Free Documentation License 10
  • 12. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF (Traduzido pelo João S. O. Bueno através do CIPSGA em 2001) Esta é uma tradução não oficial da Licença de Documentação Livre GNU em Português Brasi- leiro. Ela não é publicada pela Free Software Foundation, e não se aplica legalmente a distribuição de textos que usem a GFDL - apenas o texto original em Inglês da GNU FDL faz isso. Entretanto, nós esperamos que esta tradução ajude falantes de português a entenderem melhor a GFDL. This is an unofficial translation of the GNU General Documentation License into Brazilian Por- tuguese. It was not published by the Free Software Foundation, and does not legally state the distribution terms for software that uses the GFDL–only the original English text of the GFDL does that. However, we hope that this translation will help Portuguese speakers understand the GFDL better. Licença de Documentação Livre GNU Versão 1.1, Março de 2000 Copyright (C) 2000 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA É permitido a qualquer um copiar e distribuir cópias exatas deste documento de licença, mas não é permitido alterá-lo. INTRODUÇÃO O propósito desta Licença é deixar um manual, livro-texto ou outro documento escrito "livre"no sentido de liberdade: assegurar a qualquer um a efetiva liberdade de copiá-lo ou redistribui-lo, com ou sem modificações, comercialmente ou não. Secundariamente, esta Licença mantém para o autor e editor uma forma de ter crédito por seu trabalho, sem ser considerado responsável pelas modificações feitas por terceiros. Esta Licença é um tipo de "copyleft"("direitos revertidos"), o que significa que derivações do documento precisam ser livres no mesmo sentido. Ela complementa a GNU Licença Pública Ge- ral (GNU GPL), que é um copyleft para software livre. Nós fizemos esta Licença para que seja usada em manuais de software livre, por que software livre precisa de documentação livre: um programa livre deve ser acompanhado de manuais que provenham as mesmas liberdades que o software possui. Mas esta Licença não está restrita a manuais de software; ela pode ser usada para qualquer trabalho em texto, independentemente do assunto ou se ele é publicado como um livro impresso. Nós recomendamos esta Licença prin- cipalmente para trabalhos cujo propósito seja de introdução ou referência. APLICABILIDADE E DEFINIÇÕES Esta Licença se aplica a qualquer manual ou outro texto que contenha uma nota colocada pelo detentor dos direitos autorais dizendo que ele pode ser distribuído sob os termos desta Licença. O "Documento"abaixo se refere a qualquer manual ou texto. Qualquer pessoa do público é um 11
  • 13. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF licenciado e é referida como "você". Uma "Versão Modificada"do Documento se refere a qualquer trabalho contendo o documento ou uma parte dele, quer copiada exatamente, quer com modificações e/ou traduzida em outra língua. Uma "Seção Secundária"é um apêndice ou uma seção inicial do Documento que trata ex- clusivamente da relação dos editores ou dos autores do Documento com o assunto geral do Documento (ou assuntos relacionados) e não contém nada que poderia ser incluído diretamente nesse assunto geral (Por exemplo, se o Documento é em parte um livro texto de matemática, a Seção Secundária pode não explicar nada de matemática). Essa relação poderia ser uma questão de ligação histórica com o assunto, ou matérias relaci- onadas, ou de posições legais, comerciais, filosóficas, éticas ou políticas relacionadas ao mesmo. As "Seções Invariantes"são certas Seções Secundárias cujos títulos são designados, como sendo de Seções Invariantes, na nota que diz que o Documento é publicado sob esta Licença. Os "Textos de Capa"são certos trechos curtos de texto que são listados, como Textos de Capa Frontal ou Textos da Quarta Capa, na nota que diz que o texto é publicado sob esta Licença. Uma cópia "Transparente"do Documento significa uma cópia que pode ser lida automatica- mente, representada num formato cuja especificação esteja disponível ao público geral, cujos conteúdos possam ser vistos e editados diretamente e sem mecanismos especiais com editores de texto genéricos ou (para imagens compostas de pixels) programas de pintura genéricos ou (para desenhos) por algum editor de desenhos grandemente difundido, e que seja passível de servir como entrada a formatadores de texto ou para tradução automática para uma variedade de formatos que sirvam de entrada para formatadores de texto. Uma cópia feita em um formato de arquivo outrossim Transparente cuja constituição tenha sido projetada para atrapalhar ou de- sencorajar modificações subsequentes pelos leitores não é Transparente. Uma cópia que não é "Transparente"é chamada de "Opaca". Exemplos de formatos que podem ser usados para cópias Transparentes incluem ASCII sim- ples sem marcações, formato de entrada do Texinfo, formato de entrada do LaTex, SGML ou XML usando uma DTD disponibilizada publicamente, e HTML simples, compatível com os padrões, e projetado para ser modificado por pessoas. Formatos opacos incluem PostScript, PDF, formatos proprietários que podem ser lidos e editados apenas com processadores de texto proprietários, SGML ou XML para os quais a DTD e/ou ferramentas de processamento e edição não estejam disponíveis para o público, e HTML gerado automaticamente por alguns editores de texto com finalidade apenas de saída. A "Página do Título"significa, para um livro impresso, a página do título propriamente dita, mais quaisquer páginas subsequentes quantas forem necessárias para conter, de forma legível, o material que esta Licença requer que apareça na página do título. Para trabalhos que não tenham uma página do título, "Página do Título"significa o texto próximo da aparição mais proe- minente do título do trabalho, precedendo o início do corpo do texto. 12
  • 14. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF FAZENDO CÓPIAS EXATAS Você pode copiar e distribuir o Documento em qualquer meio, de forma comercial ou não comercial, desde que esta Licença, as notas de copyright, e a nota de licença dizendo que esta Licença se aplica ao documento estejam reproduzidas em todas as cópias, e que você não acres- cente nenhuma outra condição, quaisquer que sejam, às desta Licença. Você não pode usar medidas técnicas para obstruir ou controlar a leitura ou confecção de cópias subsequentes das cópias que você fizer ou distribuir. Entretanto, você pode aceitar com- pensação em troca de cópias. Se você distribuir uma quantidade grande o suficiente de cópias, você também precisa respeitar as condições da seção 3. Você também pode emprestar cópias, sob as mesmas condições colocadas acima, e também pode exibir cópias publicamente. FAZENDO CÓPIAS EM QUANTIDADE Se você publicar cópias do Documento em número maior que 100, e a nota de licença do Documento obrigar Textos de Capa, você precisará incluir as cópias em capas que tragam, clara e legivelmente, todos esses Textos de Capa: Textos de Capa da Frente na capa da frente, e Textos da Quarta Capa na capa de trás. Ambas as capas também precisam identificar clara e legivelmente você como o editor dessas cópias. A capa da frente precisa apresentar o título com- pleto com todas as palavras do título igualmente proeminentes e visíveis. Você pode adicionar outros materiais às capas. Fazer cópias com modificações limitadas às capas, tanto quanto estas preservem o título do documento e satisfaçam a essas condições, pode ser tratado como cópia exata em outros aspectos. Se os textos requeridos em qualquer das capas for muito volumoso para caber de forma legível, você deve colocar os primeiros (tantos quantos couberem de forma razoável) na capa verdadeira, e continuar os outros nas páginas adjacentes. Se você publicar ou distribuir cópias Opacas do Documento em número maior que 100, você precisa ou incluir uma cópia Transparente que possa ser lida automaticamente com cada cópia Opaca, ou informar, em ou com, cada cópia Opaca a localização de uma cópia Transparente completa do Documento acessível publicamente em uma rede de computadores, à qual o público usuário de redes tenha acesso a download gratuito e anônimo utilizando padrões públicos de protocolos de rede. Se você utilizar o segundo método, você precisará tomar cuidados razoavel- mente prudentes, quando iniciar a distribuição de cópias Opacas em quantidade, para assegurar que esta cópia Transparente vai permanecer acessível desta forma na localização especificada por pelo menos um ano depois da última vez em que você distribuir uma cópia Opaca (direta- mente ou através de seus agentes ou distribuidores) daquela edição para o público. É pedido, mas não é obrigatório, que você contate os autores do Documento bem antes de redistribuir qualquer grande número de cópias, para lhes dar uma oportunidade de prover você com uma versão atualizada do Documento. 13
  • 15. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF MODIFICAÇÕES Você pode copiar e distribuir uma Versão Modificada do Documento sob as condições das se- ções 2 e 3 acima, desde que você publique a Versão Modificada estritamente sob esta Licença, com a Versão Modificada tomando o papel do Documento, de forma a licenciar a distribuição e modificação da Versão Modificada para quem quer que possua uma cópia da mesma. Além disso, você precisa fazer o seguinte na versão modificada: A. Usar na Página de Título (e nas capas, se houver alguma) um título distinto daquele do Do- cumento, e daqueles de versões anteriores (que deveriam, se houvesse algum, estarem listados na seção "Histórico do Documento"). Você pode usar o mesmo título de uma versão anterior se o editor original daquela versão lhe der permissão; B. Listar na Página de Título, como autores, uma ou mais das pessoas ou entidades responsá- veis pela autoria das modificações na Versão Modificada, conjuntamente com pelo menos cinco dos autores principais do Documento (todos os seus autores principais, se ele tiver menos que cinco); C. Colocar na Página de Título o nome do editor da Versão Modificada, como o editor; D. Preservar todas as notas de copyright do Documento; E. Adicionar uma nota de copyright apropriada para suas próprias modificações adjacente às outras notas de copyright; F. Incluir, imediatamente depois das notas de copyright, uma nota de licença dando ao público o direito de usar a Versão Modificada sob os termos desta Licença, na forma mostrada no tópico abaixo; G. Preservar nessa nota de licença as listas completas das Seções Invariantes e os Textos de Capa requeridos dados na nota de licença do Documento; H. Incluir uma cópia inalterada desta Licença; I. Preservar a seção entitulada "Histórico", e seu título, e adicionar à mesma um item dizendo pelo menos o título, ano, novos autores e editor da Versão Modificada como dados na Página de Título. Se não houver uma sessão denominada "Histórico"no Documento, criar uma dizendo o título, ano, autores, e editor do Documento como dados em sua Página de Título, então adicionar um item descrevendo a Versão Modificada, tal como descrito na sentença anterior; J. Preservar o endereço de rede, se algum, dado no Documento para acesso público a uma cópia Transparente do Documento, e da mesma forma, as localizações de rede dadas no Docu- mento para as versões anteriores em que ele foi baseado. Elas podem ser colocadas na seção "Histórico". Você pode omitir uma localização na rede para um trabalho que tenha sido publicado pelo menos quatro anos antes do Documento, ou se o editor original da versão a que ela se refira der sua permissão; K. Em qualquer seção entitulada "Agradecimentos"ou "Dedicatórias", preservar o título da 14
  • 16. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF seção e preservar a seção em toda substância e fim de cada um dos agradecimentos de contri- buidores e/ou dedicatórias dados; L. Preservar todas as Seções Invariantes do Documento, inalteradas em seus textos ou em seus títulos. Números de seção ou equivalentes não são considerados parte dos títulos da seção; M. Apagar qualquer seção entitulada "Endossos". Tal sessão não pode ser incluída na Versão Modificada; N. Não reentitular qualquer seção existente com o título "Endossos"ou com qualquer outro título dado a uma Seção Invariante. Se a Versão Modificada incluir novas seções iniciais ou apêndices que se qualifiquem como Seções Secundárias e não contenham nenhum material copiado do Documento, você pode optar por designar alguma ou todas aquelas seções como invariantes. Para fazer isso, adicione seus títulos à lista de Seções Invariantes na nota de licença da Versão Modificada. Esses títulos preci- sam ser diferentes de qualquer outro título de seção. Você pode adicionar uma seção entitulada "Endossos", desde que ela não contenha qual- quer coisa além de endossos da sua Versão Modificada por várias pessoas ou entidades - por exemplo, declarações de revisores ou de que o texto foi aprovado por uma organização como a definição oficial de um padrão. Você pode adicionar uma passagem de até cinco palavras como um Texto de Capa da Frente , e uma passagem de até 25 palavras como um Texto de Quarta Capa, ao final da lista de Textos de Capa na Versão Modificada. Somente uma passagem de Texto da Capa da Frente e uma de Texto da Quarta Capa podem ser adicionados por (ou por acordos feitos por) qualquer entidade. Se o Documento já incluir um texto de capa para a mesma capa, adicionado previamente por você ou por acordo feito com alguma entidade para a qual você esteja agindo, você não pode adicionar um outro; mas você pode trocar o antigo, com permissão explícita do editor anterior que adicionou a passagem antiga. O(s) autor(es) e editor(es) do Documento não dão permissão por esta Licença para que seus nomes sejam usados para publicidade ou para assegurar ou implicar endossamento de qualquer Versão Modificada. COMBINANDO DOCUMENTOS Você pode combinar o Documento com outros documentos publicados sob esta Licença, sob os termos definidos na seção 4 acima para versões modificadas, desde que você inclua na com- binação todas as Seções Invariantes de todos os documentos originais, sem modificações, e liste todas elas como Seções Invariantes de seu trabalho combinado em sua nota de licença. O trabalho combinado precisa conter apenas uma cópia desta Licença, e Seções Invariantes Idênticas com multiplas ocorrências podem ser substituídas por apenas uma cópia. Se houver múltiplas Seções Invariantes com o mesmo nome mas com conteúdos distintos, faça o título de 15
  • 17. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF cada seção único adicionando ao final do mesmo, em parênteses, o nome do autor ou editor origianl daquela seção, se for conhecido, ou um número que seja único. Faça o mesmo ajuste nos títulos de seção na lista de Seções Invariantes nota de licença do trabalho combinado. Na combinação, você precisa combinar quaisquer seções entituladas "Histórico"dos diver- sos documentos originais, formando uma seção entitulada "Histórico"; da mesma forma combine quaisquer seções entituladas "Agradecimentos", ou "Dedicatórias". Você precisa apagar todas as seções entituladas como "Endosso". COLETÂNEAS DE DOCUMENTOS Você pode fazer uma coletânea consitindo do Documento e outros documentos publicados sob esta Licença, e substituir as cópias individuais desta Licença nos vários documentos com uma única cópia incluida na coletânea, desde que você siga as regras desta Licença para cópia exata de cada um dos Documentos em todos os outros aspectos. Você pode extrair um único documento de tal coletânea, e distribuí-lo individualmente sob esta Licença, desde que você insira uma cópia desta Licença no documento extraído, e siga esta Licença em todos os outros aspectos relacionados à cópia exata daquele documento. AGREGAÇÃO COM TRABALHOS INDEPENDENTES Uma compilação do Documento ou derivados dele com outros trabalhos ou documentos se- parados e independentes, em um volume ou mídia de distribuição, não conta como uma Ver- são Modificada do Documento, desde que nenhum copyright de compilação seja reclamado pela compilação. Tal compilação é chamada um "agregado", e esta Licença não se aplica aos outros trabalhos auto-contidos compilados junto com o Documento, só por conta de terem sido assim compilados, e eles não são trabalhos derivados do Documento. Se o requerido para o Texto de Capa na seção 3 for aplicável a essas cópias do Documento, então, se o Documento constituir menos de um quarto de todo o agregado, os Textos de Capa do Documento podem ser colocados em capas adjacentes ao Documento dentro do agregado. Senão eles precisarão aparecer nas capas de todo o agregado. TRADUÇÃO Tradução é considerada como um tipo de modificação, então você pode distribuir traduções do Documento sob os termos da seção 4. A substituição de Seções Invariantes por traduções requer uma permissão especial dos detentores do copyright das mesmas, mas você pode incluir traduções de algumas ou de todas as Seções Invariantes em adição às versões orignais dessas Seções Invariantes. Você pode incluir uma tradução desta Licença desde que você também in- clua a versão original em Inglês desta Licença. No caso de discordância entre a tradução e a 16
  • 18. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF versão original em Inglês desta Licença, a versão original em Inglês prevalecerá. TÉRMINO Você não pode copiar, modificar, sublicenciar, ou distribuir o Documento exceto como expres- samente especificado sob esta Licença. Qualquer outra tentativa de copiar, modificar, sublicen- ciar, ou distribuir o Documento é nula, e resultará automaticamente no término de seus direitos sob esta Licença. Entretanto, terceiros que tenham recebido cópias, ou direitos de você sob esta Licença não terão suas licenças terminadas, tanto quanto esses terceiros permaneçam em total acordo com esta Licença. REVISÕES FUTURAS DESTA LICENÇA A Free Software Foundation pode publicar novas versões revisadas da Licença de Documen- tação Livre GNU de tempos em tempos. Tais novas versões serão similares em espirito à versão presente, mas podem diferir em detalhes ao abordarem novos porblemas e preocupações. Veja http://www.gnu.org/copyleft/. A cada versão da Licença é dado um número de versão distinto. Se o Documento especificar que uma versão particular desta Licença "ou qualquer versão posterior"se aplica ao mesmo, você tem a opção de seguir os termos e condições daquela versão específica, ou de qualquer versão posterior que tenha sido publicada (não como rascunho) pela Free Software Foundation. Se o Documento não especificar um número de Versão desta Licença, você pode escolher qualquer versão já publicada (não como rascunho) pela Free Software Foundation. ADENDO: Como usar esta Licença para seus documentos Para usar esta Licença num documento que você escreveu, inclua uma cópia desta Licença no documento e ponha as seguintes notas de copyright e licenças logo após a página de título: Copyright (c) ANO SEU NOME. É dada permissão para copiar, distribuir e/ou modificar este documento sob os termos da Licença de Documentação Livre GNU, Versão 1.1 ou qualquer versão posterior publicada pela Free Soft- ware Foundation; com as Seções Invariantes sendo LISTE SEUS TÍTULOS, com os Textos da Capa da Frente sendo LISTE, e com os Textos da Quarta-Capa sendo LISTE. Uma cópia da li- cença está inclusa na seção entitulada "Licença de Documentação Livre GNU". Se você não tiver nenhuma Seção Invariante, escreva "sem Seções Invariantes"ao invés de dizer quais são invariantes. Se você não tiver Textos de Capa da Frente, escreva "sem Textos de Capa da Frente"ao invés de "com os Textos de Capa da Frente sendo LISTE"; o mesmo para os Textos da Quarta Capa. Se o seu documento contiver exemplos não triviais de código de programas, nós recomenda- mos a publicação desses exemplos em paralelo sob a sua escolha de licença de software livre, 17
  • 19. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF tal como a GNU General Public License, para permitir o seu uso em software livre. 18
  • 20. Parte IV Java DataBase Connectivity 19
  • 21. Capítulo 1 Sobre JDBC Java Database Connectivity (JDBC) é, basicamente, "uma API padrão Java para executar código SQL". Consiste de classes e interfaces escritas em Java que fornecem uma API padrão para desenvolvedores, tornando possível o envio de instruções SQL para qualquer base de dados relacional. 20
  • 22. Capítulo 2 Plano de ensino 2.1 Objetivo Qualificar técnicos e programadores na API Java chamada JDBC. 2.2 Público Alvo Técnicos e Programadores que desejam trabalhar com banco de dados e a linguagem Java. 2.3 Pré-requisitos Os usuários deverão , necessariamente, ter conhecimento básico acerca da lógica de progra- mação, de banco de dados e, principalmente, conhecer a linguagem de programação Java. Recomenda-se enfaticamente ter feito os cursos de Java Básico e Banco de Dados MySQL. 2.4 Descrição O curso será realizado na modalidade Educação a Distância e utilizará a Plataforma Moodle como ferramenta de aprendizagem. O curso tem duração de uma semana e possui um conjunto de atividades (lições, fóruns, glossários, questionários e outros) que deverão ser executadas de acordo com as instruções fornecidas. O material didático estará disponível on-line de acordo com as datas pré-estabelecidas em cada tópico. A versão adotada do Java é a 1.5.0, caso possua ou- tra versão, poderão ocorrer diferenças, não necessariamente vitais, com relação a este material. Todo o material está no formato de lições e estará disponível ao longo do curso. As lições poderão ser acessadas quantas vezes forem necessárias. Aconselhamos a leitura de "Ambien- tação do Moodle", para que você conheça o produto de Ensino a Distância, evitando dificuldades advindas do "desconhecimento"sobre o mesmo. Ao final de cada lição haverá uma questão referente módulo ao estudado anteriormente que também poderá conter perguntas sobre os textos indicados caso existam. No final do curso ha- verá uma prova de Avaliação de Aprendizagem no formato da construção de um programa. Utilize 21
  • 23. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF o material de cada semana e os exemplos disponibilizados para se preparar para prova. As lições contêm o conteúdo principal. Elas poderão ser acessadas quantas vezes forem ne- cessárias, desde que esteja dentro da semana programada. Ao final de uma lição, você receberá uma nota de acordo com o seu desempenho. Responda com atenção às perguntas de cada li- ção, pois elas serão consideradas na sua nota final. Caso sua nota numa determinada lição seja menor do que 6.0, sugerimos que você faça novamente esta lição. Os instrutores estarão a sua disposição ao longo de todo curso. Qualquer dúvida deve ser disponibilizada no fórum ou enviada por e-mail. Diariamente os monitores darão respostas e es- clarecimentos. 2.5 Metodologia O curso está dividido da seguinte maneira: 2.6 Cronograma Semana 1 - Conceitos Básicos • Introdução ao JDBC; • Instalação; • Bases para Conexão com JDBC; • Manipulação de Tabelas. Semana 2 - Conceitos Avançados • Inserção e Atualização de Tabelas; • PreparedStatements, Performance, Captura de erros e Advertências; • Transactions. 2.7 Programa O curso JDBC oferecerá o seguinte conteúdo: • instalação, Conceitos Básicos e Conceitos Avançados de JDBC; • uso de ferramenta de Banco de Dados MySQL em JDBC. 22
  • 24. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF 2.8 Avaliação Toda a avaliação será feita on-line. Aspectos a serem considerados na avaliação: • iniciativa e autonomia no processo de aprendizagem e de produção de conhecimento; • capacidade de pesquisa e abordagem criativa na solução dos problemas apresentados. Instrumentos de avaliação: • participação ativa nas atividades programadas; • avaliação de Aprendizagem ao final do curso; • o participante fará várias avaliações referente ao conteúdo do curso. Para a aprovação e obtenção do certificado o participante deverá obter nota final maior ou igual a 6.0 de acordo com a fórmula abaixo: • Nota Final = ((ML x 7) + (AF x 3)) / 10 • AF = Nota da Avaliação de Aprendizagem. • ML = Média aritmética das Avaliações de Lições. 2.9 Bibliografia • Site oficial: http://www.sun.com • Site oficial (JDBC): http://java.sun.com/javase/technologies/database/ • Site relacionados: http://www.jdbc-tutorial.com/ 23
  • 25. Capítulo 3 CONCEITOS BÁSICOS Conceitos iniciais de Sistemas de Banco de Dados , Linguagens de banco de dados e tecno- logia JDBC. 3.1 Introdução ao JDBC 3.1.1 Sistemas de banco de dados A disponibilidade de armazenamento massivo, barato e de acesso direto gerou uma demanda tremenda por pesquisas e desenvolvimento na área de sistemas de banco de dados. Um sistema de banco de dados envolve mais coisas do que uma simples coleção integrada de dados. Ele engloba dados, o hardware em que os dados se encontram, o software controlador do armaze- namento, recuperação de dados ou Sistema de Gerenciamento de Bancos de Dados(SGBD) e, finalmente, os próprios usuários. 3.1.2 Vantagens dos sistemas de banco de dados • Redução da redundância; • A inconsistência pode ser evitada; • Compartilhamento de dados; • Imposição de padrões; • Aplicação de restrições de segurança; • Manutenção da integridade. A independência de dados é um dos aspectos mais relevantes de um SGBD. Ou seja, a ma- neira como os dados são fisicamente armazenados ou acessados não é preocupação dos apli- cativos. A independência dos dados oferece a conveniência pela qual vários aplicativos podem ter diferentes visualizações dos mesmos dados. Do ponto de vista do sistema, a independência dos dados torna possível que a estrutura de armazenamento e a estratégia de acesso sejam modificadas em resposta às alterações nos requisitos da instalação, mas sem a necessidade de modificar aplicativos em funcionamento. 24
  • 26. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF 3.1.3 Linguagens de banco de dados Os usuários acessam um banco de dados(BD) por instruções em uma linguagem própria de banco de dados. Os programas aplicativos podem utilizar uma linguagem de alto nível conven- cional como Java, C, C++, Visual Basic, COBOL ou Pascal. Um usuário pode fazer solicitações do banco de dados em uma linguagem de consulta especialmente projetada, o que torna fácil expressar as solicitações no contexto de um aplicativo específico. Existem linguagens de programação que têm um conjunto de primitivas que permitem a cria- ção de bancos de dados de forma fácil, mas que são deficientes em outros aspectos. Já outras foram desenvolvidas para ter um alto desempenho, porém são complexas para trabalhar com bancos de dados. Java encontrou uma maneira de manter as características desenvolvendo uma tecnologia para acesso a banco de dados sendo independente de plataforma e de fornecedor. No entanto, a comunicação de Java puro com banco de dados é difícil de se fazer, devido a grande quantidade de bancos de dados com linguagens proprietárias no mercado. Para resolver isso, foi criada então, pelos projetistas da Javasoft, uma interface entre Java e outra linguagem que todos os bancos de dados suportam. A linguagem escolhida foi o SQL (Structured Query Language) e a partir daí, os fabricantes de bancos de dados passaram a fornecer os drivers para SQL, criou-se o JDBC. 3.1.4 Java Database Connectivity O Java Data Base Connectivity(JDBC) é uma API (Application Program Interface), inclusa no J2SE e também na J2EE, que provê conectividade entre a linguagem de programação Java e os SGBD (Sistemas Gerenciadores de Banco de Dados) relacionais, por meio de comandos SQL. A tecnologia JDBC permite a utilização da portabilidade intrínseca de Java nos conectando a um universo de dados em ambientes heterogêneos. O uso dessa API JDBC torna desnecessária a escrita de um programa para acessar, por exemplo, o banco de dados Sybase, outro para acessar o banco de dados Oracle, outro para acessar um banco de dados Informix, etc. Com o uso da API JDBC, pode-se escrever um único programa que será capaz de enviar código SQL a cada banco de dados específico. Além disso, com uma aplicação escrita em Java não há a preocupação de compatibilidade de plataforma. Essa combinação, portanto, torna possível escrever uma vez e rodar em qualquer lugar. A biblioteca da JBDC provê um conjunto de interfaces de acesso ao BD, sendo que uma im- plementação em particular dessas interfaces é chamada de Driver. São os próprios fabricantes dos bancos de dados, ou terceiros, quem implementam os Drivers JDBC para cada BD, pois são eles que conhecem os detalhes dos BDs. Cada BD possui um Driver JDBC específico que é usado de forma padrão. A API padrão do Java já vem com o driver JDBC-ODBC, que é uma ponte entre a aplicação Java e o BD através da configuração de um recurso ODBC na máquina. Já os drivers de outros fornecedores devem ser adicionados ao CLASSPATH da aplicação para que possam ser usados. Desta maneira, pode-se mudar o driver sem que se mude a aplicação. Java é uma excelente linguagem base para as aplicações de banco de dados, já que é uma linguagem robusta, de fácil entendimento e uso, segura e é normalmente baixada automatica- mente numa rede. JDBC é o mecanismo certo para fazer aplicações Java se comunicarem com 25
  • 27. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF os variados bancos de dados existentes. Com Java e a API JDBC é possível, por exemplo, pu- blicar uma página web contendo um applet que utiliza informações obtidas de algum banco de dados. Figura 1 - Tecnologia A figura acima ilustra a tecnologia do JDBC. Os programadores Java devem conseguir aces- sar um banco de dados efetuando declarações SQL padrão, através de uma API JDBC. Estas declarações são enviadas ao gerenciador de drivers JDBC, que se encarrega de utilizar os dri- vers disponíveis para o banco de dados. Quando já está implementado um driver JDBC para o determinado banco de dados, o gerenciador passa as declarações SQL para o driver através de uma API do driver JDBC. Caso não tenha um driver JDBC disponível, então é utilizada uma ponte JDBC/ODBC, que envia as declarações SQL para o driver ODBC (interface de programação C para SQL). 26
  • 28. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF 3.2 Instalação 3.2.1 MySQL shell> apt-cache search mysql-server A saída será semelhante a esta: mysql-server - empty transitional package mysql-server-4.1 - empty transitional package mysql-server-5.0 - mysql database server binaries phpbb2-conf-mysql - Automatic configurator for phpbb2 on MySQL database scoop - Web-based collaborative media application webmin-mysql - mysql-server control module for webmin A útlima versão do MySQL-server neste exemplo é a 5.0 . Agora para instalar basta digitar- mos o comando: shell> apt-get install mysql-server-5.0 A saída será semelhante a esta: Lendo Lista de Pacotes... Pronto Construindo Árvore de Dependências... Pronto Os pacotes extra a seguir serão instalados: gcc-4.0-base libdbd-mysql-perl libdbi-perl libgcc1 libmysqlclient15 libncurses5 libnet-daemon- erl libplrpc-perl libreadline4 libreadline5 libstdc++6 mysql-client-5.0 mysql-common readline-common Pacotes sugeridos : dbishell libcompress-zlib-perl Os NOVOS pacotes a seguir serão instalados: gcc-4.0-base libdbd-mysql-perl libdbi-perl libmysqlclient15 libnet-daemon-perl libplrpc-perl libstdc++6 mysql-client-5.0 mysql-common mysql-server-5.0 readline-common Os pacotes a seguir serão atualizados : libgcc1 libncurses5 libreadline4 libreadline5 4 pacotes atualizados, 11 pacotes novos instalados, 0 a serem removidos e 712 não atualizados. É preciso fazer o download de 26,9MB de arquivos. Depois de desempacotamento, 59,4MB adicionais de espaço em disco serão usados. Quer continuar? [S/n] Digite S para que os pacotes sejam recebidos. Uma tela de configuração aparecerá, bastando continuar. Pronto, seu Banco de Dados esta pronto para ser utilizado! 3.2.2 Visão Detalhada da Instalação 1. Baixe o arquivo com o código fonte do MySQL em 27
  • 29. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-5.0.22.tar.gz/from/ http://www.linorg.usp.br/mysql/ Este é um servidor brasileiro. Caso haja algum problema acesse http://dev.mysql.com/downloads/mysql/5.0.html. 2. Acesse o terminal e escolha um diretório para descompacatar o arquivo tar.gz baixado. 3. Distribuições fontes do MySQL são fornecidas como arquivos .tar compactados e tem nomes como mysql-versão.tar.gz. Dentro do diretório escolhido para instalação digite o comando: tar xvzf mysql-versão.tar.gz 4. Adicione um usuário e grupo para o mysql executar assim: groupadd mysql useradd -g mysql mysql Useradd e groupadd podem mudar em diferentes versões de Unix. Elas podem também ser chamadas adduser e addgroup. Você pode escolher outros nomes para o usuário e grupo em vez de mysql. 6. Acesse o diretório onde o arquivo foi descompactado: cd diretorio 7. Configure e compile tudo: ./configure --prefix=/usr/local/mysql make Obs.: –prefix indicará o diretório onde os arquivos binários ficarão armazenados. Neste ponto o mysql já está operacional, porém não está instalado no diretório padrão do sistema. 8. Instalar tudo: make install Você deve executar este comando como root. 9. Crie as tabelas de permissões do MySQL. bin/mysql_install_db 10. Altere o dono dos binários para root e do diretório de dados para o usuário que irá executar o mysqld: chown -R root /usr/local/mysql chown -R mysql /usr/local/mysql/var chgrp -R mysql /usr/local/mysql O primeiro comando altera o atributo de propriedade dos arquivos para o usuário root, o segundo altera o atributo de propriedade do diretório de dados para o usuário mysql, e o terceiro altera o atributo de grupo para o grupo mysql. 11. Inicie o servidor MySQL com o seguinte comando: /usr/local/mysql/bin/mysqld_safe --user=mysql & 28
  • 30. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF 3.2.3 Instalando ambiente Java e JDBC Esta lição irá auxiliá-lo a instalar o ambiente de desenvolvimento JDBC. Para isso siga os seguintes passos: 1. Instale a versão mais atualizada da plataforma Java em sua máquina. Você poderá encon- trar a última versão de Java aqui: http://java.sun.com/products/JDK/CurrentRelease Ou você poderá optar por: # aptitude install sun-java5-jdk Aí ele irá baixar os pacotes: gsfonts-x11 java-common libltdl3 odbcinst1debian1 sun-java5-bin sun-java5-demo sun-java5-jdk sun-java5-jre unixodbc. Aceite os termos da SUN. Dê uma conferida aí: # java -version java version "1.5.0_10" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_10-b03) Java HotSpot(TM) Client VM (build 1.5.0_10-b03, mixed mode, sharing) Agora já podemos usar o javac, mas vamos passar um pouco disso. 2.Instale o driver. Um driver JDBC pode vir de várias fontes tais como: softwares de banco de dados, do pró- prio Java DB, Oracle, MySQL e etc. Normalmente o driver deverá conter instruções para a sua instalação. 3.2.4 Tipos de Drivers JDBC Tipo 1 - Driver Ponte JDBC-ODBC São drivers que implementam a API JDBC como um mapa de acesso conectando-se a uma outra API. Estes tipos de drivers são geralmente dependentes de bibliotecas nativas, o que limita a portabilidade. Tipo 2 - Driver API-Nativa Parcialmente Java É uma "casca"sobre uma implementação nativa de um driver de acesso ao banco. São drivers escritos parcialmente em Java e parcialmente pelo seu código nativo. Um erro neste driver nativo pode derrubar a JVM e também tem portabilidade reduzida. Tipo 3 - Driver Java c/ Net-Protocol Usa cliente puramente Java utilizando um middleware para a conexão com o banco de dados. Tipo 4 - Driver Java Puro Driver totalmente implementado em Java. Conhece todo o protocolo de comunicação com o BD e pode acessar o BD sem software extra. É o tipo de driver mais indicado. 29
  • 31. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF 3.2.5 Instalando o driver para MySQL em sua máquina Baixe direto neste link: http://download.softagency.net/MySQL/Downloads /Connector-J/mysql-connector-java-5.0.7.zip Após baixar descompacte numa pasta qualquer. Abra a pasta que foi criada e copie o arquivo mysql-connector-java-5.0.7-bin.jar para a pasta de instalação do java (JDK) e coloque dentro de jre/lib/ext. No meu caso a pasta é a seguinte: /usr/lib/jvm/java-1.5.0-sun/jre/lib/ext Instale um Gerenciador de Banco de Dados caso necessite ou use somente o terminal. 3.3 Bases e passos para Conexão com Banco de Dados Java Antes de criar uma conexão JDBC com o BD é necessário importar o pacote "java.sql", exem- plo: import java . sql . * ; O asterisco(*) indica que todas as classes pertencentes ao pacote java.sql serão importadas. 1. Carregando o driver do BD. Neste passo do processo de conexão com o JDBC nós iremos carregar a classe driver atra- vés da seguinte chamada: Class.forName(), onde o "nome"da classe driver é passado como argumento. Ou seja, a String passada ao método forName() é o nome completo qualificado da classe que implementa o Driver JDBC de cada banco de dados. Cada driver possui um nome diferente, consulte a documentação do fabricante. Desta forma o carregamento do driver é feito de forma dinâmica (via Class.forName), dando flexibilidade ao código. Para maior flexibilidade, o nome poderia estar contido em um arquivo de configuração externo, podendo ser alterado sem a necessidade de recompilar o fonte Java. Depois de carregado, a classe driver cria uma instância de si mesma. A partir dai, um cliente poderá conectar-se ao servidor do banco de dados através do driver. Para a aplicação Java comunicar-se com um banco de dados e acessar os seus dados, uma conexão com o BD deve ser estabelecida da seguinte forma: • carregamento do driver JDBC específico; • criação da conexão com o BD. A partir da conexão é possível interagir com o BD, fazendo consultas, atualização e busca a informações. try { Class . forName ( "com.mysql.jdbc.Driver" ) ; / / Ou qualquer outro d r i v e r } catch ( Exception x ) { 5 System . out . p r i n t l n ( " Não foi possível carregar o driver!" ) ; } Após ter carregado o driver é possível fazer então a conexão com o BD. 30
  • 32. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF 2.Criando a conexão A classe JDBC DriverManager define objetos que podem conectar aplicações Java ao driver JDBC. O DriverManager é considerado a espinha dorsal(backbone) da arquitetura JDBC, é ele quem gerencia quais drivers estão instalados no sistema. Quando um cliente requisita uma co- nexão e determina qual a URL, o DriverManager é que reconhece a URL e encontra o driver a ser usado para criar a conexão com o servidor. Uma aplicação pode estabelecer várias conexões com uma única base de dados, já uma conexão JDBC representa uma sessão com uma base de dados específica e, neste contexto de conexão, é que os parâmetros escritos em SQL são executados e resultados são retornados. Seu método getConnection(), juntamente com o geren- ciamento do nome do usuário, senha e da URL JDBC estabelece a conexão retornando o objeto da mesma. Existe outra interface também muito utilizada chamada DataSource, que permite detalhar me- lhor a fonte de dados da camada superior tornando a aplicação mais transparente. Sintaxe JDBC URL: jdbc : <nomedoBanco>:<subnome>[ ListadePropriedades ] O <nomedoBanco> é a parte da URL que identifica o BD específico. Um BD pode estar em di- ferentes lugares tais como: no diretórito de trabalho, na CLASSPATH, em um arquivo JAR, em um Java DB ou em qualquer lugar do seu sistema. Cada BD pode conter também um subprotocolo que é específico, mas que vem determinado no manual de uso e documentação do driver. • Cada driver tem seu próprio subprotocolo; • Cada subprotocolo tem sua própria sintaxe para a fonte. String u r l = "jdbc:mysql://localhost:3306/mysql" try { Connection dbConnection = DriverManager . getConnection ( url , "usuario" ,"senha" ) ; } 5 catch ( SQLException x ) { System . out . p r i n t l n ( "Não foi possível estabelecer a conexão!" ) ; } No exemplo anterior nota-se que primeiramente foi atribuído à variável "url"a própria url de conexão com o banco. Em seguida, dentro do bloco de captura de erros "try"criou-se a conexão com o banco, sendo passado como parâmetros para DriverManager.getConnection respectiva- mente a url, o nome de usuário e senha do utilizador da base de dados. Ao final, tem-se a captura de erros pelo bloco "catch", caso a conexão não seja estabelecida. As principais classes e interfaces do pacote java.sql são: • DriverManager - gerencia o driver e cria uma conexão com o banco; • Connection - classe que representa a conexão com o bando de dados; • Statement - controla e executa uma instrução SQL; • CallableStatement - representa um procedimento armazenado. Pode ser usado para exe- cutar procedimentos armazenados em um RDBMS que os suportam; 31
  • 33. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF • PreparedStatement - controla e executa uma instrução SQL. Pode ser mais adequada do que a Statement por ser mais ágil e adequado para comandos usados várias vezes; • ResultSet - contém o conjunto de dados retornado por uma consulta SQL; • ResultsetMetaData - classe que trata dos metadados do banco; • SQLException - classe para exceções, encapsula erros básicos de banco de dados. A interface Connection possui os métodos para criar um Statement, fazer o commit ou roll- back de uma transação, verificar se o auto commit está ligado e poder ligá-lo ou desligá-lo, etc. As interfaces Statement e PreparedStatement possuem métodos para executar comandos SQL. ResultSet possui método para recuperar os dados resultantes de uma consulta, além de retornar os metadados da consulta. ResultsetMetaData possui métodos para recuperar as meta informa- ções do banco. Com a conexão estabelecida já é possível interagir com o BD de várias formas: • criar tabelas e outros elementos; • inserir, alterar e remover registros; • buscar registros; • buscar as meta-dados do banco. As três primeiras interações se dão por meio das interfaces Statement ou PreparedStatement, que veremos a seguir. Todos os exemplos estão baseados no uso do driver JDBC fornecido pela MySQL. Porém, os mesmos exemplos podem ser usados com qualquer banco de dados rela- cional que possua um driver JDBC, necessitando apenas trocar o nome do driver e a URL de conexão. Lembrando que o JAR do driver JDBC, fornecido pelo fabricante, precisa ser disponibi- lizado no CLASSPATH da aplicação. 3. Criando objetos de Statement Para executar comandos SQL é necessário, primeiramente, instanciar um objeto de Statement através do método createStatement() de Connection, o qual retorna um objeto Statement, que é usado para executar um comando SQL no BD. O método executeUpdate() de Statement recebe o SQL que será executado. Este método deve ser usado para DDLs e comandos SQL de INSERT, UPDATE ou DELETE. Depois os métodos close() de Statement e Connection são invocados para liberar os recursos. Porém, o Statement só pode ser liberado com o método close() ao final das execuções de todos os comandos SQL. / / Criando a conexão Statement statement = dbConnection . createStatement ( ) ; / / Fechando a conexão 5 statement . close ( ) ; dbConnection . close ( ) ; Três tipos de Statements • Statement: executa comandos simples de SQL sem parâmetros. 32
  • 34. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF Statement createStatement ( ) ; • Prepared Statement: executa comandos SQL pré-compilados com ou sem parâmetros, agilizando sua execução e sendo útil para comandos executados repetidas vezes; prepareStatement ( String sql ) ; / / Retorna um novo objeto de PreparedStatement • Callable Statement: executa uma chamada a procedimentos SQL contidos na base de dados. Esses procedimentos são um grupo de comandos SQL que formam uma unidade lógica e que executam tarefas específicas, além de serem usados para encapsular um con- junto de operações ou "queries"(consultas) a serem executadas no servidor da base de dados. O objeto de CallableStatement contém apenas a chamada ao procedimento arqui- vado, não contendo o próprio procedimento. CallableStatement prepareCall ( String sql ) ; / / Retorna um novo objeto de CallableStatement . 4. Executando comandos SQL através dos objetos de Statement e retornando o Java ResultSet A recuperação de dados do BD é trivial e é feita através da execução de uma query SQL, sendo que os dados podem ser recuperados através da interface ResultSet, retornada na execu- ção da query(consulta). Como ja foi dito, a interface Statement define métodos que serão usados para interagir com o BD pela execução de comandos SQL. A classe Statement possui três métodos para executar comandos: executeQuery(), executeUpdate(), and execute(). Para um comando SELECT, usa-se o método executeQuery. Para comandos que criam ou modificam tabelas o método a ser usado é o executeUpdate. Nota: Comandos para criar, alterar ou deletar uma tabela são executados como métodos executeUpdate, sendo exemplos de comandos DDL(Linguagem de Definição de Dados). Uma DDL permite ao usuário definir tabelas novas e elementos associados. A maioria dos bancos de dados de SQL tem extensões proprietárias no DDL. O execute() executa um comando SQL que foi escrito como um objeto de String. 3.4 Obtendo valores com ResultSet As linhas que satisfazem uma determinada consulta são chamadas "Result set". O número de linhas retornadas pelo ResultSet pode ser zero ou mais. Um usuário pode acessar arquivos provenientes de ResultSet usando um cursor que percorre uma linha do topo ao início. Um cursor pode apontar para as linhas do ResultSet, tendo a habilidade de determinar o caminho pelo qual a linha está sendo acessada naquele momento. A API JDBC suporta um cursor capaz de se mover em ambas as direções (para frente e para trás) e, ainda, permitindo que o cursor se mova para uma linha específica ou para uma linha que esteja em uma posição em relação a outra linha. 33
  • 35. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF A interface ResultSet provê métodos para obtenção e manipulação dos resultados de consul- tas. Os objetos de ResultSet podem ter diferentes funcionalidades e características tais como tipicidade, concorrência e controlabilidade do cursor. O ResultSet provê acesso a uma tabela de dados gerada pela execução do Statement. As linhas da tabela são tomadas em sequência. O ResultSet mantém o cursor apontando para a linha atual do arquivo. O método next() de ResultSet é usado para mover o cursor para a próxima linha do registro. Este método retorna false caso não existam mais registros e retorna true caso contrário. Os valores dos registros podem ser recuperados com o método getString(), que recebe o nome do campo ou seu "alias"(campo). 3.4.1 Tipos de ResultSet O tipo de objeto de ResultSet determina o nível de sua funcionalidade em dua áreas. Na forma como o cursor pode ser manipulado e em como mudança atuais feitas em arquivos fonte subjacentes são refletidas pelos objetos de ResultSet. A sensibilidade do objeto de ResultSet é determinada por um dos seguintes tipos: • TYPE_FORWARD_ONLY - o ResultSet neste caso é unidirecional, sendo que o cursor se move apenas para frente, da primeira até a última linha; • TYPE_SCROLL_INSENSITIVE - o ResultSet neste caso é multidirecional, sendo que seu cursor pode mover-se em ambos os sentidos(para frente e para trás) e também pode se mover em uma posição absoluta(determinada). • TYPE_SCROLL_SENSITIVE - o ResultSet neste caso também é multidirecional, sendo que seu cursor pode se mover em ambos os sentidos (para frente e para trás) e, ainda, pode mover-se para uma posição absoluta(determinada). Agora você irá ver como mandar comandos SELECT para um programa escrito na linguagem de programação JAVA e como obter os resultados visualizáveis. Antes de usar os benefícios desses tipos é necessário que você crie um objetos multidirecional de ResultSet. O seguinte código ilustra como criar esse tipo de objeto. Statement stmt = con . createStatement ( ResultSet .TYPE_SCROLL_SENSITIVE, ResultSet .CONCUR_READ_ONLY) ; ResultSet srs = stmt . executeQuery ( "....." ) ; O primeiro argumento é uma das três constantes adicionadas a API de ResultSet para indicar o tipo de objeto de ResultSe. Seja TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE e TYPE_SCROLL_SENSITIVE. Já o segundo argumento é uma das duas constantes para espe- cificar se um ResultSet é read-only(apenas leitura) ou atualizável. Seja CONCUR_READ_ONLY e CONCUR_UPDATABLE. Se você não especificar uma constante para o tipo e para atualização do objeto de ResultSet, então será usado automaticamente os tipos TYPE_FORWARD_ONLY e CONCUR_READ_ONLY. 3.4.2 Métodos de ResultSet Além do método getString(), a interface ResultSet dispõe de vários outros métodos que recu- peram dados do BD diretamente nos tipos mais adequados. Esses métodos recebem o nome do 34
  • 36. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF alias ou o número do campo no select, iniciando-se por um(1). Quando um objeto de ResultSet é criado, o cursor é posicionado antes da primeira linha. Para mover o cursor são utilizados os seguintes métodos: • next() - move o cursor para frente uma linha. Este método retorna false caso não existam mais registros e retorna true caso contrário; • previous() - move o cursor para trás uma linha. Este método retorna true se o cursor está posicionado em uma linha e falso caso o cursor esteja posicionado antes da primeira linha; • first() - move o cursor para a primeira linha no objeto de ResultSet. Retorna true se o cursor estiver posicionado na primeira linha e false se o objeto de ResultSet não tiver nenhuma linha; • last() - move o cursor para a última linha do objeto de ResultSet. Retorna true se o cursor estiver posicionado na última linha e false se o objeto de ResultSet não tiver nenhuma linha; • beforeFirst() - posiciona o cursor no início do objeto de ResultSet, antes da primeira linha. Se o objeto de ResultSet não tiver nenhuma linha este método não terá efeito algum; • afterLast() - posiciona o cursor ao final o objeto de ResultSet, depois da última linha. Se o objeto de ResultSet não tiver nenhuma linha este método não terá efeito algum; • relative(int rows) - mover o cursor para posição relativa à atual posição; • absolute(int n) - posiciona o cursor para a linha "n"do objeto de ResultSet; Métodos de getxxx Métodos de ResultSet Tipos de dados SQL getInt() Integer getLong() Big int getFloat() Real getDouble() Float getBignum() Decimal getBoolean() Bit getString() Char, Varchar getDate() Date getTime() Time getTimestamp() Time stamp getObject() Qualquer Tipo 3.4.3 Metadados Existe, ainda, a interface ResultSetMetaData que contém informações sobre os tipos e pro- priedades das linhas de ResultSet. Ela pode lhe fornecer informações como número de colunas recebidas, nome, tipo de colunas, se as colunas aceitam dados nulos, campos de data e etc. A classe ResultSetMetaData é construída pelo objeto de Connection e pode ser criada da se- guinte maneira: ResultSet rs = stmt . executeQuery ( query ) ; ResultSetMetaData meta = rs . getMetaData ( ) ; 35
  • 37. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF 3.5 Criando Tabelas com comandos SQL Pode-se criar tabelas de várias maneiras. Seja usando o banco de dados em linha de co- mando ou IDE interface gráfica, ou ainda, usando JDBC SQL escrito em um aplicativo(essa será a forma abordada). Tabelas são compostas de linhas e colunas. Cada linha representa um ar- quivo no banco de dados. Colunas são também conhecidas como campos ou atributos. Você pode relacionar uma tabela com outra no banco de dados pela comparação de uma coluna com o valor de uma outra coluna de uma outra tabela. Se as tabelas não tiverem colunas em comum, então não há como relacionar as tabelas. Por ser possível conectar essas tabelas pode-se extrair dados de tabelas múltiplas com uma única consulta, isso se seu mecanismo de consulta suportar aquele tipo de consulta. Para executar consultas ou atualizações utilizando o objeto Statement os comandos são: QUERY (SELECT) ResultSet rs = statement . executeQuery ( "select * from Empregados" ) ; ACTION COMMAND (UPDATE/DELETE) 5 int iReturnValue = statement . executeUpdate ( "update Pedidos set Prodnome = ?CAIXA' where Prod_ID = 1234567" ) ; Para integrar as tabelas em um único banco, você precisará ter certeza de que cada tabela tem uma coluna que contém um valor único para aquela tabela. Essa coluna específica é chamada chave. Logo abaixo segue um programa JDBC que mostra o uso de executeUpdate() para criação de tabelas. Empregado_ID eh chave primária que forma a relação entre as duas tabelas. import javax . swing . JOptionPane ; import java . sql . * ; public class JDBCCriandoTabela { 5 / / JDBC Criando Tabelas static String userid="" , password = "" ; static String u r l = "jdbc:mysql://localhost:3306/dbexemplo" ; / / String u r l = " jdbc : mySubprotocol : myDataSource " ; static Statement stmt ; static Connection con ; 10 public static void main ( String args [ ] ) { JOptionPane . showMessageDialog ( null , "Programaçãoo JDBC mostrando Criação de Tabelas" ) ; int escolha = −1; 15 do{ escolha = pegueEscolha ( ) ; i f ( escolha != 0) { pegueSelecionados ( escolha ) ; } 20 } while ( escolha != 0) ; System . e x i t (0) ; } 25 public static int pegueEscolha ( ) { 36
  • 38. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF String escolha ; int esco ; escolha = JOptionPane . showInputDialog ( null , 30 "1. create Empregados Tablen"+ "2. Cria Tabela Produtosn"+ "0. Exit(Sair)nn"+ "Entre com sua escolha" ) ; esco = Integer . parseInt ( escolha ) ; 35 return esco ; } public static void pegueSelecionados ( int escolha ) { 40 i f ( escolha ==1) { criaEmpregados ( ) ; } i f ( escolha ==2) { criaPedidos ( ) ; 45 } } public static Connection getConnection ( ) { 50 try { Class . forName ( "com.mysql.jdbc.Driver" ) ; / / Class . forName ( " myDriver . ClassName " ) ; } catch ( java . lang . ClassNotFoundException e ) { 55 System . err . p r i n t ( "ClassNotFoundException: " ) ; System . err . p r i n t l n ( e . getMessage ( ) ) ; } try { 60 con = DriverManager . getConnection ( url , userid , password ) ; } catch ( SQLException ex ) { System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; } 65 return con ; } / *CREATE TABLE Empregados ( 70 Empregado_ID INTEGER, Nome VARCHAR(30) ) ; * / public static void criaEmpregados ( ) { 75 Connection con = getConnection ( ) ; String c r i a S t r i n g ; c r i a S t r i n g = "create Empregados Table (" + "Empregado_ID INTEGER, " + 80 "Nome VARCHAR(30))" ; try { stmt = con . createStatement ( ) ; stmt . executeUpdate ( c r i a S t r i n g ) ; stmt . close ( ) ; 37
  • 39. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF 85 con . close ( ) ; } catch ( SQLException ex ) { System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; } 90 JOptionPane . showMessageDialog ( null , "Tabela Empregados Criada" ) ; } / *CREATE TABLE Pedidos ( Prod_ID INTEGER, 95 ProdutoNome VARCHAR(20) , Empregado_ID INTEGER ) ; * / public static void criaPedidos ( ) 100 { Connection con = getConnection ( ) ; String c r i a S t r i n g ; c r i a S t r i n g = "create Pedidos Table (" + 105 "Prod_ID INTEGER, " + "ProdutoNome VARCHAR(20), "+ "Empregado_ID INTEGER )" ; 110 try { stmt = con . createStatement ( ) ; stmt . executeUpdate ( c r i a S t r i n g ) ; stmt . close ( ) ; 115 con . close ( ) ; } catch ( SQLException ex ) { System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; } 120 JOptionPane . showMessageDialog ( null , "Pedidos Table Criada" ) ; } } / / Fim da Classe 3.6 Obtendo Dados de tabelas SQL Nós podemos usar comandos SELECT em um programa Java para obter dados e imprimi-los para as respectivas tabelas. O JDBC retorna resultados em objetos de ResultSet, por isso é pre- ciso declarar um instância da classe ResultSet para manter os resultados. SELECT é a palavra chave SQL que executa a consulta. Invocamos o método executeQuery(), usando o comando texto como um parâmetro. O resultado da consulta é capturado em resultados do objeto de Re- sultSet. Note que o executeQuery() sempre retorna um ResultSet, embora não seja necessário haver quaisquer linhas. O valor retornado por uma executeQuery é um objeto de ResultSet contendo o resultado da consulta enviada pelo DBMS. Lembre-se também que para proceder para as próximas linhas de ResultSet usamos o método next(), que move o ponteiro através das linhas de dados. O ResultSet 38
  • 40. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF mantém o cursor apontando para a linha atual. Pelo fato do cursor estar posicionado inicialmente antes da primeira linha, precisamos antes chamar netx() para visualizar as colunas. Logo abaixo segue um programa JDBC que mostra o uso de executeUpdate() para obtenção de valores de ResultSet. import javax . swing . JOptionPane ; import java . sql . * ; public class JDBCObtendoDados{ 5 / / JDBC Obtendo Dados da Tabela static String userid="" , password = "" ; static String u r l = "jdbc:mysql://localhost:3306/dbexemplo" ; / / String u r l = " jdbc : mySubprotocol : myDataSource " ; static Statement stmt ; 10 static Connection con ; public static void main ( String args [ ] ) { JOptionPane . showMessageDialog ( null , "Programação JDBC mostrando Obtenção de Dados de Tabelas" ) ; 15 int escolha = −1; do{ escolha = pegueEscolha ( ) ; i f ( escolha != 0) { 20 pegueSelecionados ( escolha ) ; } } while ( escolha != 0) ; System . e x i t (0) ; 25 } public static int pegueEscolha ( ) { String escolha ; 30 int esco ; escolha = JOptionPane . showInputDialog ( null , "1. Crie Tabela Empregadosn"+ "2. Crie Tabela Produtosn"+ "3. Insira dados na Tabela Empregadosn"+ 35 "4. Insira dados na Tabela Pedidosn"+ "5. Obtenha dados da Tabela Empregadosn"+ "6. Obtenha dados da Tabela Pedidosn"+ "0. Exit(sair)nn"+ "Entre com sua escolha" ) ; 40 esco = Integer . parseInt ( escolha ) ; return esco ; } 45 public static void pegueSelecionados ( int escolha ) { i f ( escolha ==1) { criaEmpregados ( ) ; } i f ( escolha ==2) { 50 criaPedidos ( ) ; } i f ( escolha ==3) { insiraEmpregados ( ) ; } 39
  • 41. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF 55 i f ( escolha ==4) { insiraPedidos ( ) ; } i f ( escolha ==5) { obtenhaEmpregados ( ) ; 60 } i f ( escolha ==6) { obtenhaPedidos ( ) ; } } 65 public static Connection getConnection ( ) { try { 70 Class . forName ( "sun.jdbc.odbc.JdbcOdbcDriver" ) ; / / Class . forName ( " myDriver . ClassName " ) ; } catch ( java . lang . ClassNotFoundException e ) { System . err . p r i n t ( "ClassNotFoundException: " ) ; 75 System . err . p r i n t l n ( e . getMessage ( ) ) ; } try { con = DriverManager . getConnection ( url , 80 userid , password ) ; } catch ( SQLException ex ) { System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; } 85 return con ; } / *CREATE TABLE Empregados ( 90 Empregado_ID INTEGER, Nome VARCHAR(30) ) ; * / 95 public static void criaEmpregados ( ) { Connection con = getConnection ( ) ; String c r i a S t r i n g ; 100 c r i a S t r i n g = "create Empregados Table (" + "Empregado_ID INTEGER, " + "Nome VARCHAR(30))" ; try { stmt = con . createStatement ( ) ; 105 stmt . executeUpdate ( c r i a S t r i n g ) ; stmt . close ( ) ; con . close ( ) ; } catch ( SQLException ex ) { 110 System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; } JOptionPane . showMessageDialog ( null , "Tabela Empregados Criada" ) ; } 40
  • 42. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF 115 / *CREATE TABLE Pedidos ( Prod_ID INTEGER, ProdutoNome VARCHAR(20) , Empregado_ID INTEGER ) ; * / 120 public static void criaPedidos ( ) { Connection con = getConnection ( ) ; 125 String c r i a S t r i n g ; c r i a S t r i n g = "create Pedidos Table (" + "Prod_ID INTEGER, " + "ProdutoNome VARCHAR(20), "+ "Empregado_ID INTEGER )" ; 130 try { stmt = con . createStatement ( ) ; stmt . executeUpdate ( c r i a S t r i n g ) ; 135 stmt . close ( ) ; con . close ( ) ; } catch ( SQLException ex ) { 140 System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; } JOptionPane . showMessageDialog ( null , "Tabela Pedidos Criada" ) ; } 145 / * Empregado_ID Nome 6323 Helmuth 5768 Banderas 1234 Savio 5678 Michel * / 150 public static void insiraEmpregados ( ) { Connection con = getConnection ( ) ; String insiraString1 , insiraStr ing 2 , i ns iraStri ng 3 , i n s i r a S t r i n g 4 ; 155 i n s i r a S t r i n g 1 = "insert into Empregados values(6323, 'Helmuth')" ; i n s i r a S t r i n g 2 = "insert into Empregados values(5768, 'Banderas')" ; i n s i r a S t r i n g 3 = "insert into Empregados values(1234, 'Savio')" ; i n s i r a S t r i n g 4 = "insert into Empregados values(5678, 'Michel')" ; 160 try { stmt = con . createStatement ( ) ; stmt . executeUpdate ( i n s i r a S t r i n g 1 ) ; stmt . executeUpdate ( i n s i r a S t r i n g 2 ) ; 165 stmt . executeUpdate ( i n s i r a S t r i n g 3 ) ; stmt . executeUpdate ( i n s i r a S t r i n g 4 ) ; stmt . close ( ) ; con . close ( ) ; 170 } catch ( SQLException ex ) { System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; 41
  • 43. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF } JOptionPane . showMessageDialog ( null , "Dados Inseridos na Tabela Empregados" ) ; 175 } / * Prod_ID ProdutoNome Empregado_ID 543 Cinto 6323 432 Garrafa 1234 180 876 Anel 5678 * / public static void insiraPedidos ( ) { Connection con = getConnection ( ) ; 185 String insiraString1 , insiraStr ing 2 , i ns iraStri ng 3 , i n s i r a S t r i n g 4 ; i n s i r a S t r i n g 1 = "insert into Pedidos values(543, 'Cinto', 6323)" ; i n s i r a S t r i n g 2 = "insert into Pedidos values(432, 'Garrafa', 1234)" ; i n s i r a S t r i n g 3 = "insert into Pedidos values(876, 'Anel', 5678)" ; 190 try { stmt = con . createStatement ( ) ; stmt . executeUpdate ( i n s i r a S t r i n g 1 ) ; 195 stmt . executeUpdate ( i n s i r a S t r i n g 2 ) ; stmt . executeUpdate ( i n s i r a S t r i n g 3 ) ; stmt . close ( ) ; con . close ( ) ; 200 } catch ( SQLException ex ) { System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; } JOptionPane . showMessageDialog ( null , "Dados Inseridos na Tabela Pedidos" ) ; 205 } public static void obtenhaEmpregados ( ) { Connection con = getConnection ( ) ; String r e s u l t = null ; 210 String selecioneString ; selecioneString = "select * from Empregados" ; r e s u l t ="Empregado_IDttNomen" ; try { stmt = con . createStatement ( ) ; 215 ResultSet rs = stmt . executeQuery ( selecioneString ) ; while ( rs . next ( ) ) { int id = rs . g e t I n t ( "Empregado_ID" ) ; String nome = rs . getString ( "Nome" ) ; r e s u l t += id+"tt"+ nome+"n" ; 220 } stmt . close ( ) ; con . close ( ) ; } catch ( SQLException ex ) { 225 System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; } JOptionPane . showMessageDialog ( null , r e s u l t ) ; } 42
  • 44. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF 230 public static void obtenhaPedidos ( ) { Connection con = getConnection ( ) ; String r e s u l t = null ; String selecioneString ; selecioneString = "select * from Pedidos" ; 235 r e s u l t ="Prod_IDttProdutoNomettEmpregado_IDn" ; try { stmt = con . createStatement ( ) ; ResultSet rs = stmt . executeQuery ( selecioneString ) ; while ( rs . next ( ) ) { 240 int pr_id = rs . g e t I n t ( "Prod_ID" ) ; String prodNome = rs . getString ( "ProdutoNome" ) ; int id = rs . g e t I n t ( "Empregado_ID" ) ; r e s u l t +=pr_id+"tt"+ prodNome+"tt"+id+"n" ; } 245 stmt . close ( ) ; con . close ( ) ; } catch ( SQLException ex ) { System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; 250 } JOptionPane . showMessageDialog ( null , r e s u l t ) ; } } / / Fim da Classe 43
  • 45. Capítulo 4 CONCEITOS AVANÇADOS Como usar Inserções, atualizar Tabelas, melhorar a performance, capturar erros e advertên- cias, usar Transactions, Roll Backs e Savepoints. 4.1 Inserindo Dados em Tabelas SQL Nós iremos inserir dados nas tabelas Empregados e Ordem criadas anteriormente. Será uma linha de cada vez para fornecer a informação a ser armazenada em cada coluna daquela linha. Os valores a serem inseridos nas colunas são listados na mesma ordem em que as colunas foram declaradas quando a tabela foi criada. Logo abaixo segue um programa JDBC que mostra o uso de executeUpdate() para criação de tabela e inserção de dados na mesma. import javax . swing . JOptionPane ; import java . sql . * ; public class JDBCInserindoDados { 5 / / JDBC Exemplo de Insercao static String userid="" , password = "" ; static String u r l = "jdbc:mysql://localhost:3306/dbexemplo" ; / / String u r l = " jdbc : mySubprotocol : myDataSource " ; static Statement stmt ; static Connection con ; 10 public static void main ( String args [ ] ) { JOptionPane . showMessageDialog ( null , "Programação JDBC mostrando Inserção de Dados em Tabelas" ) ; int escolha = −1; 15 do{ escolha = pegueEscolha ( ) ; i f ( escolha != 0) { pegueSelecionados ( escolha ) ; } 20 } while ( escolha != 0) ; System . e x i t (0) ; } 25 public static int pegueEscolha ( ) { String escolha ; 44
  • 46. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF int esco ; escolha = JOptionPane . showInputDialog ( null , 30 "1. create Empregados Tablen"+ "2. Cria Tabela Produtosn"+ "3. Insira dados na Tabela Empregadosn"+ "4. Insira dados na Tabela Produtosn"+ "0. Exit(sair)nn"+ 35 "Entre com sua escolha" ) ; esco = Integer . parseInt ( escolha ) ; return esco ; } 40 public static void pegueSelecionados ( int escolha ) { i f ( escolha ==1) { criaEmpregados ( ) ; } 45 i f ( escolha ==2) { criaPedidos ( ) ; } i f ( escolha ==3) { insiraEmpregados ( ) ; 50 } i f ( escolha ==4) { insiraPedidos ( ) ; } } 55 public static Connection getConnection ( ) { try { 60 Class . forName ( "com.mysql.jdbc.Driver" ) ; / / Class . forName ( " myDriver . ClassName " ) ; } catch ( java . lang . ClassNotFoundException e ) { System . err . p r i n t ( "ClassNotFoundException: " ) ; System . err . p r i n t l n ( e . getMessage ( ) ) ; 65 } try { con = DriverManager . getConnection ( url , userid , password ) ; 70 } catch ( SQLException ex ) { System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; } 75 return con ; } / *CREATE TABLE Empregados ( Empregado_ID INTEGER, 80 Nome VARCHAR(30) ) ; * / public static void criaEmpregados ( ) 85 { 45
  • 47. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF Connection con = getConnection ( ) ; String c r i a S t r i n g ; c r i a S t r i n g = "create Empregados Table (" + 90 "Empregado_ID INTEGER, " + "Nome VARCHAR(30))" ; try { stmt = con . createStatement ( ) ; stmt . executeUpdate ( c r i a S t r i n g ) ; 95 stmt . close ( ) ; con . close ( ) ; } catch ( SQLException ex ) { System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; 100 } JOptionPane . showMessageDialog ( null , "Tabela Empregados Criada" ) ; } / *CREATE TABLE Pedidos ( 105 Prod_ID INTEGER, ProdutoNome VARCHAR(20) , Empregado_ID INTEGER ) ; * / 110 public static void criaPedidos ( ) { Connection con = getConnection ( ) ; String c r i a S t r i n g ; 115 c r i a S t r i n g = "create Pedidos Table (" + "Prod_ID INTEGER, " + "ProdutoNome VARCHAR(20), "+ "Empregado_ID INTEGER )" ; 120 try { stmt = con . createStatement ( ) ; stmt . executeUpdate ( c r i a S t r i n g ) ; 125 stmt . close ( ) ; con . close ( ) ; } catch ( SQLException ex ) { System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; 130 } JOptionPane . showMessageDialog ( null , "Tabela Pedidos Criada" ) ; } / * Empregado_ID Nome 135 6323 Helmuth 5768 Banderas 1234 Savio 5678 Michel * / public static void insiraEmpregados ( ) 140 { Connection con = getConnection ( ) ; String insiraString1 , insiraStr ing 2 , i ns iraStri ng 3 , i n s i r a S t r i n g 4 ; i n s i r a S t r i n g 1 = "insert into Empregados values(6323, 'Helmuth')" ; 46
  • 48. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF 145 i n s i r a S t r i n g 2 = "insert into Empregados values(5768, 'Banderas')" ; i n s i r a S t r i n g 3 = "insert into Empregados values(1234, 'Savio')" ; i n s i r a S t r i n g 4 = "insert into Empregados values(5678, 'Michel')" ; 150 try { stmt = con . createStatement ( ) ; stmt . executeUpdate ( i n s i r a S t r i n g 1 ) ; stmt . executeUpdate ( i n s i r a S t r i n g 2 ) ; stmt . executeUpdate ( i n s i r a S t r i n g 3 ) ; 155 stmt . executeUpdate ( i n s i r a S t r i n g 4 ) ; stmt . close ( ) ; con . close ( ) ; 160 } catch ( SQLException ex ) { System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; } JOptionPane . showMessageDialog ( null , "Dados Inseridos na Tabela Empregados" ) ; } 165 / * Prod_ID ProdutoNome Empregado_ID 543 Cinto 6323 432 Garrafa 1234 876 Anel 5678 170 * / public static void insiraPedidos ( ) { Connection con = getConnection ( ) ; 175 String insiraString1 , i nsiraStri ng2 , i ns ira Stri ng3 , i n s i r a S t r i n g 4 ; i n s i r a S t r i n g 1 = "insert into Pedidos values(543, 'Cinto', 6323)" ; i n s i r a S t r i n g 2 = "insert into Pedidos values(432, 'Garrafa', 1234)" ; i n s i r a S t r i n g 3 = "insert into Pedidos values(876, 'Anel', 5678)" ; 180 try { stmt = con . createStatement ( ) ; stmt . executeUpdate ( i n s i r a S t r i n g 1 ) ; stmt . executeUpdate ( i n s i r a S t r i n g 2 ) ; 185 stmt . executeUpdate ( i n s i r a S t r i n g 3 ) ; stmt . close ( ) ; con . close ( ) ; 190 } catch ( SQLException ex ) { System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; } JOptionPane . showMessageDialog ( null , "Dados Inseridos na Tabela Pedidos" ) ; } 195 } / / Fim da Classe 4.2 Atualizando Tabelas Podemos usar os comandos Update em programas Java para atualizar os arquivos de uma tabela. Logo abaixo segue um programa JDBC que mostra o uso de executeUpdate() para atua- 47
  • 49. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF lização de uma tabela. O valor retornado por um executeUpdate é do tipo int (inteiro) que indica quantas linhas da tabelas foram atualizadas. Exemplo : int n = stmt . executeUpdate ( ) ; import javax . swing . JOptionPane ; import java . sql . * ; 5 public class JDBCAtualizandoTabelas { / / JDBC Atualizando Tabelas static String userid="" , password = "" ; static String u r l = "jdbc:mysql://localhost:3306/dbexemplo" ; / / String u r l = " jdbc : mySubprotocol : myDataSource " ; static Statement stmt ; 10 static Connection con ; public static void main ( String args [ ] ) { JOptionPane . showMessageDialog ( null , "Programação JDBC mostrando Atualização de Dados em Tabelas" ) ; int escolha = −1; 15 do{ escolha = pegueEscolha ( ) ; i f ( escolha != 0) { pegueSelecionados ( escolha ) ; 20 } } while ( escolha != 0) ; System . e x i t (0) ; } 25 public static int pegueEscolha ( ) { String escolha ; int esco ; escolha = JOptionPane . showInputDialog ( null , 30 "1. Crie Tabela Empregadosn"+ "2. Crie Tabela Produtosn"+ "3. Insira dados na Tabela Empregadosn"+ "4. Insira dados na Tabela Pedidosn"+ "5. Obtenha dados da Tabela Empregadosn"+ 35 "6. Obtenha dados da Tabela Pedidosn"+ "7. Atualiza dados da Tabela Empregadosn"+ "0. Exit(sair)nn"+ "Entre com sua escolha" ) ; esco = Integer . parseInt ( escolha ) ; 40 return esco ; } public static void pegueSelecionados ( int escolha ) { 45 i f ( escolha ==1) { criaEmpregados ( ) ; } i f ( escolha ==2) { criaPedidos ( ) ; 50 } i f ( escolha ==3) { insiraEmpregados ( ) ; } i f ( escolha ==4) { 48
  • 50. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF 55 insiraPedidos ( ) ; } i f ( escolha ==5) { obtenhaEmpregados ( ) ; } 60 i f ( escolha ==6) { obtenhaPedidos ( ) ; } i f ( escolha ==7) { atualizaEmpregados ( ) ; 65 } } public static Connection getConnection ( ) { 70 try { Class . forName ( "com.mysql.jdbc.Driver" ) ; / / Class . forName ( " myDriver . ClassName " ) ; } catch ( java . lang . ClassNotFoundException e ) { System . err . p r i n t ( "ClassNotFoundException: " ) ; 75 System . err . p r i n t l n ( e . getMessage ( ) ) ; } try { con = DriverManager . getConnection ( url , 80 userid , password ) ; } catch ( SQLException ex ) { System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; } 85 return con ; } / *CREATE TABLE Empregados ( 90 Empregado_ID INTEGER, Nome VARCHAR(30) ) ; * / 95 public static void criaEmpregados ( ) { Connection con = getConnection ( ) ; String c r i a S t r i n g ; c r i a S t r i n g = "create table Empregados (" + 100 "Empregado_ID INTEGER, " + "Nome VARCHAR(30))" ; try { stmt = con . createStatement ( ) ; 105 stmt . executeUpdate ( c r i a S t r i n g ) ; stmt . close ( ) ; con . close ( ) ; } catch ( SQLException ex ) { 110 System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; } JOptionPane . showMessageDialog ( null , "Tabela Empregados Criada" ) ; 49
  • 51. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF } 115 / *CREATE TABLE Pedidos ( Prod_ID INTEGER, ProdutoNome VARCHAR(20) , Empregado_ID INTEGER ) ; * / 120 public static void criaPedidos ( ) { Connection con = getConnection ( ) ; String c r i a S t r i n g ; 125 c r i a S t r i n g = "create table Pedidos (" + "Prod_ID INTEGER, " + "ProdutoNome VARCHAR(20), "+ "Empregado_ID INTEGER )" ; 130 try { stmt = con . createStatement ( ) ; stmt . executeUpdate ( c r i a S t r i n g ) ; stmt . close ( ) ; 135 con . close ( ) ; } catch ( SQLException ex ) { System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; } 140 JOptionPane . showMessageDialog ( null , "Tabela Pedidos Criada" ) ; } / * Empregado_ID Nome 6323 Helmuth 145 5768 Banderas 1234 Savio 5678 Michel * / public static void insiraEmpregados ( ) { 150 Connection con = getConnection ( ) ; String insiraString1 , insiraStri ng 2 , in si raStri ng3 , i n s i r a S t r i n g 4 ; i n s i r a S t r i n g 1 = "insert into Empregados values(6323, 'Helmuth')" ; i n s i r a S t r i n g 2 = "insert into Empregados values(5768, 'Banderas')" ; 155 i n s i r a S t r i n g 3 = "insert into Empregados values(1234, 'Savio')" ; i n s i r a S t r i n g 4 = "insert into Empregados values(5678, 'Michel')" ; try { 160 stmt = con . createStatement ( ) ; stmt . executeUpdate ( i n s i r a S t r i n g 1 ) ; stmt . executeUpdate ( i n s i r a S t r i n g 2 ) ; stmt . executeUpdate ( i n s i r a S t r i n g 3 ) ; stmt . executeUpdate ( i n s i r a S t r i n g 4 ) ; 165 stmt . close ( ) ; con . close ( ) ; } catch ( SQLException ex ) { System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; 170 } JOptionPane . showMessageDialog ( null , "Data Inserted into Empregados Table" ) ; 50
  • 52. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF } / * Prod_ID ProdutoNome Empregado_ID 175 543 Cinto 6323 432 Garrafa 1234 876 Anel 5678 * / 180 public static void insiraPedidos ( ) { Connection con = getConnection ( ) ; String insiraString1 , insiraSt ring2 , insi raStri n g3 , i n s i r a S t r i n g 4 ; i n s i r a S t r i n g 1 = "insert into Pedidos values(543, 'Cinto', 6323)" ; 185 i n s i r a S t r i n g 2 = "insert into Pedidos values(432, 'Garrafa', 1234)" ; i n s i r a S t r i n g 3 = "insert into Pedidos values(876, 'Anel', 5678)" ; try { 190 stmt = con . createStatement ( ) ; stmt . executeUpdate ( i n s i r a S t r i n g 1 ) ; stmt . executeUpdate ( i n s i r a S t r i n g 2 ) ; stmt . executeUpdate ( i n s i r a S t r i n g 3 ) ; stmt . close ( ) ; 195 con . close ( ) ; } catch ( SQLException ex ) { System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; } 200 JOptionPane . showMessageDialog ( null , "Dados Inseridos na Tabela Pedidos" ) ; } public static void obtenhaEmpregados ( ) { Connection con = getConnection ( ) ; 205 String r e s u l t = null ; String selecioneString ; selecioneString = "select * from Empregados" ; r e s u l t ="Empregado_IDttNomen" ; 210 try { stmt = con . createStatement ( ) ; ResultSet rs = stmt . executeQuery ( selecioneString ) ; while ( rs . next ( ) ) { int id = rs . g e t I n t ( "Empregado_ID" ) ; 215 String nome = rs . getString ( "Nome" ) ; r e s u l t += id+"tt"+ nome+"n" ; } stmt . close ( ) ; con . close ( ) ; 220 } catch ( SQLException ex ) { System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; } JOptionPane . showMessageDialog ( null , r e s u l t ) ; 225 } public static void obtenhaPedidos ( ) { Connection con = getConnection ( ) ; String r e s u l t = null ; 230 String selecioneString ; 51
  • 53. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF selecioneString = "select * from Pedidos" ; r e s u l t ="Prod_IDttProdutoNomettEmpregado_IDn" ; try { 235 stmt = con . createStatement ( ) ; ResultSet rs = stmt . executeQuery ( selecioneString ) ; while ( rs . next ( ) ) { int pr_id = rs . g e t I n t ( "Prod_ID" ) ; String prodNome = rs . getString ( "ProdutoNome" ) ; 240 int id = rs . g e t I n t ( "Empregado_ID" ) ; r e s u l t +=pr_id+"tt"+ prodNome+"tt"+id+"n" ; } stmt . close ( ) ; con . close ( ) ; 245 } catch ( SQLException ex ) { System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; } JOptionPane . showMessageDialog ( null , r e s u l t ) ; 250 } public static void atualizaEmpregados ( ) { Connection con = getConnection ( ) ; 255 String atualizaString1 ; atualizaString1 = "update Empregados set nome = 'helmuthsaatkamp' where Empregado_ID = 6323" ; try { stmt = con . createStatement ( ) ; 260 stmt . executeUpdate ( atualizaString1 ) ; stmt . close ( ) ; con . close ( ) ; } catch ( SQLException ex ) { 265 System . err . p r i n t l n ( "SQLException: " + ex . getMessage ( ) ) ; } JOptionPane . showMessageDialog ( null , "Dados Atualizados dentro da Tabela Empregados" ) ; } } / / Fim da Classe 4.3 Usando comandos Prepared Comando Prepared são comandos SQL pré-compilados, estes comandos são úteis se o mesmo comando for executado repetidamente, por exemplo, em um loop. Tais comandos pou- pam tempo apenas se você pretende excutar o mesmo novamente. Para usá-los é preciso primeiramente criar um objeto PreparedStatement pela chamada do método Connection.prepareStatement(), que é um método especialmente útil em situações onde se pretende usar um loop ou while para selecionar parâmetros para uma sucessão de valores. Se você quiser executar um objeto de Statement várias vezes ao invés de objetos de PreparedS- tatement terá o tempo de execução reduzido na maioria das vezes. 52
  • 54. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF A sintaxe é simples, basta inserir interrogações para qualquer parâmetro que você irá substi- tuir antes de enviar o SQL à base de dados. Tal como acontece com CallableStatements, você terá que chamar o close() para ter certeza de que os recursos do banco de dados sejam liber- tados o mais depressa possível. Logo abaixo segue um programa JDBC que mostra o uso de comandos Prepared para inserir dados em uma tabela usando programação jdbc. Você precisa fornecer valores para serem usados no lugar do ponto de interrogação determi- nados (caso existam) antes que você possa executar um objeto PreparedStatement. Você pode fazer isto chamando um dos métodos setXXX definido na classe PreparedStatement. Existe um método setXXX para cada tipo primitivo declarado na linguagem de programação Java. Um exemplo de um objeto de PreparedStatement: PreparedStatement pstmt = con . prepareStatement ( "update Orders set pname = ? where Prod_Id = ?" ) ; pstmt . s e t I n t (2 , 100) ; pstmt . setString (1 , "Bob" ) ; 5 pstmt . executeUpdate ( ) ; Uma característica importante de um objeto PreparedStatement é que, ao contrário de um objeto de Statement, é dada uma instrução SQL quando é criado. Esta instrução SQL é enviada para o DBMS diretamente, onde é compilada. Com o resultado, o objeto PreparedStatement con- tém não apenas uma instrução SQL, mas uma instrução SQL que tem sido pré-compilada. Isto significa que, quando o PreparedStatement é executado, o DBMS pode simplesmente executar o comando SQL PreparedStatement sem ter de compilá-lo primeiro. Embora objetos PreparedStatement possam ser usados para instruções SQL sem parâme- tros, você provavelmente irá usá- los com mais freqüência para instruções SQL que têm parâme- tros. A vantagem de usar comandos SQL que têm parâmetros é que você pode usar a mesma declaração e fornecê- la com valores diferentes a cada vez que você executá - las. import javax . swing . JOptionPane ; import java . sql . * ; public class JDBCPreparedStatements { 5 static String userid="" , password = "" ; static String u r l = "jdbc:mysql://localhost:3306/dbexemplo" ; / / String u r l = " jdbc : mySubprotocol : myDataSource " ; static Statement stmt ; static PreparedStatement pstmt ; 10 static Connection con ; public static void main ( String args [ ] ) { JOptionPane . showMessageDialog ( null , "Programação JDBC mostrando Atualização de Dados em Tabelas e Prepared Statements" ) ; int escolha = −1; 15 do{ escolha = pegueEscolha ( ) ; i f ( escolha != 0) { pegueSelecionados ( escolha ) ; 20 } } while ( escolha != 0) ; 53