Anda di halaman 1dari 30

JDBC

Java Database Connectivity


Introdução
• JDBC é uma API (Application Program Interface)
para acesso a SGDB (Sistemas Gerenciadores de
Banco de Dados) relacionais por meio de comandos
SQL (Structured Query Language).
• Quando o SGBD não dispõe de um driver JDBC
mas somente o ODBC, será necessário uma ponte
para o acesso ao banco. A figura a seguir ilustra o
que acontece.
JDBC e o caminho da comunicação com o
Banco de Dados
Aplicativo Java
API JDBC
Gerenciador de Driver JDBC

API do driver JDBC


Driver JDBC
Ponte
suprido pelo
JDBC/ODBC
fornecedor

Driver
ODBC Banco de dados

Banco de dados
Vantagens
• A API para programação do sistema é a
mesma para qualquer SGBD, não há
necessidade de se desenvolver aplicações
voltadas para um SGBD específico.
• Permite a construção de páginas WWW que
acessam BD
• Mantém a independência de plataforma da
linguagem Java.
Comparação com Microsoft ODBC
• ODBC tem o mesmo propósito e existe para
várias plataformas, por que não usar ODBC?
➪ Os drivers ODBC são escritos em C, o que limita a
portabilidade e auto-instalação dos programas Java.
➪ O ODBC tem que ser instalado e configurado na
máquina do cliente.
➪ Imagine instalar e configurar o ODBC em 40.000.000
computadores da Internet!
• Entretanto, banco de dados que utilizam
ODBC podem ser utilizados em aplicações
Java via a ponte JDBC-ODBC.
Carga do driver no programa Java
• Vários drivers podem ser carregados com o método
Class.forName, este método força o carregamento
do driver. Por exemplo:
Class.forName (“oracle.jdbc.driver.OracleDriver”);
Class.forName (“sun.jdbc.odbc.JdbcOdbcDriver”);

• Caso não seja encontrada a classe é lançada uma


exceção ClassNotFoundException
• A JVM deve poder encontrar estas classes
➪ Para aplicações, a variável de ambiente CLASSPATH
deve incluir os drivers.
➪ Para applets, o parâmetro archive deve apontar para o
driver.
Conexão com o BD
• A abertura da conexão é feita pelo método getConnection
da classe DriverManager.
➪ O DriverManager tenta conectar com o primeiro driver carregado, se
não consegue, tenta o driver seguinte.
➪ Caso não seja localizado, é lançada uma exceção SQLException.
• getConnection(String url, Properties info)
– url: a url do banco de dados;
– info : propriedade do sistema como: usuário e senha.
• getConnection(String url, String user, String password)
– url: a url do banco de dados;
– user: o usuário que está conectando ao banco de dados;
– password: a senha do usuário.
• getConnection(String url)
– url: a url do banco de daoos
Exemplo: Conexão com o BD
import java.sql.*;
. . .
java.util.Properties props = new Properties();
props.put("user", objAccessManager.getConta());
props.put("password", objAccessManager.getSenha());
String url = "jdbc:caribou:jsqlingres//"+ "fava" +":6024/" + bancoPar;
try
{
// carrega o driver jdbc - cariboulake
Class.forName("COM.cariboulake.sql.ingres.JSQLDriver");

// abre conexao com o banco de dados


Connection con = DriverManager.getConnection(url, props);

// especifica o autocommit para off (ingress aceita isto)


con.setAutoCommit( false );
}
Exemplo: Conexão com o BD
- cont.
catch(SQLException e)
{
System.out.println("Falha na conexão com o banco de dados:" );
System.out.println(e.getMessage();
}
catch(ClassNotFoundException e)
{
System.out.println("Classe do Driver JDBC não encontrada");
}
Envio de comandos SQL
• O envio de um comando SQL é feito por meio de
um Statement
➪ Statement
• É utilizado para enviar comandos SQL simples
➪ PreparedStatement
• O comando SQL é pré-compilado e utilizado
posteriormente, sendo mais eficiente nos casos onde o
mesmo comando é utilizado várias vezes.
➪ CallableStatement
• Utilizado para chamar procedimentos SQL
armazenados no BD.
A classe Statement
• Um objeto desta classe é criado pelo envio da
mensagem FUHDWH6WDWHPHQW a conexão com o BD
Statement stmt = con.createStatement ( );

• Execução de comandos SQL


➪ Método H[HFXWH4XHU\: usado para comandos SQL que
retornam uma tabela (ResultSet).
ResultSet rs = stmt.executeQuery (“select * from EMP”);

➪ Método H[HFXWH8SGDWH: usado para executar comandos


SQL que retornam int.
Obtenção do resultado
• A classe 5HVXOW6HW oferece à aplicação a tabela
resultante de um Select e
➪ Mantém um cursor posicionando em uma linha da tabela.
Inicialmente este cursor está antes da primeira linha e a mensagem
QH[W  movimenta o cursor para frente.
➪ Permite à aplicação pegar os dados das colunas da linha corrente
através de mensagem getXXX(<coluna>).
• XXX é o tipo da coluna
• <coluna> é o nome da coluna ou sua posição (a partir de 1)
ResultSet rs = stmt.executeQuery (“select a, b, c from table1”);
while (rs.next ( ) )
{
int x = rs.getInt (“a”);
String s = rs.getString(2);
float f = rs.getFloat (“c”);
}
Criação e inserção numa tabela
• Exemplo de criação e inserção em uma tabela
utilizando a mensagem H[HFXWH8SGDWH ao
Statement
Statement st = conn.createStatement ( );

st.executeUpdate ( “ create table Alunos (


nome varchar (32),
idade integer); ” );

st.executeUpdate (“ insert into Alunos values (‘Jonas’, 18); ” );


conn.close ( );
Transações
• Uma transação é um conjunto de comandos
(Statements) que são validados no BD com
FRPPLW ou cancelados com UROOEDFN.
➪ Por default, todos os comandos no JDBC são auto-
commit.
conn.setAutoCommit (false); // muda o default
Statement s = conn.createStatement ( );
s.executeUpdate(“ ... ” );
s.executeUpdate (“ ... ” );
if ( ... ) // se determinada condição está ok
conn.commit ( ); // valida os 2 updates
else
conn.rollback ( ); // senão, desfaz os updates
Tipos de drivers JDBC
• Ponte com ODBC
• Acesso ao driver nativo
− A API JDBC chama procedimentos do driver nativo do
SGBD instalado na máquina local.
• Driver com protocolo proprietário escrito em Java
− A comunicação entre o cliente e o SGBD dá-se no
protocolo do SGBD, contudo, como o driver é escrito em
Java, dispensa a instalação/configuração do driver no
cliente.
• Driver independente de SGBD
• Os dois primeiros tipos são recomendados para
Intranets, pois exigem configuração da máquina
cliente, os outros dois podem ser utilizados na
Internet.
Conexão com o BD
• A abertura da conexão é feita pelo método
getConnection da classe DriverManager.
Ö O DriverManager tenta conectar com o primeiro driver
carregado, se não consegue, tenta o driver seguinte.
Ö Caso não seja localizado, é lançada uma exceção
SQLException.
• getConnection(String url, Properties info)
• getConnection(String url, String user, String password)
• getConnection(String url)
A Classe Connection
• public abstract void setAutoCommit(boolean autoCommit) throws
SQLException
• public abstract void commit() throws SQLException
• public abstract void close() throws SQLException
• public abstract DatabaseMetaData getMetaData() throws
SQLException
• public abstract Statement createStatement() throws SQLException
• public abstract PreparedStatement prepareStatement(String sql)
throws SQLException
– sql: comando SQL que pode conter um ou mais '
?'parâmetros.
Consultas preparedStatement
• Comandos SQL com ou sem parâmetros podem
ser pré-processados e armazenados em um objeto
do tipo PreparedStatement.
• É possível preparar uma consulta com uma
variável para ser usadas muitas vezes, apenas
inserindo uma string diferente para a variável a
cada vez. Por exemplo:
String consultaLivros = “ select prec_livro, titulo_livro from livro, editora
where livro.id_editora = editora.id_editora and
editora.nome = ?” ;
PreparedStatement stmConsultaLivros = conn.preparedStatement
(consultaLivros);
• Utilizar o método set para fazer a ligação com a
variável.
stmConsultaLivros.setString(1, editora); // 1 denota a posição da variável e
editora o valor que será atribuído a variável
PreparedStatement
• public abstract ResultSet executeQuery() throws SQLException

• public abstract int executeUpdate() throws SQLException

• public abstract void setXXX(int indice, XXX x) throws


SQLException
– indice: começando com 1

• public abstract void setNull(int indice, int sqlType) throws


SQLException

• public abstract void clearParameters() throws SQLException


Dados SQL x JAVA
SQL Java

integer ou int int


smallint short
numeric (m,n)
decimal (m,n) java.sql.Numeric
float(n) double
real float
double double
character(n) ou char(n) string
varchar(n) string
date java.sql.Date
time java.sql.Time
timestamp java.sql.Timestamp
Exercício 1: criar as tabelas para
empregado e dependente no BD
Empregado Dependente
IR matricula
matricula
nome nome
rua
cep
cidade
pais
estado
curriculum

Obs: criar os campos das tabelas acima como string.


DatabaseMetaData
• public abstract ResultSet getColumns(String catalog,
String schemaPattern,
String tableNamePattern,
String columnNamePattern)
throws SQLException
• Exemplo:
public void setDBMetaDados(String tabela)
{
DatabaseMetaData dbMetaDados;
ResultSet rs = null;
try
{
dbMetaDados = con.getMetaData();
rs = dbMetaDados.getColumns("","",tabela,"");
}
}
DatabaseMetaData
• O ResultSet tem as seguintes colunas:
1.TABLE_CAT String => table catalog (pode ser nulo)
2.TABLE_SCHEM String => table schema (pode ser nulo)
3.TABLE_NAME String => nome da tabela
4.COLUMN_NAME String => nome da coluna
5.DATA_TYPE short => tipo de acordo com java.sql.Types
6.TYPE_NAME String => tipo no sgbd
7.COLUMN_SIZE int
8.BUFFER_LENGTH (não usada)
9.DECIMAL_DIGITS int
. . .
17.ORDINAL_POSITION int => índice da coluna na tabela
(começa com 1)
18.IS_NULLABLE String => NO, YES ou NULL (indeterminado).
DatabaseMetaData
public void setMetaDadosResultSet(String tabela)
{
Vector vetorNomesColunas = new Vector();
Vector vetorTiposColunas = new Vector();
DatabaseMetaData dbMetaDados;
ResultSet rs = null;
try
{
dbMetaDados = conexaoEstabelecida.getMetaData();
rs = dbMetaDados.getColumns("","", tabela,"");
while (resultSetColunasTabela.next())
{
vetorNomesColunas.addElement (rs.getString(4));
vetorTiposColunas.addElement(rs.getString(6));
}
}
catch (SQLException e) {. . .}
}
ResultSetMetaData
• Obtido pelo método getMetaData, da classe ResultSet
• public abstract int getColumnCount() throws SQLException
• public abstract int isNullable(int column) throws
SQLException
• public abstract String getColumnName(int column) throws
SQLException
• public abstract String getTableName(int column) throws
SQLException
• public abstract int getColumnType(int column)
throws SQLException
– tipo de acordo com java.sql.Types
• public abstract String getColumnTypeName(int column)
throws SQLException
– tipo no SGBD
Exercício 1
• Objetivo:
– Fixar os conceitos iniciais sobre JDBC usando
a ponte JDBC_ODBC

• Crie uma base de dados base_UCB.mdb no


access e salve no seu diretório de trabalho.
• Crie no Painel de Controle / Fontes de
Dados ODBC 32 bits um DSN com o nome
teste_UCB associada ao arquivo acima.
Exercício 1 - Continuação
• Criar uma classe TesteJDBC_ODBC
– Esta classe pode receber um dos seis
parâmetros possíveis
• Create (Cria tabelas)
• Drop (Apaga tabelas)
• Insert (Inclui dados )
• Update (Altera dados)
• Delete (Apaga dados)
• Select (Seleciona dados e mostra na saída
padrão)
Exercício 1- Continuação
• Dica: Crie um método Conecta( ) para obter uma
conexão com a base de dados
String url= "jdbc:odbc:teste_UCB";
Connection con;
try
{
System.out.println("Iniciando a conexão com o BD...");

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection(url,"","");

System.out.println("Banco de Dados Ok e Pronto...");


return con;
}
Exercício 1- Continuação
• Não esqueça das Exceções !!!
catch(ClassNotFoundException cnf)
{
System.out.println("Houve uma ClassNotFoundException: "+cnf);
return null;
}
catch(SQLException sql)
{
System.out.println("Houve uma SQLException: "+sql);
return null;
}
Novas Funcionalidades da
JDBC 2.0
• Requisitos
– JDK 1.2 ou superior
– Driver JDBC 2.0
– Suporte pelo SGBD
• Funcionalidades
– Mover cursores em Scrollable Result Sets
– Fazer Atualizações em Updatable Result Sets
– Suporte aos tipos de dados SQL3

Anda mungkin juga menyukai