1
Bancos de Dados e
Java com JDBC
Cesar Rocha alunoscesar@gmail.comBancos de Dados e
Bancos de Dados e
Java com JDBC
Java com JDBC
Cesar Rocha Cesar Rocha alunoscesar@gmail.com alunoscesar@gmail.com2
Objetivos
§ Explorar importantes conceitos ligados à API JDBCJDBC
e seu uso para o acesso de bancos de dados
§ Criação e gerenciamento bancos de dados, principais
classes e métodos da API JDBC, sintaxe e comandos básicos SQL, drivers de conexão, bancos de dados atuais, boas práticas de programação e erros comuns
§ Exercícios e vários exemplos de códigos que você deve testar visando solidificar seus conhecimentos §
§ LembreLembre--se:se: este módulo é fundamental para a
conclusão e entrega do projeto deste estágio!
3
Motivação
§ Até aqui, boa parte dos projetos de disciplina Java envolviam alguma forma de persistência de dados:
§ Uso de estruturas de dados (coleções), organização de
informações em arquivos (streams I/O), etc.
§ Estas abordagens eram soluções simples e rápidas
para problemas relativamente fáceis…
§ … porém, garantimos escalabilidade e segurança?
§ Aplicações reais usam bancos de dados como meio
(quase sempre) principal de persistência
§ Modelos relacionais são comumente empregados
4
Modelo relacional
§ Um estilo muito popular de organizar os nossos dados em um banco de dados é o modo relacional
§ Um sistema gerenciador de banco de dados (SGBD)
relacional é o responsável por armazenar dados na forma de linhas e colunas (ou seja, em tabelas)
§ Os mais populares: MySQL, Postgrees, o Oracle,
Microsoft Access, o Microsoft SQL Server, Cloudscape...
§ Uma linguagem chamada Structured Query
Language (SQL) é quase universalmente utilizada
§ Diversas operações: criação, alteração, consultas...
§ Conceitos básicos serão essenciais aqui!
5
Tabelas
§ Em um modelo relacional, teremos as entidades
(tabelas) juntamente com os seus relacionamentos
§ Os registros (as linhas), campos (as colunas) e tipos de
dados associados definem a estrutura da tabela
§ Em geral, define-se um identificador único para cada
registro (isso evitará a duplicidade de registros)
... ... ... ... 2004 O’Reilly Redes I PJE-732 1998 Campus Java ZRT-446 Ano Editora Titulo ISBN • Campos da tabela
devem ter um tipo
•Note a presença de
uma chave-primária •
• Campos da tabela Campos da tabela devem ter um tipo
devem ter um tipo
•
•Note a presenNote a presençça de a de uma
uma chave-primária
• Cada registro irá
representar um livro •
• Cada registro irCada registro iráá representar um livro
representar um livro
Tabela
6
Linguagem SQL
§ Conforme foi dito, a linguagem Structured Query Language (SQL) é um padrão aceito no mercado para manipular tabelas adequadamente
§ Veja o código utilizado para criar a tabela livro: CREATE TABLE tblLivro (
isbn VARCHAR ( 15 ), titulo VARCHAR ( 30 ), editora VARCHAR ( 20 ), ano INT,
PRIMARY KEY ( isbn ) )
CREATE TABLE tblLivro ( isbn VARCHAR ( 15 ), titulo VARCHAR ( 30 ), editora VARCHAR ( 20 ), ano INT,
PRIMARY KEY ( isbn ) )
O tipo
O tipo varcharvarchar representa texto
representa texto
Tipo int representa
Tipo int representa
inteiros inteiros C ód ig o pa ra c ria r a ta be la li vr o
Note a sintaxe para
Note a sintaxe para
chave
chave--primariaprimaria
Tamanho
Tamanho
* Há casos de pequenas variações: programadores poderiam declarar a chave diretamente, ou usar tipo charem vez de varchar
7
Linguagem SQL
§ Para inserir dados na tabela livro:
INSERT INTO tblLivro VALUES
(‘ZRT-446’, ‘Java’, ‘Campus’, ‘1998’);
§ Para atualizar (alterar) dados na tabela livro:
UPDATE tblLivro SET titulo = ‘Java II’
WHERE ano < 2004
§ Para remover dados da tabela livro:
DELETE FROM tblLivro
WHERE isbn = ‘ZRT-446’ AND titulo = ‘Java II’
§ Para consultar dados da tabela livro:
SELECT * FROM tblLivro
8
Relacionamentos
§ Suponha, neste exemplo da biblioteca de livros, que se precisa armazenar cada uma das cópias dos livros
§ Um livro terá muitas cópias a serem emprestadas
§ Cada cópia deverá ter seu código (rastreamento)
§ § 11aa tentativatentativa:: 300 200 100 CodCopia 2004 O’Reilly Redes I PJE-732 1998 Campus Java ZRT-446 1998 Campus Java ZRT-446 Ano Editora Titulo ISBN Tabela
Tabela de de CCóópiaspias
Existe algum problema nesta abordagem?
Existe
9
Relacionamentos
300 200 100 CodCopia PJE-732 ZRT-446 ZRT-446 ISBN TabelaTabela de de CCópiasópias
... ... ... ... 2004 O’Reilly Redes I PJE-732 1998 Campus Java ZRT-446 Ano Editora Titulo ISBN Tabela
Tabela de de LivrosLivros
A chave prim
A chave primáária em tabela ria em tabela livros tornar
livros tornar--sese--ááchave estrangeira na tabela de cna tabela de cóópias!pias!
10
Relacionamentos
§ Enfim, a chave-primária da tabela livros (a parte “um”) irá para a tabela cópias (parte “muitos”).
§ Ela será, portanto, uma chave estrangeira
§ Veja o código utilizado para criar a tabela copias: CREATE TABLE tblCopias (
codCopia int,
isbn VARCHAR ( 15 ),
PRIMARY KEY ( codCopia ), FOREIGN KEY ( isbn )
REFERENCES tblLivro )
CREATE TABLE tblCopias ( codCopia int,
isbn VARCHAR ( 15 ),
PRIMARY KEY ( codCopia ),
FOREIGN KEY ( isbn )
REFERENCES tblLivro ) A chave estrangeira A chave estrangeira C ód ig o pa ra c ria r a ta be la c op ia s
De onde ela vem?
11
Java Database Conectivity
§ JDBC é o mecanismo básico de Java para acesso a bancos de dados via linguagem SQL
§ O JDBC é uma API baseada em Java para conexão com
qualquer bancos de dados compatível com SQL
§ Toda a API encontra-se no pacote java.sql
§ Porém, JDBC nos permite integrar aplicações Java com bancos de dados que tenham drivers JDBC
§ Todos os mais populares bancos de dados mencionados
no início do módulo possuem drivers gratuitos
§ O banco deve ter pelo menos um driver ODBC, se não
12
Principais classes e interfaces
§ Interfaces § Driver § Connection § Statement § ResultSet § DatabaseMetadata § ResultSetMetadata § PreparedStatement § CallableStatement § Classes § DriverManager § Date § Time
13
Drivers
§ Um driver JDBC pode ser visto como uma camada intermediária que traduz chamadas da API JDBC em chamadas à API particular do banco de dados
§ As classes nativas do banco de dados implementam as
interfaces vistas no slide anterior, formando o driver
§ A implementação destas interfaces são diferentes para
cada banco de dados e são fornecidas por cada fabricante específico do banco de dados
§ Por isso, toda a aplicação Java que precise acessar um banco de dados, deverá utilizar um driver
14
Tipos de drivers
§ Tipo 1: JDBC-ODBC bridge
§ Usam uma ponte para ter acesso a um banco de dados. Vem com o J2SE. O driver ODBC deve estar configurado no cliente.
§ Tipo 2: Código nativo
§ Usam uma API nativa. Este driver converte chamadas JDBC em chamadas a API do banco. Mais rápido que o anterior.
§ Tipo 3: Servidor Intermediário
§ Oferecem uma API de rede via middleware que traduz
requisições para API do driver desejado. O servidor intermediário é capaz de se conectar a vários bancos de dados
§ Tipo 4: solução 100% Java
§ Drivers que se comunicam diretamente com o banco de dados usando soquetes de rede. É uma solução puro Java. Não requer código adicional do lado do cliente.
15
16
Passos para acessar um banco com JDBC
§ Os seguintes passos resumem, de forma macro, o
que é necessário para configurar e utilizar JDBC:
Œ Baixar o driver JDBC compatível com o banco
• Importar as classes necessárias (pacote java.sql)
Ž Carregar e registrar o driver JDBC
• Identificar o banco de dados (uma string) (URL)
• Estabelecer uma conexão com o banco
‘ Criar um comando a ser processado
’ Executar o comando SQL
“ Extrair os dados
17
1. Baixar o driver JDBC
§ A primeira coisa a fazer é entrar na página do
fabricante do banco de dados e procurar pelo driver
§ Configure o driver na IDE de programação
§ Normalmente, o driver está num arquivo extensão .jar
§ Se, mesmo assim, você não o encontrar o arquivo,
visite a página da SUN que contém informações sobre os bancos que implementam a API JDBC
java.sun.com/products/jdbc
§ Se, ainda assim, você não encontrar nada, sugiro
uma última tentativa: site “busca-driver” da SUN
18
2. Importar as classes
§ Como já foi dito, todas as principais interfaces e classes da API JDBC se encontram em java.sql:
import java.sql.*
§ Nota: alguns recursos avançados se encontram na javax.sql
19
3. Carregar e registrar o driver JDBC
§ Todo driver possui uma classe que o representa
§ Podemos carregar um driver na aplicação utilizando o
comando: Class.forName(nomeDaClasse)
§ O comando acima irá carregar as classes do driver, e
este será gerenciado pelo DriverManager de JDBC
§ Uma vez registrado o driver o DriverManager poderá
utilizá-lo para obter uma conexão com o banco
import java.sql.*;
try {
Class.forName( "org.postgresql.Driver" );
} catch ( ClassNotFoundException e ) {
// codigo para tratamento de erro...
20
4. Identificar o banco de dados (URL)
§ Para determinar qual driver será usado usa-se uma URL no formato:
jdbc:<subprotocolo>:<dsn>
§ A aplicação usa o subprotocolo para identificar e
selecionar o driver a ser instanciado.
§ O dsn é o nome que o subprotocolo utilizará para
localizar um determinado servidor ou base de dados.
§ Sintaxe dependente do fabricante. Exemplos:
jdbc:odbc:anuncios
jdbc:oracle:thin:@200.206.192.216:1521:BDExemplo jdbc:postgresql://localhost:5432/BDTeste
21
5. Criar uma conexão com o banco
§ Para se conectar ao banco, você irá precisar de um objeto Connection
§ Representa uma conexão ao banco de dados. É
retornada pelo DriverManager num objeto.
...
String url = "jdbc:postgresql://localhost:5432/BDTeste";
String login = "postgres";
String senha = "postgres";
try {
Connection con =
DriverManager.getConnection( url, login, senha ); } catch ( SQLException e ) {
// codigo para tratamento de erro...
22
6. Criar um comando a ser processado
§ Uma vez que obtemos o objeto Connection, chama-se sobre ele o método createStatement() para
obter um objeto do tipo Statement
§ Este objeto é que poderá enviar/executar comandos
SQL sobre o banco de dados
try {
Statement st = con.createStatement();
} catch ( SQLException e ) {
// codigo para tratamento de erro...
23
7. Executar o comando SQL
§ Uma vez que temos um Statement em mãos (o comando) podemos executar operações no banco
§ O método executeQuery(comando_sql), da
interface Statement, retorna um objeto ResultSet.
§ Os métodos de navegação de ResultSet:
next(), previous(), first() e last()
§ Métodos para obtenção de dados de ResultSet:
getInt(), getString(), getDate() ... try {
ResultSet rs =
st.executeQuery( “SELECT * FROM TBLIVROS” ); } catch ( SQLException e ) { // codigo erro...}
24
8. Extrair os dados
§ Com um ResultSet em mãos (o resultado da
consulta no banco) podemos extrair dados desta (sub)tabela de maneira direta:
... try {
ResultSet rs =
st.executeQuery( “SELECT isbn, ano FROM TBLIVROS” );
while ( rs.next() ) {
String isbn = rs.getString(“isbn");
int ano = rs.getInt(“ano");
// faça algo com os dados...
}
} catch ( SQLException e ) {
// codigo para tratamento de erro...
25
26
9. Fechando a conexão
§ Este passo é simples, porém importante:
§ deve-se fechar as conexões abertas com o banco no
final das operações
try {
rs.close();
st.close(); con.close();
27
Para um bom aproveitamento:
Para um bom aproveitamento:
§ Codifique os exemplos mostrados nestes slides e verifique pontos de dúvidas
§ Resolva todas as questões da lista de JDBClista de JDBC § Procure o professor ou monitor da disciplina e
questione conceitos, listas, etc.
§ Não deixe para codificar tudo e acumular assunto
para a avaliação.