1. Sumário
1. JDBC .........................................................................................................................2
1.1. Pré requisitos .....................................................................................................2
1.1.1. JDBC .........................................................................................................2
1.1.2. Base de Dados ...........................................................................................2
1.1.3. Driver ........................................................................................................2
1.2. Estabelecer uma ligação ....................................................................................2
1.2.1. Carregar o Driver ......................................................................................3
1.2.2. Criar uma conexão.....................................................................................3
1.3. Criar JDBC Statements......................................................................................4
1.3.1. executeUpdate ...........................................................................................5
1.3.2. executeQuery.............................................................................................5
1.4. Obter Resultados de objectos ResultSet ............................................................5
1.4.1. Método next() ............................................................................................6
1.4.2. Método getXXX ........................................................................................6
1.5. Excepções ..........................................................................................................7
1.6. Limpar recursos .................................................................................................7
1.7. Um exemplo inteiro...........................................................................................7
1.8. Exercícios ..........................................................................................................9
Página 1 de 10
2. 1. JDBC
JDBC – Java Database Connectivity é um API (Application Programming Interface)
para o Java que permite comunicação com base de dados. A interface de JDBC foi
desenhada de modo ser independente da base de dados; assim cada base de dados
precisa de um “Driver” (provido pelo vendedor de base de dados)
1.1. Pré requisitos
1.1.1. JDBC
O JDBC vem com o JDK então já deverá estar instalado. Para usar o JDBC 1.0 só
precisará do JDK 1.1, para a versão JDBC 2.0 precisará do JDK 1.2.
1.1.2. Base de Dados
Será necessário ter uma base de dados. Aqui usaremos MS Access que já está instalado
nas máquinas. Assim será necessário criar uma base de dados em Access com o nome
training e com uma tabela chamada people com os campos id, name e age.
1.1.3. Driver
Dado que o JDBC é independente da base de dados, por cada tipo de base de dados é
necessário um “Driver” para conectar. O Driver é um ajudante e tradutor. O vendedor
da base de dados providencia Driver, mas também pode-se encontrar Drivers na
Internet.
O Driver que precisamos para o MS Access é o JDBC-ODBC Driver. Este Driver é
fornecido pelo JDK.
1.2. Estabelecer uma ligação
Para se fazer uma conexão com a base de dados são necessários os seguintes passos:
Página 2 de 10
3. 1.2.1. Carregar o Driver
Só precisamos de uma linha de código como a seguinte:
Class.forName("nomeDaClasse");
Usaremos o JDBC-ODBC Bridge Driver. O nome da classe é
sun.jdbc.odbc.JdbcOdbcDriver. Carrega-se assim:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Esta criará uma instância do Driver e registá-la como DriverManager. Depois, quando
o JDBC pedir uma ligação para uma BD, o DriverManager irá buscar entre estes
Drivers registados, e usará este Driver se for compatível.
1.2.2. Criar uma conexão
O segundo passo é criar uma conexão à base de dados. Para isso precisamos:
1) O URL – Uniform Reource Locater
2) O username
3) O password
O URL tem 3 partes. É criado por
Jdbc:subProtocol:nomeDeDataSource
1) O protocolo jdbc.
2) O sub protocolo depende do tipo de Driver. Em nosso caso do JDBC-ODBC
Bridge Driver será “odbc”
3) O nome do data source (ou databse system) é configurado de uma maneira
diferente dependendo da base de dados.
Neste caso, estamos a usar uma base de dados MS Access. Temos que registar o Data
Source da seguinte maneira:
1) Abrir o Control Panel (“Start” ”Settings” ”Control Panel”).
2) Selecionar “Administrative Tools” ”Data Sources (ODBC)”)
3) Selecionar o tab “System DNS”
Página 3 de 10
4. 4) Clique Add
5) Selecionar “Driver do Microsoft Access (*.mdb)” e clique “Finish”
6) Inserir o Data Source Name “training”.
7) Selecionar “Select” e encontar o ficheiro c:caminhotraining.mdb
8) Clique “Advanced”
9) Inserir Login name: admin
10) Inserir Password: password
11) Selecionar OK
12) Selecionar OK duas vezes para sair.
Agora, o URL para o nosso caso seria “jdbc:odbc:training”. Agora passamos estes
detalhes (URL,username,password) como parâmetros ao método getConnection da
classe DriverManager.
Ex:
String DB_URL ="jdbc:odbc:training";
Connection conn= DriverManager.getConnection(url,username,password);
A classe DriverManager controla todos detalhes para criar uma conexão à base de
dados. O método getConection é o único do DriverManager que normalmente é
necessário saber.
A conexão devolvida pelo método DriverManager.getConnection é uma conexão
aberta que podemos usar para criar objectos de JDBC Statements, que são usados para
passar os Statements do SQL à base de dados.
1.3. Criar JDBC Statements
O objecto do Statement é o que manda os Statements do SQL à base de dados. Só é
necessário criar um objecto do Statement e depois executar o método apropriado. Os
métodos são os seguintes:
• executeQuery – para um Statement do SELECT
• executeUpdate – para um Statement para criar ou modificar uma tabela
Página 4 de 10
5. É necessário uma instância de uma conexão aberta para criar o objecto do Statement.
No exemplo seguinte, é usado o objecto da Connection conn (criada acima).
Statement stmt=conn.createStatement();
Assim sendo, stmt existe, mas não tem um Statement do SQL para passar à base de
dados. É imperioso que forneça o método que se pretende usar.
Ex:
stmt.executeUpdate("UPDATE …”);
stmt.executeQuery("SELECT …”);
1.3.1. executeUpdate
O método executeUpdate é usado para criar ou modificar uma tabela. Quando usado
com SQL Statements como INSERT, UPDATE ou DELETE, devolve um int de row
count (nº de linhas criadas/alteradas). Quando usado com SQL Statements de DDL
(Data Definiton Language), ex CREATE, MODIFY, devolve só 0.
Ex:
stmt.executeUpdate(“UPDATE people SET age=21 WHERE name LIKE
‘zacaza’”)
1.3.2. executeQuery
O método executeQuery é usado para seleccionar dados de uma tabela. Devolve um
objecto ResultSet. Este é um objecto que representa os dados encontrados pelo
SELECT.
1.4. Obter Resultados de objectos ResultSet
O ResultSet tem os dados organizados em filas, como quando se executa um select
no cliente da base de dados. O objecto ResultSet tem um cursor que aponta à linha
actual de dados.
Página 5 de 10
6. Ex:
ResultSet rs=stmt.executeQuery("SELECT id, name, age FROM people");
1.4.1. Método next()
Inicialmente o cursor é colocado antes da primeira fila. O método next move o cursor
até a próxima linha. A linha actual do cursor é a linha em que pode actuar.
NB: Quando o ResultSet só tem uma linha, tem que se chamar next primeiro para
acessá-lo. E porque o método next devolve false quando não há mais filas no objecto
ResultSet, poderá ser usado num ciclo while para iterar através do ResultSet.
Ex:
while (rs.next()){
//actuar em linha acutal
}
1.4.2. Método getXXX
Para ler dados da linha actual, o ResultSet tem vários métodos em forma de getXXX.
Usa-se o método apropriado para o tipo de valor que queremos obter.
Alguns exemplos:
Tipo de Valor em BD Nome do Método Tipo de valo em JAVA
Varchar getString() java.lang.String
Numeric getInt() Int
Date getDate() java.sql.Date
Estes métodos aceitam como parâmetros o nome da coluna (String) ou índice da
coluna(int).
Ex:
String name=rs.getString(“name”);
int age=rs.getInt(2);
Página 6 de 10
7. 1.5. Excepções
O método Class.forName lança um ClassNotFoundException
Os métodos de JDBC lançam SQLExceptions.
O tratamento de exepções é feito pelos blocos try e catch e tratá-los apropradamente.
E útil imprimir os erros, assim saber-se-á porque o código não terá eventualmente
funcionado.
1.6. Limpar recursos
Quando se abre uma conexão à base de dados, cria-se uma conexão aberta na base de
dados. É da responsabilidade do programador fechar esta conexão quando se chega ao
término. Também é necessário fechar o ResultSet e Statement.
rs.close();
stmt.close();
conn.close();
É aconselhável fechar os recursos dentro do bloco finally porque também quando o
código inteiro lançar excepções, é necessário limpar recursos. Note que estes métodos
para fechar também podem lançar excepções.
1.7. Um exemplo inteiro
/*
* Created on 5/Abr/2007
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package jdbc;
/**
* @author mazibe
*
Página 7 de 10
8. * TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
import java.sql.*;
public class JDBCExample {
public static final String USERNAME ="admin";
public static final String PASSWORD ="password";
public static final String DB_URL ="jdbc:odbc:training";
public static void main(String args[]) throws
ClassNotFoundException {
//Carregar o JDBC-ODBC Driver
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try{
//Obter uma connexão do Driver Manager
conn=
DriverManager.getConnection(DB_URL,USERNAME,PASSWORD);
//Criar um Statement object para que possamos
submeter SQL Statements ao Driver
stmt=conn.createStatement();
//Submeter a query, criando um objecto ResultSet
rs=stmt.executeQuery("SELECT name, age FROM people");
//Mostrar o conteúdo do ResultSet
while (rs.next()){
int id = rs.getInt("id");
String name=rs.getString("name");
int age = rs.getInt("age");
System.out.println("id: "+id+", name: "+name+",
age: "+age);
}
} catch (SQLException e){
System.out.println("SQLException in connectiong to a
database or making query:n"+e);
} finally {
try {
//Fechar o ResultSet
Página 8 de 10
9. if (rs !=null)
rs.close();
//Fechar o Statement
if (stmt !=null)
stmt.close();
//Fechar a conexão
if (conn !=null)
conn.close();
}catch(SQLException e) {
System.out.println("could not close
resources");
}
}
}
}
1.8. Exercícios
1) Copie o exemplo acima e verifique se corre.
2) Escreva o pseudocódigo usando as frases seguintes, para conectar e correr uma
query à base de dados
o Obter conexão à base de dados
o Carregar o Driver
o Fechar recursos
o Executar statement
o Instanciar o Driver
o Criar statement
o Ler ResultSet
3)
a) Crie uma nova classe com o método main.
b) Crie uma conexão à base de dados training e obtenha o objecto
Statement.
c) Qual o método que será usado para fazer um insert?
d) Crie uma nova entrada na tabela people com o seu nome, cidade e
idade.
Página 9 de 10
10. e) Abra a base de dados em MS Access e veja se funcionou.
4)
f) Edite a classe criada no exercício nº 3) para ler os parâmetros do método
main.
g) Corra o main algumas vezes, variando os parâmetros, e verifique na base
de dados.
5) Agora queremos fazer uma query à base de dados para ler a idade, por exemplo,
e por cada linha faça um update, por exemplo para aumentar a idade em uma
unidade. Edite o pseudocódigo escrito na pergunta 2).
6)
a) Crie uma nova classe com o método main e crie uma conexão à base de
dados training
b) Desta vez crie 2 objectos do Statement.
c) Com o primeiro seleccione a chave e a idade da tabela people.
d) Usando o segundo objecto do Statement, para cada linha do resultado,
faça um update para aumentar a idade em uma unidade.
e) Verifique se os dados da base de dados alteraram.
Página 10 de 10