José Maria Monteiro
Universidade Federal do Ceará - UFC
Universidade Federal do Ceará - UFC
Departamento de Computação
Departamento de Computação
monteiro@lia.ufc.br
monteiro@lia.ufc.br
“O futuro tem muitos nomes. Para os
fracos é o inatingível. Para os temerosos,
o desconhecido. Para os valentes é a
oportunidade:”
Victor Hugo.
Unidades X: Acesso a
Bancos de Dados
(JDBC)
Conjunto de classes e interfaces (API)
escritas em Java que faz o envio de cláusulas sql para qualquer banco de dados relacional;
Api de baixo nível e base para api’s de
alto nível;
Amplia o que você pode fazer com Java; Possibilita o uso de BD’s já instalados;
Java : não é mais necessário escrever um
programa para cada plataforma;
Jdbc : não é mais necessário escrever um
programa para cada tipo de banco de dados;
Escreva uma vez e execute em qualquer lugar;
Tempo de desenvolvimento reduzido;
Instalação e manutenção simplificadas;
Dissiminação da informação de maneira fácil e
econômica;
Fácil mapeamento objeto para relacional. Independência de banco de dados.
Computação distribuída.
Java e JDBC proporcionam aos programadores de
bancos de dados as seguintes características :
1 – Estabelece conexão com o banco de dados. 2 – Executa consultas.
3 – Recebe o conjunto de resultados das consultas.
4 – Executa stored procedures.
5 – Obtém informações sobre o banco de dados, tabelas, índices, visões, e stored procedures. 6 – Executa transações.
De maneira simplificada JDBC faz seis
coisas :
JDBC X ODBC
ODBC:
– Atualmente o ODBC (Open Database
Conectivity) da Microsoft é a interface mais usada para acessar bancos de dados relacionais;
– Possibilita conectar quase todos os
bancos de dados em quase todas as plataformas ;
Por que não usar odbc a partir de
JDBC X
ODBC
ODBC usa uma interface em C;
Chamadas de Java para códigos
em C trazem desvantagens em:
segurança, robustez e
portabilidade;
O ODBC deve ser instalado em
todas as máquinas clientes;
– Exceções:
ARQUITETURAS
JDBC
Modelo em duas camadas;
1 - MODELO EM DUAS CAMADAS
Máquina Cliente Java e
JDBC
Servidor de BD
Disco Local e Outras
Fontes
Acesso ao Banco
LAN ou Intranet
ARQUITETURAS
JDBC
Observações
– No modelo em Duas Camadas, um applet ou
uma aplicação Java conversa diretamente com o SGBD. Neste modelo, cláusulas SQL são enviadas do usuário para o banco, e os resultados são devolvidos para o usuário. O banco pode ser local ou remoto, neste último caso o usuário é conectado à base via rede, que pode ser uma Intranet ou Internet.
– Vantagens:
• Performance e Gerenciamento da Aplicação. – 1.3-Desvantagens:
2 - MODELO EM TRÊS CAMADAS
BD 1
BD 2 RPC ou
CORBA
Lógica de Negócios
Distribuição Adicional das
Lógicas de Negócios Application GUI
code
ARQUITETURAS
JDBC
Observações
– No modelo em Três Camadas os comandos são
enviados do usuário para uma camada intermediária de serviços, a qual então manda cláusulas SQL para o banco. O banco processa as cláusulas SQL e manda os resultados para a camada intermediária, a qual então manda os resultados para o usuário.
– Vantagens
• Utilização em bancos de dados sem servidor (Dbase, Paradox, Access etc);
• Possibilidade de uma camada de segurança;
• Aplicação “leve” (Thin). – Desvantagens
Ponte JDBC-ODBC
TIPOS DE DRIVERS JDBC
Acesso Nativo
Acesso por
Middleware
1 – Ponte JDBC-ODBC
Convertem chamadas JDBC em chamadas ODBC e as envia ao driver ODBC;
Possibilitam o uso indireto de drivers ODBC;
Necessidade de configurar o ODBC;
Mais apropriado para uma rede corporativa ou para aplicações usando arquitetura em três camadas;
– Ex: sun jdbc-odbc bridge.
2 – Acesso Nativo
Convertem chamadas JDBC em chamadas
nativas do banco e comunicam-se
diretamente com o SGBD;
Apresentam ganhos de performance; Mais apropriado para uma rede
corporativa;
– Ex: IBM DB2, BEA WebLogic(SQL Server, Oracle e Sybase), InfoZoom(SQL Server e Access), etc.
3 - Acesso por Middleware
Convertem chamadas JDBC em um
protocolo de rede independente do SGBD e comunicam-se com um gateway que traduz estas requisições para o protocolo
específico do SGBD;
Possibilitam o uso de diferentes SGBD’s; Esta é a mais flexível alternativa de JDBC; Suportam o acesso pela internet;
Precisam de cuidados adicionais com a segurança;
–Ex: DataDirect (SQL Server), CONNX (DB2, SQL Server, Access, Oracle, Sysbase, Informix), etc.
4 – Acesso Direto ao
Servidor
Convertem chamadas JDBC para um
protocolo de rede usado diretamente pelo SGBD;
Suportam o acesso pela Internet; São geralmente específicos para determinada base de dados;
– Ex: Atinav (SQL Server), BEA WebLogic(SQL Server e Informix), DataDirect(Oracle e SQL Server), etc.
BD BD BD BD
JDBC Driver Manager
API JDBC
Aplicação Aplicação Aplicação
Protocolo JDBC Driver Tipo 2 Driver Tipo 1 Driver
Tipo 3 Tipo 4Driver
DIRETOS ODBC-BRIDGE
CLASSES DE DRIVERS
JDBC
A classe DriverManager é uma
camada de gerenciamento do JDBC;
Responsável pela interface entre os
usuários e os drivers;
Interface Descrição
Connection Representa a conexão com o banco especificado. Dentro do contexo da conexão, cláusulas SQL são executadas e os resultados são
devolvidos.
DatabaseMetaData Usado para obter informações sobre as bases, tabelas, índices, tipos de campos, etc.
Statement Usado para executar cláusulas SQL estáticas e obter os resultados produzidos por elas.
PreparedStatement Usado para executar cláusulas SQL que se repetem várias vezes de maneira eficiente e executar consultas parametrizadas. Instâncias de PreparedStatement contêm cláusulas SQL já compiladas.
CallableStatement Usado para executar SQL stored procedures.
ResultSet Usado para acessar os dados retornados pelas cláusulas SQL executadas.
ResultSetMetaData Usado para obter informações sobre o conjunto dos resultados de uma cláusula SQL.
JDBC provê um modelo de controle de transações;
Cada nova conexão é iniciada no modo
autocommit;
JDBC implicitamente emite um commit após cada Statement executado;
Podemos desabilitar o autocommit; Após um commit ou um rollback,
automaticamente é iniciada uma nova transação;
Ex: con.setAutoCommit(false);
...
con.commit();
Permite usar as particularidades do
SGBD;
Diminui a portabilidade através dos
SGBD’s;
Portabilidade - SQL 92;
getConnection Client DriverManager 1 Connection createStatement 2 Statement ResultSet executQuery 3 next 4 get 5 close 7 close 8 6 repeat
SQL type Java type
CHAR String
VARCHAR String
LONGVARCHAR String
NUMERIC java.lang.Bignum
DECIMAL java.lang.Bignum
BIT boolean
TINYINT byte
SMALLINT short
INTEGER int
SQL type Java type
BIGINT long
REAL float
FLOAT double DOUBLE double BINARY byte[] VARBINARY byte[] LONGVARBINARY byte[]
DATE java.sql.Date
TIME java.sql.Time
TIMESTAMP java.sql.Timestamp
Java type SQL type
String VARCHAR OU LONGVARCHAR java.lang.Bignum NUMERIC
boolean BIT
byte TINYINT
short SMALLINT
int INTEGER
long BIGINT
float REAL
double DOUBLE
byte[] VARBINARY OU LONGVARBINARY java.sql.Date DATE
ACESSANDO BD’S
PROCEDIMENTOS NECESSÁRIOS PARA
ACESSAR BD’S UTILIZANDO JAVA
NESTE EXEMPLO UTILIZAREMOS O DRIVER JDBC-ODBC BRIDGE DA SUN
PROCEDIMENTOS NECESSÁRIOS
PARA ACESSAR BD’S UTILIZANDO
JAVA
PASSO 1: IMPORTAÇÃO DOS PACOTES NECESSÁRIOS
PASSO 2: REGISTRO DO(S) DRIVER(S)
PASSO 3: ABERTURA DA CONEXÃO
PASSO 4: EXECUÇÃO DE CONSULTAS E RECUPERAÇÃO DOS RESULTADOS
PROCEDIMENTOS NECESSÁRIOS
PARA ACESSAR BD’S UTILIZANDO
JAVA
PASSO 1: IMPORTAÇÃO DOS PACOTES NECESSÁRIOS
PASSO 2: REGISTRO DO(S) DRIVER(S)
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver");
PROCEDIMENTOS NECESSÁRIOS
PASSO 3: ABERTURA DA CONEXÃO
String url = "jdbc:odbc:my-dsn"; Connection con =
DriverManager.getConnection(url,"usuario","senha");
PROCEDIMENTOS NECESSÁRIOS
PASSO 4: EXECUÇÃO DE CONSULTAS E RECUPERAÇÃO DOS RESULTADOS
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("Select a, b, c, d from Table1");
while (rs.next()){
int a = rs.getInt(1);// int a = rs.getInt(“a”);//
BigDecimal b = rs.getBigDecimal(2,0); char c[] = rs.getString(3).toCharArray(); boolean d = rs.getBoolean(4);
}
OBS: O cursor de um ResultSet é inicialmente posicionado antes da primeira linha da tabela.
PASSO 5: FECHAMENTO DA CONEXÃO
stmt.close(); con.close();
PreparedStatement
Statement pré-compilado
– Apresenta ganhos de eficiência quando
várias consultas similares são enviadas com parâmetros diferentes
Uma String com a instrução SQL é
preparada previamente, deixando-se
“?” no lugar dos parâmetros
Parâmetros são inseridos em ordem,
...
String sql = “INSERT INTO Conta VALUES(?, ?, ?)”; PreparedStatement cstmt =
con.preparedStatement(sql); cstmt.setString(1, “123”);
cstmt.setDouble(2, 0); cstmt.setString(3, “C”); cstmt.executeUpdate(); ...
Stored Procedures
Stored Procedures (Proc.
Armazenados)
– Procedimentos desenvolvidos em
linguagem proprietária do SGBD (PL-SQL, Transact-(PL-SQL, etc)
– Podem ser chamados através de objetos
CallableStatement
– Parâmetros são passados da mesma
forma que em instruções
PreparedStatement
Sintaxe
– con.prepareCall(“{call proc_update}”); – con.prepareCall(“{call
proc_update(?)}”);
– con.prepareCall(“{? = call
...
String command = "{call INS_CLIENTES(?,?)}"; CallableStatement cstmt = con.prepareCall
(command);
cstmt.setInt(1, cliente_id);
cstmt.setString(2, nome_cliente.trim()); cstmt.execute();
...
...
String command = "{? = call INS_CLIENTES(?,?)}";
CallableStatement cstmt = con.prepareCall (command);
cstmt.setInt(1, cliente_id);
cstmt.setString(2, nome_cliente.trim()); ResultSet rs = cstmt.executeQuery(); ...
Stored Procedures
...
String command = "{call INS_CLIENTES(?, ?, ?)}"; CallableStatement cstmt = con.prepareCall
(command);
cstmt.registerOutParameter(3, 3); cstmt.setInt(1, cliente_id);
cstmt.setString(2, nome_cliente.trim()); cstmt.execute();
System.out.println("Retorno: " + cstmt.getInt(3));
Metadados
Classe DatabaseMetaData
– Permite obter informações relacionadas
ao banco de dados
Classe ResultSetMetaData
– Permite obter informações sobre o
Metadados
...
Connection con;
DatabaseMetaData dbdata = con.getMetaData(); String dbname =
dbdata.getDatabaseProductName(); ...
...
ResultSet rs;
ResultSetMetaData meta = rs.getMetaData(); int col = meta.getColumnCount();
String [] nomeCols = new String[col]; for (int i=0; i<col; i++)
MEDIDAS DE
SEGURANÇA
Não é seguro transmitir o login e a
senha do usuário através da Internet;
Solução: usar procedimentos
JDBC 2.0
Supera diversas limitações da
versão 1.0:
– navegação bidirecional
– posicionamento absoluto
– atualizações/inserções/remoções via
cursor
– row sets (cursores desconectados) – connection pooling (reutilização de
conexões)
Características são opcionais
– Muitos drivers ainda não implementam
JDBC COMO
INFRA-ESTRUTURA
JDBC proposta como a infra-estrutura
de baixo nível para integração de Java
com BDs
Soluções de alto nível (sobre JDBC):
– SQLJ (Oracle, IBM, Sun...) - integração Java/
SQL (Embedded SQL, SQL Types e SQL Routines)
– Java Data Objects (Sun) - persistência
transparente (possivelmente através de mapeamento objeto-relacional)
– soluções proprietárias (ex.: componentes