Slides JDBC - Turma 3B - Sistemas de Informação

Propaganda
Curso de Linguagem Java
2º Semestre - 2007
Marcos Mendes
1
Conectividade de Banco de Dados
(JDBC)
2
Conectividade de Banco de Dados

Arquitetura JDBC

Introdução à Linguagem SQL

Configuração ODBC

Etapas da Programação JDBC

Uso do MySQL

API – JDBC

Manutenção de Tabelas de Banco de Dados
3
Conectividade de Banco de Dados

Arquitetura JDBC
Programa Java
API JDBC
(java.sql)
Comandos SQL
Driver JDBC
Banco
De Dados
4
Introdução à Linguagem SQL

Consulta


SELECT
Alteração

INSERT INTO

UPDATE

DELETE FROM
5
Introdução à Linguagem SQL

SELECT
SELECT colunas FROM tabelas WHERE critério

Exemplos:
SELECT * FROM cliente
SELECT Nome, Tel FROM Cliente
SELECT Nome FROM Cliente WHERE Estado = ‘SP’
SELECT Nome, Tel FROM Cliente WHERE Nome LIKE ‘João%’
SELECT Cliente.Nome, Pedido.NumPed FROM Cliente, Pedido
WHERE Cliente.CodCli = Pedido.CodCli
6
Introdução à Linguagem SQL

INSERT INTO
INSERT INTO tabela (nomeCol1, nomeCol2...)
VALUES (valor1, valor2...)

Exemplos:
INSERT INTO Cliente ( CodCli, Nome ) VALUES ( ‘001’,
‘CIM Alcina’ )
INSERT INTO Pedido ( NumPed, Data ) VALUES ( ‘031/01’,
TO_DATE (’13-MAR-2001’, ‘DD-MON-YYYY’ ) )
7
Introdução à Linguagem SQL

UPDATE
UPDATE tabela SET nomeCol1 = valor1, nomeCol2
= valor2... WHERE critério

Exemplos:
UPDATE Pedido SET Preço = Preço * 1.1
UPDATE Pedido SET Preço = Preço * 0.85 WHERE
CodProd = ‘XYZ’
8
Introdução à Linguagem SQL

DELETE FROM
DELETE FROM tabela WHERE critério

Exemplos:
DELETE FROM Cliente WHERE CodCli = ‘001’
DELETE FROM Pedido WHERE Data < TO_DATE (’13-MAR-2001’,
‘DD-MON-YYYY’ )
9
Mapeamento java.sql.Types para Java
Tipo SQL (java.sql.Types)
Tipo Java
BIT
boolean
TINYINT
byte
SMALLINT
short
INTEGER
int
BIGINT
long
REAL
float
FLOAT
double
DOUBLE
double
DECIMAL
java.math.BigDecimal
NUMERIC
java.math.BigDecimal
CHAR
java.lang.String
VARCHAR
java.lang.String
10
Mapeamento java.sql.Types para Java
Tipo SQL (java.sql.Types)
(cont.)
Tipo Java
LONGVARCHAR
java.lang.String
DATE
java.sql.Date
TIME
java.sql.Time
TIMESTAMP
java.sql.Timestamp
BINARY
byte[ ]
VARBINARY
byte[ ]
LONGVARBINARY
byte[ ]
BLOB
java.sql.Blob
CLOB
java.sql.Clob
ARRAY
java.sql.Array
REF
java.sql.Ref
STRUCT
java.sql.Struct
11
Conectividade de Banco de Dados

Configuração ODBC ( Windows )
Painel de Controle / Fontes de Dados ODBC (32 bits)
Você deve configurar os seguintes itens:



Driver
Nome da Fonte de Dados
Banco de Dados correspondente
Opcionalmente definir:


Nome de Logon
Senha de acesso
12
Conectividade de Banco de Dados

Etapas da Programação JDBC
1. Importar java.sql.*
2. Carregar Driver JDBC
3. Especificar um Banco de Dados
4. Abrir uma conexão com o Banco de
Dados
5. Criar um Statement (comando)
6. Submeter um comando SQL
7. Receber os resultados
13
Conectividade de Banco de Dados
Etapa 1 – Importar o Pacote java.sql

import java.sql.*;
Etapa 2 – Carregar Driver JDBC




(Depende do Banco de Dados)
Carga dinâmica da classe com o método Class.forName:
Class.forName ( “sun.jdbc.odbc.JdbcOdbcDriver” );
Instanciação de um objeto para forçar a carga da classe:
new sun.jdbc.odbc.JdbcOdbcDriver ( );
Atribuição a variáveis do sistema com a opção –D:
java –Djdbc.drivers=sun.jdbc.odbc.JdbcOdbcDriver programa
14
Conectividade de Banco de Dados

Etapa 3 – Criar uma url de conexão
(Depende do
Banco de Dados)
Especifica-se um banco de dados através de uma url no
seguinte formato:
jdbc:subprotocol:subname
onde: jdbc – Protocolo jdbc.
subprotocol – Mecanismo de conexão
subname – Fonte de Dados
Exemplo: String url = “jdbc:odbc:db1”;

Etapa 4 – Abrir Conexão
Fonte de Dados
Connection con = DriverManager.getConnection ( url, “user”, “senha” );
15
Conectividade de Banco de Dados

Etapa 5 – Criar um Statement (comando)
Statement stmt = con.createStatement ( );

Etapa 6 – Submeter um comando SQL
Neste exemplo, iremos submeter uma query.
String query = “SELECT * FROM tabela”;
ResultSet rs = stmt.executeQuery ( query );
16
Conectividade de Banco de Dados

Etapa 7 – Receber os resultados
No caso de uma query, o resultado é na forma de um conjunto de
linhas (registros) manipulados por métodos da interface
ResultSet. Por exemplo, para exibir as linhas deste conjunto,
percorre-se todas as linhas através do método next ( ).
Resultset rs = stmt.executeQuery ( query );
while ( rs.next ( ) ) {
// primeira coluna
System.out.println ( rs.getString( 1 ) );
// segunda coluna
System.out.println ( rs.getString( 2 ) );
}
17
Conectividade de Banco de Dados
import java.sql.*;
Usando uma fonte de dados ODBC.
public class Conexao {
public static void main ( String args [ ] ) {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url = "jdbc:odbc:fonteDados";
Connection con = DriverManager.getConnection(url, "usuário", "senha");
Statement st = con.createStatement ( );
String sql = "SELECT * FROM nomeTabela ORDER BY nomeCampo";
ResultSet rs = st.executeQuery ( sql );
while ( rs.next() ) {
System.out.println( rs.getString(2) + rs.getString("nomeCampo") );
}
} catch (Exception e) {
Programa exemplo para
testar uma conexão.
System.out.println ( e );
Exibe os dados de
}
uma tabela
}
}
18
Conectividade de Banco de Dados
import java.sql.*;
Usando o MySQL.
public class Conexao {
public static void main ( String args [ ] ) {
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/nomeBanco";
Connection con = DriverManager.getConnection(url, "usuário", "senha");
Statement st = con.createStatement ( );
String sql = "SELECT * FROM nomeTabela ORDER BY nomeCampo";
ResultSet rs = st.executeQuery ( sql );
while ( rs.next() ) {
System.out.println( rs.getString(2) + rs.getString("nomeCampo") );
}
} catch (Exception e) {
Programa exemplo para
testar uma conexão.
System.out.println ( e );
Exibe os dados de
}
uma tabela
}
}
19
Conectividade de Banco de Dados
import java.sql.*;
Usando o SQLServer2005.
public class Conexao {
public static void main ( String args [ ] ) {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url =
"jdbc:sqlserver://127.0.0.1;" +
"databaseName=nomeBanco;" +
"user=usuário;password=senha";
Connection con = DriverManager.getConnection(url);
Statement st = con.createStatement ( );
String sql = "SELECT * FROM nomeTabela ORDER BY nomeCampo";
ResultSet rs = st.executeQuery ( sql );
while ( rs.next() ) {
System.out.println( rs.getString(2) + rs.getString("nomeCampo") );
}
Programa exemplo para
} catch (Exception e) {
testar uma conexão.
System.out.println ( e );
Exibe os dados de
}
uma tabela
}
}
20
Usando o MySQL
Os tópicos a seguir que dizem respeito ao MySQL foram
baseados na seguinte bibliografia:

Beginning PHP 4 Programando




Wankyu Choi, Allan Kent, Chris Lea, Ganesh Prasad e
Chris Ullman.
Makron Books – Wrox Press
SQL Magazine

Edição 1 – Ano 1

SGBD no linux: MySQL por Clementino Leal
Java Magazine

Edição 7 – Ano 1

Bancos de Dados Livres por Fernando Lozano
21
Instalação do MySQL





(no Windows)
O MySQL pode ser obtido no site
http://www.mysql.com
Descompacte o arquivo mysql-4.0.16-win.zip em
um diretório qualquer como c:\mysqlinst
Execute o arquivo setup.exe, escolha o diretório
padrão c:\mysql e a instalação típica
Abra uma janela do DOS e vá para o diretório
c:\mysql\bin
Execute o comando winmysqladmin.exe para que
o servidor seja carregado. Na primeira execução
desse programa será pedido um nome de usuário e
senha.
22
Criação de banco de dados com MySQL







Inicie o cliente MySQL monitor:
c:\mysql\bin> mysql –u<usuário> -p<senha>
Crie um banco de dados:
mysql > create database pessoal;
Torne o banco de dados ativo:
mysql > use pessoal;
Crie uma tabela:
mysql > create table agenda (
-> id INT NOT NULL AUTO_INCREMENT,
-> nome VARCHAR(30),
-> telefone VARCHAR(30),
-> PRIMARY KEY (id)) ;
Insira alguns registros:
mysql > INSERT INTO agenda VALUES (1, “Maria”, “4444-4444”) ;
Exiba os registros inseridos:
mysql > SELECT * FROM agenda ORDER BY nome ;
Encerre o cliente:
mysql > exit;
23
Principais tipos de dados no MySQL
Tipo de dado
Descrição
Intervalo/Formato
INT
Inteiro normal
-231 a 231 - 1
TINYINT
Int. muito peq.
-27 a 27 - 1
BIGINT
Inteiro grande
-263 a 263 - 1
FLOAT
Flutuante simples ±1.176x10-38 a
±3.403x10+38
DOUBLE /
REAL
Flutuante dupla
DECIMAL
Flutuação String Igual a DOUBLE
DATE
Data
AAAA-MM-DD
DATETIME
Data e hora
AAAA-MM-DD hh:mm:ss
TIMESTAMP
Timestamp
AAAAMMDDhhmmss
±2.225x10-308 a
±1.798x10+308
24
Principais tipos de dados no MySQL
Tipo de dado
Descrição
(cont.)
Intervalo/Formato
CHAR
String de
tamanho fixo
De 0 a 255 caracteres
VARCHAR
String de
De 0 a 255 caracteres
tamanho variável
BLOB
Objeto binário
grande
LONGBLOB
BLOB de tamanho De 0 bytes a 4MB de
grande
extensão
TEXT
Campo de texto
De 0 65.535 bytes de
extensão
LONGTEXT
Campo de texto
longo
De 0 bytes a 4MB de
extensão
De 0 65.535 bytes de
extensão
25
Principais comandos do MySQL monitor
Os comandos devem ser finalizados com “;”







CREATE DATABASE
Cria um banco de dados.
DROP DATABASE
Apaga um banco de dados
CREATE TABLE
Cria uma tabela no banco de dados ativo.
SHOW DATABASES
Exibe uma lista dos bancos de dados ativos.
USE
Seleciona um banco de dados como ativo.
SHOW TABLES
Exibe as tabelas do banco de dados ativo.
EXIT
Encerra o monitor.
Além dos comandos SQL padrão.
26
Conexão com MySQL

Instale o driver Connector/J descompactando o arquivo:
mysql-connector-java-3.1.0-alpha.zip, será criado um
diretório com o mesmo nome.

Inclua o arquivo mysql-connector-java-3.1.0-alpha.jar no
Classpath.

Defina o driver em Class.forName ( ) como:
"com.mysql.jdbc.Driver"

Defina a URL de conexão como:
"jdbc:mysql://127.0.0.1:3306/banco"
onde banco é o nome do banco de dados.
27
Acesso a dados no MySQL com Eclipse

Para se executar uma aplicação que acesse um banco de dados
MySQL no Eclipse é necessário que se adicione o arquivo
mysql-connector-java-3.1.0-alpha.jar no classpath do
Eclipse.
Para tanto, no Eclipse, Selecione o menu "Project" opção
"Properties", clique em "Java Build Path", selecione a aba
"Libraries", clique no botão "Add External Jars..." selecione
o arquivo mysql-connector-java-3.1.0-alpha.jar no
diretório onde o driver Connector/J foi instalado, clique em
"abrir" e finalmente clique em "ok".
28
Usando o Apache Derby





Baixe o pacote de distribuição bin do Derby na página:
http://db.apache.org/derby/derby_downloads.html
Extraia o pacote baixado no diretório raiz.
Renomeie a pasta de instalação para “derby”
Adicione o diretório “derby\bin” à variável PATH
Mais informações para instalação:
http://db.apache.org/derby/docs/dev/pt_BR/getstart/
29
Exercício

Criar uma interface que grave registros em
uma tabela
Agenda
Nome:
Telefone:
Gravar
30
Comandos JDBC (java.sql.Statement)

Consulta
Statement st = con.createStatement( );
String sql = "SELECT * FROM tabela WHERE codigo =" + x;
ResultSet rs = st.executeQuery( sql );

Inclusão
Statement st = con.createStatement( );
String sql = "INSERT INTO tabela (nome, cargo) " +
"VALUES ( ‘ "+ vNome + " ‘ , ‘ "+ vCargo + " ‘ ) ";
int res = st.executeUpdate( sql );
31
Comandos preparados JDBC
(java.sql.PreparedStatement)

Consulta
String sql = "SELECT * FROM tabela WHERE codigo = ? ";
PreparedStatement pst = con.prepareStatement( sql );
pst.setInt (1, x);
ResultSet rs = pst.executeQuery( );

Inclusão
String sql = "INSERT INTO tabela (nome, cargo) " +
"VALUES ( ?, ?) ";
PreparedStatement pst = con.prepareStatement( sql );
pst.setString (1, vNome);
pst.setString (2, vCargo);
int res = pst.executeUpdate( );
32
Conjuntos de Resultados ( ResultSet )

Os valores que definem o tipo de um ResultSet são
especificados no método createStatement ( ) ou no
método prepareStatement ( )

Valores de Tipos de conjuntos




JDBC 2.0
TYPE_FORWARD_ONLY
Conjunto de resultados não rolável.
TYPE_SCROLL_INSENSITIVE
Conjunto de resultados rolável, mas não sensível às alterações
do banco de dados.
TYPE_SCROLL_SENSITIVE
Conjunto de resultados rolável e sensível às alterações do
banco de dados.
Valores de Concorrência de conjuntos


CONCUR_READ_ONLY
Conjunto de resultado apenas para leitura.
CONCUR_UPDATABLE
Conjunto de resultado atualizável.
33
API - JDBC

Interface Connection






void close ( )
Fecha uma conexão.
void commit ( )
Efetiva transação.
Statement createStatement ( )
Cria um comando.
PreparedStatement prepareStatement (String sql)
Cria um comando preparado.
void rollback ( )
Cancela transação.
void setAutoCommit ( boolean b )
Define a forma de efetivação dos dados.
34
API - JDBC

Classe DriverManager



Connection getConnection ( String url )
Connection getConnection ( String url, String usuário,
String senha )
Obtém uma conexão com uma fonte de dados.
Interface Statement




void close ( )
Encerra um comando.
boolean execute ( )
Executa o comando e retorna true se o resultado for um
resultset ou false se for um contador de atualização.
ResultSet executeQuery ( String comando )
Executa um comando de pesquisa e retorna um resultset.
int executeUpdate ( String comando )
Executa um comando de atualização e retorna o número de
35
linhas atualizadas.
API - JDBC

Interface PreparedStatement





void clearParameters ( )
Limpa os valores dos parâmetros do comando.
boolean execute ( )
Executa o comando e retorna true se o resultado for um
resultset ou false se for um contador de atualização.
ResultSet executeQuery ( )
Executa o comando de pesquisa e retorna um resultset.
int executeUpdate (String sql)
Executa o comando de atualização e retorna a quantidade
de linhas atualizadas.
void setXXX ( int i, XXX x )
Ajusta o valor do parâmetro i com o valor de x.
36
API - JDBC

Interface ResultSet

boolean absolute ( int row )
Move o cursor para uma determinada linha.

void afterLast ( )
Move o cursor para o final do ResultSet.

void beforeFirst ( )
Move o cursor para o início do ResultSet.

void cancelRowUpdates ( )
Cancela as atualizações feitas na linha atual.

void close ( )
Fecha o ResultSet.
37
API - JDBC






void deleteRow ( )
Exclui uma linha.
boolean first ( )
Move o cursor para a primeira linha do ResultSet.
XXX getXXX ( int coluna )
Retorna o valor de uma coluna da linha corrente.
Onde XXX é tipo de dado.
int getRow ( )
Retorna o número da linha corrente.
void insertRow ( )
Insere o conteúdo da linha de inserção no banco de dados.
boolean isAfterLast( )
Indica se o cursor está após a última linha do ResultSet.
38
API - JDBC

boolean isBeforeFirst( )
Indica se o cursor está antes da primeira linha do ResultSet.

boolean last ( )
Move o cursor para a última linha do ResultSet.

void moveToInsertRow ( )
Move o cursor para a linha de inserção

boolean next ( )
Move o cursor para a próxima linha do ResultSet.

boolean previous ( )
Move o cursor para a linha anterior do ResultSet.

boolean relative ( int n )
Move o cursor n linhas, para a frente se n for positivo, ou para trás
se n for negativo.

void updateXXX (int coluna, XXX dado )
Define o valor de uma coluna na linha corrente.
Onde XXX é o tipo de dado.
39
Exercício

Criar um simples cadastro de funcionários
Cadastro de Funcionários
Código:
xxx
Nome:
Cargo:
Salário:
Primeiro
Anterio
r
Próximo
Último
Novo
Alterar
Excluir
Sair
40
Download