Programação OO em Java Programação OO em Java Programação

Propaganda
Programação
com
a BD
Programação
OOAcesso
em Java
Curso: Técnico em Informática
Campus: Ipanguaçu
José
José Maria
Maria Monteiro
Monteiro
Pontifícia
PontifíciaUniversidade
Universidade Católica
Católica do
do Rio
Rio de
de Janeiro
Janeiro –– PUC
PUCPUC
PUC---Rio
Rio
Departamento
Departamento
de
de Informática
Informática
Clayton Maciel
Costa
[email protected]@inf.puc
[email protected]
[email protected]
rio.br
[email protected]
Programação com Acesso a BD
“O futuro tem muitos nomes. Para os
fracos é o inatingível. Para os temerosos,
o desconhecido. Para os valentes é a
oportunidade:”
Victor Hugo.
1
Programação com Acesso a BD
Unidades X: Acesso a
Bancos de Dados
(JDBC)
O QUE É 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;
2
JAVA E JDBC
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 bando 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;
CARACTERÍSTICAS DE JDBC
Java e JDBC proporcionam aos programadores de
bancos de dados as seguintes características :
Fácil mapeamento objeto para relacional.
Independência de banco de dados.
Computação distribuída.
3
O QUE JDBC FAZ?
De maneira simplificada JDBC faz seis
coisas :
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.
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 java ?
4
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:
– MDAC da Microsoft
ARQUITETURAS JDBC
Modelo em duas camadas;
Modelo em três camadas;
5
ARQUITETURAS JDBC
1 - MODELO EM DUAS CAMADAS
Acesso ao
Banco
LAN ou
Intranet
Disco Local e
Outras Fontes
Java e JDBC
Máquina Cliente
Servidor de
BD
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:
• Segurança, Aplicação Pesada (Fat).
6
ARQUITETURAS JDBC
2 - MODELO EM TRÊS CAMADAS
Lógica de Negócios
BD 1
RPC ou
CORBA
Application GUI code
Distribuição
Adicional das
Lógicas de
Negócios
BD 2
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
• Performance e Gerenciamento.
7
TIPOS DE DRIVERS JDBC
Ponte JDBC-ODBC
Acesso Nativo
Acesso por Middleware
Acesso Direto ao Servidor
TIPOS DE DRIVERS JDBC
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.
8
TIPOS DE DRIVERS JDBC
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.
TIPOS DE DRIVERS JDBC
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.
9
TIPOS DE DRIVERS JDBC
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.
ARQUITETURA JDBC
Aplicação
Aplicação
Aplicação
API JDBC
JDBC Driver Manager
pacote
java.sql
Protocolo JDBC
Driver
Tipo 1
Driver
Tipo 2
Código nativo
Código nativo
Driver ODBC
Protocolo
Proprietário
SGBD
BD
Protocolo
Proprietário
SGBD
BD
Driver
Tipo 3
Protocolo de
rede aberto
Middleware
Protocolo
Proprietário
SGBD
BD
Driver
Tipo 4
Protocolo
de rede
Proprietário
SGBD
BD
10
CLASSES DE DRIVERS JDBC
DIRETOS
ODBC-BRIDGE
Lista Completa:
http://servlet.java.sun.com/products/jdbc/drivers
DRIVER MANAGER
A classe DriverManager é uma camada
de gerenciamento do JDBC;
Responsável pela
usuários e os drivers;
interface
entre
os
11
JDBC INTERFACES
Interface
Connection
Descrição
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.
Usado para executar cláusulas SQL estáticas e obter os resultados
Statement
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.
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.
ResultSet
TRANSAÇÕES EM JDBC
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();
12
STORED PROCEDURES COM JDBC
Permite usar as particularidades do SGBD;
Diminui a portabilidade através dos SGBD’s;
Portabilidade - SQL 92;
CENÁRIO DE UMA APLICAÇÃO
JDBC
Client DriverManager
Connection
1
getConnection
2
repeat
ResultSet
createStatement
3
6
Statement
executQuery
4
next
5
get
7
8
close
close
13
MAPEAMENTO ENTRE TIPOS
SQL E TIPOS JAVA
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
MAPEAMENTO ENTRE TIPOS
SQL E TIPOS JAVA
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
14
MAPEAMENTO ENTRE TIPOS
SQL E TIPOS JAVA
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
DATE
java.sql.Date
ACESSANDO BD’S
EM DUAS CAMADAS
15
PROCEDIMENTOS NECESSÁRIOS PARA
ACESSAR BD’S UTILIZANDO JAVA
NESTE EXEMPLO UTILIZAREMOS O DRIVER
JDBC-ODBC BRIDGE DA SUN EM UMA
ARQUITETURA DE DUAS CAMADAS.
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
PASSO 5: FECHAMENTO DA CONEXÃO
16
PROCEDIMENTOS NECESSÁRIOS PARA
ACESSAR BD’S UTILIZANDO JAVA
PASSO 1: IMPORTAÇÃO DOS PACOTES NECESSÁRIOS
import java.sql.*;
PROCEDIMENTOS NECESSÁRIOS PARA
ACESSAR BD’S UTILIZANDO JAVA
PASSO 2: REGISTRO DO(S) DRIVER(S)
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver");
17
PROCEDIMENTOS NECESSÁRIOS PARA
ACESSAR BD’S UTILIZANDO JAVA
PASSO 3: ABERTURA DA CONEXÃO
String url = "jdbc:odbc:my-dsn";
Connection con =
DriverManager.getConnection(url,"usuario","senha");
PROCEDIMENTOS NECESSÁRIOS PARA
ACESSAR BD’S UTILIZANDO JAVA
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.
18
PROCEDIMENTOS NECESSÁRIOS PARA
ACESSAR BD’S UTILIZANDO JAVA
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, com
setXXX() onde XXX é um tipo igual aos
retornados pelos métodos de ResultSet
19
PreparedStatement
...
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-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 proc_update(?)}”);
20
Stored Procedures
...
String command = "{call INS_CLIENTES(?,?)}";
CallableStatement cstmt = con.prepareCall (command);
cstmt.setInt(1, cliente_id);
cstmt.setString(2, nome_cliente.trim());
cstmt.execute();
...
Stored Procedures
...
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();
...
21
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 ResultSet,
como por exemplo quantas colunas e linhas
existem na tabela de resultados, o nome das
colunas, etc.
22
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++)
nomeCols[i] = meta.getColumnName(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
armazenados e tirar o direito de
modificar diretamente os dados;
23
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 estas
novas características
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
JBuilder)
24
EXERCÍCIOS
Altere as definições de banco vistas na
aula para que poupanças e contas
especiais possam ser armazenadas no
banco de dados.
25
Download