JDBC
• JDBC é uma interface baseada em Java para acesso
a bancos de dados através de SQL.
– Pacote Java padrão: java.sql
• Usando JDBC, pode-se obter acesso direto a bancos
de dados através de applets e outras aplicações
Java
• O programador escreve uma interface para banco
de dados, podendo acessar várias fontes diferentes
sem mudança de código.
JDBC
JDBC é uma interface de nível de código
– Código SQL é usado explicitamente dentro do código Java
– O pacote java.sql consiste de um conjunto de classes e
interfaces que permitem embutir código SQL em métodos.
Para usar JDBC é preciso ter um
– driver JDBC
Drivers JDBC
Type I ODBC
ODBC
“Bridge” Driver
Type II
.lib .dll
“Native”
JDBC
Type III Middleware
“Middleware” Server
Type IV
“Pure”
java.sql
• Biblioteca específica:
– java.sql
– O pacote java.sql é formado em sua grande maioria,
apenas por classes de interfaces. Desta maneira, a
implementação dessas classes fica por conta de alguém
que entenda de determinado banco de dados (geralmente
pelo desenvolvedor do mesmo).
– Ao contrário de linguagens como php, o java não
implementa esses drivers, desta maneira, novos drivers vão
aparecendo na medida em que novos bancos de dados e
novas versões vão aparecendo.
Conexão JDBC
Biblioteca SQL
import java.sql.*;
...
Conexão JDBC
Biblioteca SQL
import java.sql.*; Objeto para a
Conexão
...
private Connection connect;
…
Conexão JDBC
Biblioteca SQL
import java.sql.*; Objeto para a
Conexão
...
private Connection connect;
…
try {
}
catch
Conexão JDBC
Biblioteca SQL
import java.sql.*; Objeto para a
Conexão
...
private Connection connect;
…
try {
Class.forName("org.postgresql.Driver");
}
catch
A interface Driver é utilizada apenas pelas
implementações de drivers JDBC
É preciso carregar a classe do driver na
aplicação que irá utilizá-lo.
Isto pode ser feito com Class.forName():
Conexão JDBC
Biblioteca SQL
import java.sql.*; Objeto para a
Conexão
...
private Connection connect; Caminho de
conexão à base de
…
dados PostGreSQL
try {
Class.forName("org.postgresql.Driver");
String url = "jdbc:postgresql://localhost/BASEDADOS”;
} URL JDBC:
catch Para determinar qual driver será usado usa-se uma URL:
jdbc:<subprotocolo>:<dsn>
A aplicação usa o subprotocolo para identificar e selecionar
o driver a ser instanciado.
O dsn é o nome que o subprotocolo utilizará para localizar
um determinado servidor ou base de dados.
Conexão JDBC
Biblioteca SQL
import java.sql.*; Objeto para a
Conexão
...
private Connection connect; Caminho de
conexão à base de
…
dados PostGreSQL
try {
Class.forName("org.postgresql.Driver");
String url = "jdbc:postgresql://localhost/BASEDADOS";
connect = DriverManager.getConnection(url, “usr“,“senha");
} Efetua a conexão
catch
A classe DriverManager manipula objetos do tipo Driver.
Possui métodos para registrar drivers, removê-los ou listá-los.
É usada para retornar um objeto Connection, que representa uma
Conexão a um banco de dados, a partir de uma URL JDBC
recebida como parâmetro
Conexão JDBC
Biblioteca SQL
import java.sql.*; Objeto para a
Conexão
...
private Connection connect; Caminho de
Não é conexão à base de
… necessário a
partir do Java 7 dados PostGreSQL
try {
Class.forName("org.postgresql.Driver");
String url = "jdbc:postgresql://localhost/BASEDADOS";
connect = DriverManager.getConnection(url, “usr“,“senha");
} Efetua a conexão
catch ( ClassNotFoundException cnfex )
{ System.err.println("Falha ao ler driver JDBC:“+cnfex.toString());
}
catch ( SQLException sqlex )
{ System.out.println(“Problemas na base de dados:“+sqlex.toString());
}
catch ( Exception ex ) Três tipos
{ System.out.println(“Outro erro:“+ex.toString()); possíveis de erro
}
Drivers
RDBMS Nome driver JDBC URL
MySQL com.mysql.jdbc.Driver jdbc:mysql://localhost/BASE-DADOS?
user=USUARIO&password=SENHA
Oracle oracle.jdbc.driver.OracleDriver jdbc:oracle:this:@nomeDoHost:numer
oDaPorta:BASE-DADOS?
user=USUARIO&password=SENHA
DB2 com.ibm.db2.jdbc.net.DB2Driver jdbc:db2.nomeDoHost:numeroDaPorta/
BASE-DADOS ?
user=USUARIO&password=SENHA
PostGres org.postgresql.Driver jdbc:postgresql://localhost/BASE-
DADOS?user=USUÁRIO&password=SENHA
Firebird org.firebirdsql.jdbc.FBDriver jdbc:firebirdsql://localhost/BASE-
DADOS? user=USUÁRIO&password=SENHA
Sybase Com.sysbase.jdbc.SybDriver jdbc:sysbase:Tds:nomeDoHost:numero
DaPorta/BASE-DADOS
ResultSet e Statement
• Interfaces que contém métodos implementados
em todos os drivers JDBC.
• Statement
– Oferece meios de passar instruções SQL para o sistema
de bancos de dados. DriverManager
Driver
Connection
• ResultSet
– É um cursor para os dados recebidos. Statement
ResultSet
Statement
• Obtendo-se um objeto Connection, chama-se sobre
ele o método createStatement() para obter um
objeto do tipo Statement:
Statement stmt = con.createStatement()
que poderá usar métodos como execute( ),
executeQuery( ), executeBatch( ) e
executeUpdate( ) para enviar instruções SQL ao
BD.
Execução SQL
Código anterior
...
try {
}
catch
Execução SQL
Cria o objeto para
executar um comando
SQL
...
try {
Statement statement = connect.createStatement();
}
catch
Execução SQL
Cria o objeto para
Monta o
executar um comando
SQL
SQL
...
try {
Statement statement = connect.createStatement();
String query = "UPDATE addresses SET Sobrenome =
‘Teste’ WHERE id = 1”;
}
catch
Execução SQL
Cria o objeto para
Monta o
executar um comando
SQL
SQL
...
try {
Statement statement = connect.createStatement();
String query = "UPDATE addresses SET Sobrenome =
‘Teste’ WHERE id = 1”;
int result = statement.executeUpdate( query );
}
Executa o SQL
catch retornando o
número de
registros afetados
Execução SQL (executeUpdate)
Cria o objeto para
Monta o
executar um comando
SQL
SQL
...
try {
Statement statement = connect.createStatement();
String query = "UPDATE addresses SET Sobrenome =
‘Teste’ WHERE id = 1”;
int result = statement.executeUpdate( query );
statement.close();
}
Executa o SQL
catch ( SQLException sqlex ) {...} retornando o
número de
registros afetados
Erro de SQL Finaliza o objeto que
executou o SQL
Execução SQL (PrepareStatement)
Outra forma de executar uma query:
String sql = "INSERT INTO CLIENTE (ID, NOME, DT_INICIO, DT_FINAL)
VALUES (?, ?, ?, ?)";
PreparedStatement sqlInsereCliente = connect.preparedStatement(sql);
sqlInsereCliente.setInt (1,clienteID);
sqlInsereCliente.setString(2,clienteNome);
sqlInsereCliente.setDate (3,clienteDataInicio);
sqlInsereCliente.setDate (4,clienteDataFinal);
sqlInsereCliente.execute();
Execução SQL (executeQuery)
TYPE_FORWARD_ONLY:
Especifica que o cursor de um ResultSet pode mover apenas para frente.
TYPE_SCROLL_INSENSITIVE:
Especifica que o cursor de um ResultSet pode rolar em qualquer direção e que
as alterações feitas no ResultSet durante o processamento do ResultSet não
são refletidas no ResultSet, a menos que o programa consulte novamente o BD.
TYPE_SCROLL_SENSITIVE:
Especifica que o cursor de um ResultSet pode rolar em qualquer direção e que
Parâmetros Opcionais as alterações feitas no ResultSet durante o processamento do ResultSet são
refletidas imediatamente no ResultSet.
CONCUR_READ_ONLY:
Especifica que um ResultSet não pode ser atualizado.
... CONCUR_UPDATABLE:
try { Especifica que um ResultSet pode ser atualizado.
Statement statement = connect.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
String query = “SELECT * FROM addresses”;
ResultSet rs = statement.executeQuery( query );
statement.close();
} Executa o SQL
retornando um conjunto
catch ( SQLException sqlex ) {...}
de dados
ResultSet
• O método executeQuery(), da interface Statement, retorna um
objeto ResultSet.
– Cursor para as linhas de uma tabela.
– Pode-se navegar pelas linhas da tabela recuperar as informações
armazenadas nas colunas
• Os métodos de navegação são
– next(), previous(), absolute(), first() e last()
• Métodos para obtenção de dados:
String getString(int columnIndex) boolean getBoolean(int columnIndex)
byte getByte(int columnIndex) short getShort(int columnIndex)
int getInt(int columnIndex) long getLong(int columnIndex)
float getFloat(int columnIndex) double getDouble(int columnIndex)
Date getDate(int columnIndex) Time getTime(int columnIndex)
Timestamp getTimestamp(int columnIndex)
Tipos JDBC e métodos getXXX()
Mapeamento SQL x Java
SQL type Java Type
CHAR, VARCHAR, LONGVARCHAR String
NUMERIC, DECIMAL java.math.BigDecimal
BIT boolean
TINYINT byte
SMALLINT short
INTEGER int
BIGINT long
REAL float
FLOAT, DOUBLE double
BINARY, VARBINARY, LONGVARBINARY byte[]
DATE java.sql.Date
TIME java.sql.Time
TIMESTAMP java.sql.Timestamp
ResultSet
• Processando o ResultSet
ResultSet rs = stmt.executeQuery("SELECT Numero, Texto,
Data FROM Anuncios");
while (rs.next())
{
int x = rs.getInt("Numero");
String s = rs.getString("Texto");
java.sql.Date d = rs.getDate("Data");
// faça algo com os valores obtidos...
}
ResultSet
– Posicionamento de registros:
ResultSet rs;
...
rs.first(); rs.last();
rs.next(); rs.previous();
– Escolhendo um campo:
Int Codigo = rs. getInt( “ID” );
String Nome = rs. getString( “Nome” );
Date Nascimento = rs. getDate( “DtNasc” );
ResultSet
• Recuperando os campos de uma tabela Recupera os
campos de
ResultSet rs; uma tabela ou
... query
ResultSetMetaData rsm = rs.getMetaData(); Número de
campos
for( int i=1;i<=rsm.getColumnCount(); i++)
System.out.println(rsm.getColumnName(i));
Os campos
Transações com segurança
try {
//Assumir que conn é um objeto do tipo connect instanciado
conn.setAutoCommit(false); A transação será efetuada de forma
Statement stmt = conn.createStatement(); manual (com commit explícito)
String SQL = "INSERT INTO Employees VALUES (106,20, 'Rita','Tez')";
stmt.executeUpdate(SQL);
//Envia um sql com erros
String SQL = "INSERTED IN Employees VALUES (107,22,'Sita','Sin')";
stmt.executeUpdate(SQL);
Efetua a
// se chegou até aqui não há erros transação
conn.commit();
} catch(SQLException se){ Desfaz todas as transações que iniciaram desde
// No caso de erros a instrução setAutoCommit(false)
conn.rollback();
} finally { Retorna no modo
conn.setAutoCommit(true); automático
}
Tabela para praticar!
Classe
Conexão
Classe Conexão
public class Conexao
{ private Connection connect;
private String erro;
public Conexao()
{ ... }
public boolean conectar(String local,String banco,String usuario,String senha)
{ ... }
public String getMensagemErro()//retorna eventuais mensagens de erro
{ ... }
public boolean getEstadoConexao() //verifica se a conexão esta ativa
{ ... }
public boolean manipular(String sql) //inserir, alterar,excluir
{ ... }
public ResultSet consultar(String sql)
{ ... }
public int getMaxPK(String tabela,String chave)//retorna maior chave
{ ... }
// outros métodos
}
Classe Conexão
Conexao con=new Conexao();
if (!con.conectar("jdbc:postgresql://localhost/",
"banco","postgres","postgres123"))
System.out.println(con.getMensagemErro());
// recuperando o último código
int cod=con.getMaxPK("CLIENTES","cli_codigo");
// inserindo um registro
String sql="insert into CLIENTES (cli_codigo,nome,profissao) " +
"values ("+(cod+1)+",'Mickey','Ator')";
if(con.manipular(sql)==false)
System.out.println(con.getMensagemErro());
// realizando uma consulta
ResultSet rs=con.consultar("Select * from Clientes");
// apresentando os dados
while (rs.next()) {
...
}
...
Classe Conexão
public class Conexao
{ private Connection connect; private String erro="";
public Conexao()
{ erro=""; connect=null;
}
public boolean conectar (String local,String banco,String usuario,String senha)
{ boolean conectado=false;
try {
String url = local+banco; //"jdbc:postgresql://localhost/"+banco;
connect = DriverManager.getConnection( url, usuario,senha);
conectado=true;
}
catch ( SQLException sqlex )
{ erro= "Erro ao conectar com a base de dados: " + sqlex.toString();}
catch ( Exception ex )
{ erro="Outro erro: " + ex.toString(); }
return conectado;
}
Classe Conexão
public class Conexao
{ ...
public String getMensagemErro() {
return erro;
}
public boolean getEstadoConexao() {
if(connect==null) return false;
else return true;
}
...
}
Classe Conexão
public class Conexao
{ ...
public boolean manipular(String sql) // inserir, alterar,excluir
{ try {
Statement statement = connect.createStatement();
int result = statement.executeUpdate( sql );
statement.close();
if(result>=1) return true;
}
catch ( SQLException sqlex )
{ erro="Erro: "+sqlex.toString(); return false; }
return false;
}
...
}
...
Classe Conexão
public class Conexao
{ ...
public ResultSet consultar(String sql)
{ ResultSet rs=null;
try {
Statement statement = connect.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs = statement.executeQuery( sql );
//statement.close(); não pode fechar a conexao
}
catch ( SQLException sqlex )
{ erro="Erro: "+sqlex.toString(); return null;
}
return rs;
}
...
Classe Conexão
public class Conexao
{ ...
public int getMaxPK(String tabela,String chave)
{ String sql="select max("+chave+") from "+tabela;
int max=0;
ResultSet rs= consultar(sql);
try
{ if(rs.next())
max=rs.getInt(1);
}
catch (SQLException sqlex)
{ erro="Erro: " + sqlex.toString();
return -1;
}
return max;
}
}
Conexão com escopo global: Classe Banco
public class Banco
{ public static Conexao con=null;
private Banco(){} // evita instanciar por new
public static boolean conectar()
{
return con=new Conexao("jdbc:postgresql://localhost/",
"banco","postgres","postgres123");
}
}
Conexão com escopo global: Classe Banco
Utilizando a classe:
// inicie a Conexão com o Banco no programa
// principal de seu projeto (main())
if(!Banco.conectarBD())
{ System.out.println(Banco.con.getMensagemErro());
// avise o usuário e termine o sistema
}
Em qualquer módulo do projeto, você pode acessar o objeto simplesmente referenciando
a classe Banco:
ResultSet rs=Banco.con.consultar( ... );
...
Banco.con.manipular( ... );
Liberando conexões
Remotas ao PostgreSQL
Abra o arquivo pg_hba.conf (geramente em Arquivos de Programas\PostgreSQL\versao\data)
Insira as linhas:
IPv4 local connections:
Host all all 127.0.0.1/32 md5
host all all 200.210.215.0/24 md5 -> libera
para 200.210.215.*
host all all 200.230.94.64/27 md5 -> libera
para um IP específico
host all all 0.0.0.0/0 md5 -> libera qualquer
acesso remoto
Desabilite o firewall do servidor (ou configure para liberar a porta 5432)
Mais informações:
http://www.oficinadanet.com.br/artigo/2101/liberando_conexoes_remotas_ao_postgresql
Imagens
Extra: armazenando uma imagem
no banco com PostgreSQL
CREATE TABLE images(
imgname text,
img bytea
)
Armazenando:
Class.forName("org.postgresql.Driver");
String url = "jdbc:postgresql://localhost/imagens";
connect = DriverManager.getConnection( url, "postgres", “postgres123");
File file = new File("c:\\animatedBee.gif");
FileInputStream fis = new FileInputStream(file);
PreparedStatement ps = connect.prepareStatement("INSERT INTO images
VALUES (?, ?)");
ps.setString(1, file.getName());
ps.setBinaryStream(2, fis, (int)file.length());
ps.executeUpdate();
ps.close();
fis.close();
Extra: armazenando uma imagem
no banco com PostgreSQL
CREATE TABLE images(
imgname text,
img bytea
)
Recuperando:
PreparedStatement ps = connect.prepareStatement("SELECT img FROM images
WHERE imgname = ?");
ps.setString(1, "animatedBee.gif");
ResultSet rs = ps.executeQuery();
if (rs.next()) {
byte[] imgBytes = rs.getBytes(1);
// transforma um byte[] em uma imagem
InputStream in = new ByteArrayInputStream(imgBytes);
BufferedImage bImageFromConvert = ImageIO.read(in);
ImageIO.write(bImageFromConvert, "gif", new File("c://imagem.gif"));
}
rs.close();
ps.close();
Gerando BD
E Tabelas
Extra: criar a base de dados e suas tabelas
criarBD("teste1");
Para criar a base de dados
public static boolean criarBD(String BD)
{ try{
Class.forName("org.postgresql.Driver");
String url = "jdbc:postgresql://localhost/";
Connection con = DriverManager.getConnection(url,"postgres","postgres123");
Statement statement = con.createStatement();
statement.execute("CREATE DATABASE "+BD+" WITH OWNER = postgres ENCODING = 'UTF8' "
+ "TABLESPACE = pg_default LC_COLLATE = 'Portuguese_Brazil.1252' "
+ "LC_CTYPE = 'Portuguese_Brazil.1252' CONNECTION LIMIT = -1;");
statement.close();
con.close();
}catch(Exception e)
{ System.out.println(e.getMessage()); return false;}
return true;
}
Extra: criar a base de dados e suas tabelas
criarTabelas("d:\\bkp.sql","teste1")
Para criar as tabelas a partir de um script
public static boolean criarTabelas(String script,String BD)
{ try{
Class.forName("org.postgresql.Driver");
String url = "jdbc:postgresql://localhost/"+BD;
Connection con = DriverManager.getConnection(url, "postgres","postgres123");
Statement statement = connect.createStatement();
RandomAccessFile arq=new RandomAccessFile(script, "r");
while(arq.getFilePointer() < arq.length())
statement.addBatch(arq.readLine());
statement.executeBatch();
statement.close();
connect.close();
}catch(Exception e)
{ System.out.println(e.getMessage()); return false;}
return true;
}
Extra: criar a base de dados e suas tabelas
Exemplo de um script (cada instrução deve estar em uma linha do arquivo)
DROP TABLE IF EXISTS books, authors, testing, images;
CREATE TABLE IF NOT EXISTS authors (id serial PRIMARY KEY,name VARCHAR(25));
CREATE TABLE IF NOT EXISTS books (id serial PRIMARY KEY,author_id INT
references authors(id), title VARCHAR(100));
CREATE TABLE IF NOT EXISTS testing(id INT);
CREATE TABLE IF NOT EXISTS images(id serial, data bytea);
INSERT INTO authors(id, name) VALUES(1, 'Jack London');
INSERT INTO authors(id, name) VALUES(2, 'Honore de Balzac');
INSERT INTO authors(id, name) VALUES(3, 'Lion Feuchtwanger');
INSERT INTO authors(id, name) VALUES(4, 'Emile Zola');
INSERT INTO authors(id, name) VALUES(5, 'Truman Capote');
INSERT INTO books(id, author_id, title) VALUES(1, 1, 'Call of the Wild');
INSERT INTO books(id, author_id, title) VALUES(2, 1, 'Martin Eden');
INSERT INTO books(id, author_id, title) VALUES(3, 2, 'Old Goriot');
INSERT INTO books(id, author_id, title) VALUES(4, 2, 'Cousin Bette');
INSERT INTO books(id, author_id, title) VALUES(5, 3, 'Jew Suess');
INSERT INTO books(id, author_id, title) VALUES(6, 4, 'Nana');
INSERT INTO books(id, author_id, title) VALUES(7, 4, 'The Belly of Paris');
INSERT INTO books(id, author_id, title) VALUES(8, 5, 'In Cold blood');
INSERT INTO books(id, author_id, title) VALUES(9, 5, 'Breakfast at Tifany');
BackUp
Extra: realizar um backup da base de dados
Crie um arquivo .bat com as instruções de backup
Arquivo a
ser gerado
set PGUSER=postgres
set PGPASSWORD=postgres123
"C:/Program Files/PostgreSQL/9.2/bin\"pg_dump.exe --host localhost --
port 5432 --format custom --blobs --verbose --file "D:\bkp.sql" "fipp"
Base de
dados
Crie um arquivo .bat com as instruções de restauração
set PGUSER=postgres
set PGPASSWORD=postgres123
"C:/Program Files/PostgreSQL/9.2/bin\pg_restore.exe -i -h
200.210.215.224 -p 5432 -c -d fipp -v " D:\bkp.sql"
Extra: realizar um backup da base de dados
Execute o seguinte código:
public void realizaBackup()
{
Runtime r = Runtime.getRuntime();
try {
Process p = r.exec("d:\\bkp.bat");
if (p != null) {
InputStreamReader str = new InputStreamReader(p.getErrorStream());
BufferedReader reader = new BufferedReader(str);
String linha;
while ((linha = reader.readLine()) != null) {
System.out.println(linha);
}
}
JOptionPane.showMessageDialog(null,"Backup realizado com sucesso!");
} catch (IOException ex) {
JOptionPane.showMessageDialog(null,"Erro no backup!"+ex.getMessage());
}
}
Extra: realizar um backup da base de dados
Se preferir crie uma pasta com os utilitários pg-dump , pg-restore e suas dependências:
Exemplo: Controle de Frota
Revisão
SQL
SQL
SQL
SQL Descrição
SELECT Recupera dados de uma ou mais tabelas
FROM Tabela envolvida na consulta.
.
WHERE Critérios de seleção que determinam as linhas
retornadas, apagadas ou atualizadas. Opcional.
GROUP BY Critério para agrupar linhas. Opcional
ORDER BY Critério para ordenar linhas. Opcional.
INNER JOIN Mescla linhas de múltiplas tabelas.
INSERT Insere linhas em uma tabela especificada.
UPDATE Atualiza linhas em uma tabela especificada.
DELETE Remove linhas de uma tabela especificada.
Cláusula SELECT
• Sintaxe
– SELECT (campos|*) FROM tabela
• SELECT * FROM authors
• SELECT authorID, lastName FROM authors
authorID lastName
1 Deitel
2 Deitel
3 Nieto
4 Santry
Cláusula WHERE
• Especifica o critério de seleção
– SELECT columnName1, columnName2, … FROM tableName
WHERE criteria
• SELECT title, editionNumber, copyright
FROM titles
WHERE copyright > 2000
• Operadores
– <, >, <=, >=, =, <>
– LIKE
• curingas % e _
Cláusula WHERE
title editionNumber copyright
C How to Program 3 2001
C++ How to Program 4 2002
The Complete C++ Training 4 2002
Course
Internet and World Wide Web 2 2002
How to Program
Java How to Program 5 2003
XML How to Program 1 2001
Perl How to Program 1 2001
Advanced Java 2 Platform 1 2002
How to Program
Cláusula WHERE
• SELECT authorID, firstName, lastName
FROM authors
WHERE lastName LIKE ‘D%’
authorID firstName lastName
1 Harvey Deitel
2 Paul Deitel
Cláusula WHERE
• SELECT authorID, firstName, lastName
FROM authors
WHERE lastName LIKE ‘_i%’
authorID firstName lastName
3 Tem Nieto
Cláusula ORDER BY
• Opcional
– SELECT columnName1, columnName2, … FROM
tableName ORDER BY column ASC
– SELECT columnName1, columnName2, … FROM
tableName ORDER BY column DESC
• ORDER BY múltiplos campos
– ORDER BY column1 sortingOrder, column2 sortingOrder, …
• Podemos combinar cláusulas WHERE e ORDER BY
Cláusula ORDER BY
• SELECT authorID, firstName, lastName
FROM authors
ORDER BY lastName ASC
authorID firstName lastName
2 Paul Deitel
1 Harvey Deitel
3 Tem Nieto
4 Sean Santry
.
Cláusula ORDER BY
• SELECT authorID, firstName, lastName
FROM authors
ORDER BY lastName DESC
authorID firstName lastName
4 Sean Santry
3 Tem Nieto
2 Paul Deitel
1 Harvey Deitel
Cláusula ORDER BY
• SELECT authorID, firstName, lastName
FROM authors
ORDER BY lastName, firstName
authorID firstName lastName
1 Harvey Deitel
2 Paul Deitel
3 Tem Nieto
4 Sean Santry
Cláusula ORDER BY
• SELECT isbn, title, editionNumber, copyright, price
FROM titles WHERE title LIKE ‘%How to Program’
ORDER BY title ASC
isbn title edition - copy- price
Number right
0130895601 Advanced Java 2 Platform How to Program 1 2002 74.95
0130895725 C How to Program 3 2001 74.95
0130384747 C++ How to Program 4 2002 74.95
0130308978 Internet and World Wide Web How to 2 2002 74.95
Program
0130284181 Perl How to Program 1 2001 74.95
0134569555 Visual Basic 6 How to Program 1 1999 74.95
0130284173 XML How to Program 1 2001 74.95
013028419x e-Business and e-Commerce How to 1 2001 74.95
Program
Cláusula JOIN
• Mescla dados de tabelas relacionadas.
• Junção de tabelas
• SELECT columnName1, columnName2, …
FROM table1
INNER JOIN table2
ON table1.columnName = table2.column2Name
• SELECT firstName, lastName, isbn
FROM authors, authorISBN
INNER JOIN authorISBN
ON authors.authorID = authorISBN.authorID
ORDER BY lastName, firstName
Cláusula JOIN
firstName lastName isbn firstName lastName isbn
Harvey Deitel 0130895601 Paul Deitel 0130895717
Harvey Deitel 0130284181 Paul Deitel 0132261197
Harvey Deitel 0134569555 Paul Deitel 0130895725
Harvey Deitel 0139163050 Paul Deitel 0130829293
Harvey Deitel 0135289106 Paul Deitel 0134569555
Harvey Deitel 0130895717 Paul Deitel 0130829277
Harvey Deitel 0130284173 Tem Nieto 0130161438
Harvey Deitel 0130829293 Tem Nieto 013028419x
Paul Deitel 0130852473 Sean Santry 0130895601
Cláusula INSERT
• Insere uma linha na tabela
– INSERT INTO tableName ( columnName1, … , columnNameN )
VALUES ( value1, … , valueN )
• INSERT INTO authors ( firstName, lastName )
VALUES ( ‘Sue’, ‘Smith’ )
authorID firstName lastName
1 Harvey Deitel
2 Paul Deitel
3 Tem Nieto
4 Sean Santry
5 Sue Smith
Ou '2008-12-30 00:00:00´
Inserindo Datas: '2008-12-30'
• INSERT INTO empresa ( nome, fundacao )
VALUES ( ‘PKZ Imports’, Cast(‘12-30-2008’ As TimeStamp) )
Cláusula UPDATE
• Altera os dados da tabela
– UPDATE tableName
SET columnName1 = value1, … , columnNameN = valueN
WHERE criteria
UPDATE authors
SET lastName = ‘Jones’
WHERE lastName = ‘Smith’ AND firstName = ‘Sue’
authorID firstName lastName
1 Harvey Deitel
2 Paul Deitel
3 Tem Nieto
4 Sean Santry
5 Sue Jones
Cláusula DELETE
• Apaga dados da tabela
– DELETE FROM tableName WHERE criteria
• DELETE FROM authors
WHERE lastName = ‘Jones’ AND firstName = ‘Sue’
authorID firstName lastName
1 Harvey Deitel
2 Paul Deitel
3 Tem Nieto
4 Sean Santry
http://www.devmedia.com.br/sql-join-entenda-como-funciona-o-retorno-dos-dados/
31006?utm_content=bufferc4881&utm_medium=social&utm_source=facebook.com&
utm_campaign=buffer
Outros
RDBMS
Acesso via ODBC
Biblioteca SQL
Conexão ODBC: Objeto para a
Conexão
import java.sql.*;
...
Caminho de conexão
private Connection connect;
apontando para o
… nome da fonte ODBC
try {
String url = "jdbc:odbc:AddressBook";
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
connect = DriverManager.getConnection( url );
Efetua a
conexão
}
catch ( ClassNotFoundException cnfex )
{System.err.println("Falha ao ler o driver ODBC");}
catch ( SQLException sqlex )
Três tipos
{System.out.println("Impossível conectar");}
possíveis de erro
catch ( Exception ex )
{System.out.println(“Outro erro");.}
Acesso via ODBC (interbase)
Conexão ODBC Interbase:
import java.sql.*;
...
private Connection connect;
… Fonte de dados
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
connect = DriverManager.getConnection("jdbc:odbc:fire",
"sysdba","masterkey");
}
catch ( ClassNotFoundException cnfex )
{System.err.println("Falha ao ler o driver ODBC");}
catch ( SQLException sqlex )
{System.out.println("Impossível conectar");}
catch ( Exception ex )
{System.out.println(“Outro erro");.}
MySQL:Instalando o driver Conector/J
Usando MySQL:
a) Faça download do driver no site:
www.mysql.com/downloads/api-jdbc.html
b) Descompacte o arquivo em uma pasta conhecida, por
exemplo c:\drivers-java ou na pasta de instalação java
apropriada para pacotes externos, por exemplo:
Arquivos de Programas\java\jdk1.5.0_04\jre\lib\ext
c) Faça referência ao driver (mysql-connector-java-3.0.17-ga-bin.jar)
no classpath (caso opte pela primeira opção do item b).
Conexão JDBC - MySQL
Biblioteca SQL
import java.sql.*; Objeto para a
Conexão
...
private Connection connect;
… Caminho de conexão a
base de dados MySQL
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost/BASE-DADOS?user=root&password=";
connect = DriverManager.getConnection( url );
} Efetua a conexão
catch ( ClassNotFoundException cnfex )
{ System.err.println("Falha ao ler o driver JDBC"); } Três tipos
possíveis de erro
catch ( SQLException sqlex )
{ System.out.println("Impossível conectar com a base de dados"); }
catch ( Exception ex )
{ System.out.println(“Outro erro"); }
Conexão JDBC - Postgres
Biblioteca SQL
import java.sql.*; Objeto para a
... Conexão
private Connection connect; Caminho de conexão à
… base de dados
try { PostGreSQL
Class.forName("org.postgresql.Driver");
String url = "jdbc:postgresql://localhost/BANCO?user=USUÁRIO&password=SENHA";
connect = DriverManager.getConnection( url );
}
catch ( ClassNotFoundException cnfex ) Efetua a conexão
{ System.err.println("Falha ao ler o driver JDBC"); }
catch ( SQLException sqlex )
{ System.out.println("Impossível conectar com a base de dados"); }
catch ( Exception ex )
{ System.out.println(“Outro erro"); } Três tipos
possíveis de erro
Configurando compartilhamento no Postgres
Acesse a opção Tools/Server Configuration/postgresql.conf e altere a linha
listen_adresses para ‘*’ em Value.
Acesse a opção Tools/Server Configuration/pghba.conf e insira uma linha
habilitando que um determinado endereço IP faça conexão.
78
Usando o Eclipse
Plugin SQLExplorer:
a) Faça download do plugin no site:
http://sourceforge.net/projects/eclipsesql
b) Descompacte o arquivo
net.sourceforge.sqlexplorer_2.2.4.zip na pasta
onde se encontra o eclipse (...\eclipse)
c) Abra o Eclipse e visualize a perspectiva
SQLExplorer.
d) Configure o Driver e o Alias...