Escolar Documentos
Profissional Documentos
Cultura Documentos
A03 - JDBC
A03 - JDBC
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
JDBC
Introdução
Conexão
API JDBC
Prática
Operação interativa;
Operação preparada;
OO e JDBC
Exemplo 1
Exemplo 2
2
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Introdução - Linguagens de um
SGBD
DDL (Data definition language): Define o modelo
dos dados
DML (Data Manipulation Language): Utilizada para
manipular os dados
SQL (Structured Query Languege): Combina
recursos de DDL e DML.
4
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Introdução - JDBC
SGBD (Sistema Gerenciador de Banco de Dados) é um
conjunto de dados que pode ser utilizado por intermédio
de um grupo de programas, proporcionando um
ambiente para armazenamento e recuperação de
informações;
O JDBC (Java Database Conectivity) é a API do Java que
contém os elementos necessários para que uma
aplicação Java possa acessar SGBD relacionais;
Utiliza extensivamente a SQL (Structured Query Language);
Esta API é composta pelos pacotes java.sql e javax.sql,
os quais fazem parte do JavaSE;
5
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Introdução - Objetivo
Com JDBC é possível:
Conectar-se em uma fonte de dados, mais comumente o
banco de dados
Enviar queries e updates para o banco de dados
Receber e processar os resultados provenientes de
consultas aos bancos de dados
6
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Introdução - Arquitetura JDBC
7
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Mapeamento de Tipos
Com JDBC, cabe ao programador escrever o código
para conectar-se ao banco de dados e, com auxílio
do SQL, deverão ser especificadas as operações de
consulta, inclusão, remoção ou alteração de dados;
O JDBC faz automaticamente o mapeamento de
tipos de dados existentes no banco de dados para
os tipos do Java (nativos ou classes específicas),
conforme mostrado na tabela a seguir;
9
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Introdução - Tabela de Mapeamento
de Tipos
10
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Introdução - Componentes do JDBC
É possível identificar quatro elementos centrais na
arquitetura JDBC:
Classes e interfaces da sua API (pacotes java.sql e javax.sql);
Suíte de testes de drivers, disponibilizada no site da Oracle, que
permite avaliar as funcionalidades e a compatibilidade de drivers
JDBC;
Drivers JDBC, que implementam, de fato, os mecanismos
padronizados de conexão e interação com cada SGBDR;
Ponte JDBC-ODBC, que possibilita o uso de drivers ODBC com
drivers JDBC, permitindo o uso de bancos de dados acessíveis
exclusivamente por meio do ODBC;
11
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Conexão - Classe Driver Manager
A utilização de um banco de dados requer uma conexão estabelecida
por meio de um driver adequado;
A classe DriverManager é responsável por administrar e selecionar tal
driver conforme o banco de dados específico, possibilitando efetuar a
conexão;
A solicitação de conexão com o banco de dados é feita através do
método getConnection (String), que recebe uma URL (Unified
Resource Locator) no padrão JDBC para indicar qual o SGBDR desejado;
try {
Connection con = DriverManager.getConnection
("jdbc:hsqldb:hsql://omega/ssolar");
} catch (SQLException e) {
//conexão não foi possível
}
12
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Conexão - URL
A API JDBC utiliza URLs para especificar qual SGBDR será
utilizado. Tais URLs tem a seguinte forma básica:
jdbc:<subprotocolo>:<subnome>
13
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Conexão - Exemplos de URLs JDBC
SGBDR URL
Derby jdbc:derby://hostname:1527/database
Firebird jdbc:firebirdsql://hostname:3050/database
HSQLDB jdbc:hsqldb:hsql://hostname:9001/database
ODBC jdbc:odbc:datasource
Oracle jdbc:oracle:thin@hostname:1526:database
MySQL jdbc:mysql://hostname/database
Postgre jdbc:postgresql://localhost/database
14
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Conexão - Driver JDBC
15
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Conexão - Carregamento do Driver
Para que a classe DriverManager possa selecionar o
driver adequado à conexão solicitada, é necessário que
sua classe tenha sido carregada pela JVM;
Para isso, utiliza-se o carregamento dinâmico do driver
por meio do método forName(String) da classe Class;
O nome da classe do driver é passada como argumento
para Class.forName(String), que realiza o carregamento
dinâmico do driver;
try {
//carregamento dinâmico da classe do driver
Class.forName("com.mysql.jdbc.Driver"); A classe do
Driver deve
} catch (ClassNotFoundException e) {
estar
System.out.println ("Driver não encontrado!"); acessível
System.exit(-1); por meio do
} classpath.
Este passo é necessário somente se
JVM for inferior a versão 6. Na versão
6 ou superior não é mais necessário.
16
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
API JDBC
Uma aplicação que necessita acessar um SGBDR deve utilizar várias
classes e interfaces da API JDBC par realizar as tarefas desejadas:
17
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Prática
Veremos como fazer:
Conexão;
Operação interativa;
Operação preparada;
Orientação a objetos e JDBC;
18
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Prática - Conexão
Considerando que o driver necessário para acessar o SGBDR
encontra-se carregado, é utilizada uma das versões do
método DriverManager.getConnection ();
Connection con = DriverManager.getConnection (url, user, pwd);
Uma aplicação pode possuir uma ou mais conexões com o
mesmo ou com diferentes bancos de dados;
O objeto retornado por DriverManager.getConnection ()
possui uma implementação dependente do driver e do banco
de dados, mas que realiza a interface java.sql.Connection;
19
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Prática - Conexão
Por padrão, a conexão é estabelecida no modo
auto-commit;
Para reverter, definir setAutoCommit(false). Neste caso, é
preciso usar explicitamente commit() ou rollback();
Uma vez que a conexão foi estabelecida com o
banco de dados, as operações sobre ele podem ser
realizadas de quatro formas diferentes: interativa,
em lote, preparada ou por procedimentos
armazenados;
20
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Prática - Exercício: Instalação e
conexão com MySQL
1º Passo: Baixar e instalar MySQL ou outro BD:
http://www.mysql.com/downloads/mysql/
(Community Edition)
2º Passo: Iniciar o cliente do MySQL
mysql –u root -p
3º Passo: Criar uma Database (Nome = exercicio)
create database exercicio
4º Passo: Criar uma tabela no Database e usá-la:
use exercicio
create table cliente (nome varchar(30), sobrenome
varchar(30));
Conexão Operação interativa Operação preparada OO e JDBC 21
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Prática - Exercício: Passos para instalação
e configuração de um SGBD
Não necessário na
usuário
5º Passo: Criar aplicação de exemplo Versão 6 do Java
public class JDBCExemplo1 {
23
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Prática - Exercício: Passos para instalação
e configuração de um SGBD
24
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Prática - Padronizando a obtenção da
conexão
Não é desejável que façamos a conexão ao banco de dados
no meio do código, como no exemplo anterior.
É um processo repetitivo. Portanto vamos utilizar um Design
Pattern para isso chamado Factory:
27
Conexão Operação
Universidade Federal do Paraná –interativa Operação
Linguagem Orientada a Objetospreparada OO e JDBC
– Prof. Rafael Romualdo Wandresen
Prática - Padronizando a obtenção da
conexão
As informações neste arquivo são definidas na forma nome=valor;
A recuperação das propriedades é feita por meio da classe
java.util.Properties;
Conteúdo do Arquivo DB.properties:
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/exercicio
db.user=root
db.pwd=senha
Leitura das propriedades:
Properties prop = new Properties ();
prop.load (new
FileInputStream(getClass().getResourceAsStream("/exerciciosloo/bancodados/banc
oDeDados.properties")));
String dbDriver = prop.getProperty("db.driver");
String dbUrl = prop.getProperty("db.url");
String dbUser = prop.getProperty("db.user");
String dbPwd = prop.getProperty("db.pwd");
28
Conexão Operação
Universidade Federal do Paraná –interativa Operação
Linguagem Orientada a Objetospreparada OO e JDBC
– Prof. Rafael Romualdo Wandresen
Prática - Padronizando a obtenção da
conexão
public class ConnectionFactoryComProperties {
public Connection getConnection() {
try {
Properties prop = new Properties();
prop.load(getClass().getResourceAsStream("/exerciciosloo/banc
odados/bancoDeDados.properties"));
String dbDriver = prop.getProperty("db.driver");
String dbUrl = prop.getProperty("db.url");
String dbUser = prop.getProperty("db.user");
String dbPwd = prop.getProperty("db.pwd");
Class.forName(dbDriver);
return DriverManager.getConnection(dbUrl, dbUser,
dbPwd);
} catch (ClassNotFoundException ex) {
throw new RuntimeException(ex);
} catch (IOException ex) {
throw new RuntimeException(ex);
} catch (SQLException ex) {
throw new RuntimeException(ex);
}}} Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen 29
Prática - Padronizando a obtenção da
conexão
public class JDBCExemploComConnectionFactory1 {
É importante:
o driver do banco de dados deve estar disponível via classpath no
momento da execução do programa;
o servidor do banco de dados deve estar em execução;
o banco de dados designado do arquivo Db.Properties deve existir;
30
Conexão Operação
Universidade Federal do Paraná –interativa Operação
Linguagem Orientada a Objetospreparada OO e JDBC
– Prof. Rafael Romualdo Wandresen
Padronizando a obtenção da conexão
Por que ler os atributos de um arquivo .properties?
Se houver modificação na URL de conexão, no dirver, no
usuário do banco de dados, na senha, você não precisará
recompilar o código.
É uma boa prática de programação deixar as
configurações em um arquivo e não dentro do código.
Importante:
Nossa classe ConnectionFactory ainda não está preparada
para uso em uma aplicação comercial.
Teríamos que implementar métodos para controlar um
pool de conexões.
Existem drivers que contém métodos prontos para isso.
31
Conexão Operação
Universidade Federal do Paraná –interativa Operação
Linguagem Orientada a Objetospreparada OO e JDBC
– Prof. Rafael Romualdo Wandresen
Prática - Operação interativa
A operação interativa sobre o banco de dados
se faz por meio da interface
java.sql.Statement, que permite o envio de
comandos SQL estáticos;
Por meio do método createStatement()
disponível na interface Connection, é possível
obter um objeto que implementa esta
interface;
Statement stmt = con.createStatement();
Conexão Operação interativa Operação preparada OO e JDBC
32
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Prática - Operação interativa
Comandos de Atualização
Quando os comandos SQL enviados ao banco de dados
através de objetos Statement são capazes de produzir
alterações (INSERT, UPDATE, DELETE, ou outros
comandos DDL), deve-se utilizar o método
executeUpdate(String):
String cmd = “INSERT INTO elementos VALUES (‘He’, ‘Hélio’, 2,
4.003, 0.179)”;
int result = stmt.executeUpdate(cmd);
35
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Prática - Exemplo de Operação
interativa Consultas
public class JDBCExemplo2 {
public static void main(String[] args) throws SQLException,
ClassNotFoundException {
Connection conexao = new
ConnectionFactoryComProperties().getConnection();
java.sql.Statement stmt = conexao.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM CLIENTE
WHERE SOBRENOME=\"Wandresen\"");
while(rs.next()){
System.out.println("------");
System.out.println(rs.getString(“nome"));
System.out.println(rs.getString(2));
}
System.out.println("------");
System.out.println("Fim Lista!");
conexao.close();
}
}
Conexão Operação interativa Operação preparada OO e JDBC
36
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Prática - Operação interativa
Consultas
Como padrão, ResultSet não é atualizável e só pode ser
navegado à frente;
O método next() avança para o próximo registro;
Em qualquer linha válida, podem ser usados os métodos
de acesso para leitura dos valores das colunas do
ResultSet:
while(rs.next()){
System.out.println("------");
System.out.println(rs.getString(“nome"));
System.out.println(rs.getString(2));
}
39
Conexão Operação
Universidade Federal do Paraná – interativa Operação
Linguagem Orientada a Objetos preparada OO e JDBC
– Prof. Rafael Romualdo Wandresen
Prática - Operação Interativa
Consultas Navegáveis
Também é possível solicitar a criação de um objeto ResultSet navegável
(scrollable), informando as características desejadas na criação do
objeto Statement:
Statement stmt = con.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery (“SELECT nome, telefone FROM clientes”);
40
Conexão
Universidade Federal Operação
do Paraná –interativa Operação
Linguagem Orientada a Objetospreparada Tabela
– Prof. Rafael Romualdo de Dados
Wandresen
Prática - Operação Interativa
Exemplo Consultas Navegáveis
public class JDBCExemplo3 {
public static void main(String[] args) throws SQLException,
ClassNotFoundException {
Connection conexao = new
ConnectionFactoryComProperties().getConnection();
java.sql.Statement stmt =
conexao.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery("SELECT * FROM CLIENTE WHERE
SOBRENOME=\"Wandresen\"");
while(rs.next()){
System.out.println("------");
System.out.println(rs.getString("nome"));
System.out.println(rs.getString(2));
}
System.out.println("------");
System.out.println("Fim Lista!");
//Volta ao primeiro da lista
rs.first();
System.out.println("Nome do Primeiro da
lista:"+rs.getString(1)+" " +rs.getString(2));
conexao.close();
} 41
} Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Prática - Operação Interativa
Consultas Atualizáveis
Um objeto ResultSet pode ser atualizável, permitindo
que alterações realizadas em seus resultados sejam
refletidas nas tabelas de origem dos dados;
A seleção do método de escrita deve ser apropriada ao
tipo da coluna:
updateInt, updateFloat, updateString...
Após a chamada do método de escrita, deve-se chamar
updateRow() para efetivar as alterações no banco de
dados;
cancelRowUpdates() cancela as alterações;
Registros podem ser eliminados e incluídos através de
chamadas a deleteRow() e
moveToInsertRow()/insertRow();
42
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Prática - Operação Interativa
Consultas Atualizáveis
public class JDBCExemplo4 {
public static void main(String[] args) throws SQLException,
ClassNotFoundException {
Connection conexao = new
ConnectionFactoryComProperties().getConnection();
Statement stmt = conexao.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT * FROM CLIENTE2 WHERE
SOBRENOME=\"Wandresen\"");
while(rs.next()){
System.out.println("------");
System.out.println(rs.getString("nome"));
System.out.println(rs.getString(3));
}
System.out.println("------");
System.out.println("Fim Lista!");
//Volta ao primeiro da lista
rs.first();
//Atualiza o primeiro da lista
rs.updateString(2, "Rafael Romualdo");
rs.updateRow();
//Imprime o primeiro da lista
System.out.println("Nome do Primeiro da lista:"+rs.getString(1)+" "
+rs.getString(2));
conexao.close();
}} 43
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Prática - Operação Preparada
Um objeto do tipo PreparedStatement permite
definir um comando SQL que será pré-compilado no
SGBDR, permitindo sua execução eficiente;
O comando SQL preparado pode conter um ou mais
parâmetros de entrada, representados pelo símbolo
de ? (interrogação);
Os parâmetros de entrada devem ser fornecidos
antes de cada execução do comando SQL
preparado;
Conexão Operação interativa Operação preparada OO e JDBC
44
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
Prática - Operação Preparada
O comando a ser preparado deve ser fornecido
na criação do objeto PreparedStatement:
String sql = “INSERT INTO contatos (nome, re, prof)
VALUES (?, ?,?)”
PreparedStatement pstmt = con.prepareStatement(sql);
45
Conexão Operação
Universidade Federal do Paraná – interativa Operação
Linguagem Orientada a Objetos preparada OO e JDBC
– Prof. Rafael Romualdo Wandresen
Prática - Operação Preparada
Cada tipo de parâmetro dispõe de um
método específico para ajuste, de prefixo set,
que recebe o número do parâmetro e o seu
valor;
A execução do comando preparado deve ser
realizada de acordo com a operação:
int re = pstmt.executeUpdate();
ResultSet rs = pstmt.executeQuery();
46
Conexão Operação
Universidade Federal do Paraná – interativa Operação
Linguagem Orientada a Objetospreparada OO e JDBC
– Prof. Rafael Romualdo Wandresen
Prática - Exemplo Operação
Preparada
public class JDBCPreparedStatement {
public static void main(String[] args) throws SQLException,
ClassNotFoundException {
Connection conexao = new
ConnectionFactoryComProperties().getConnection();
PreparedStatement pstmt = conexao.prepareStatement("INSERT INTO
CLIENTE2 (NUMERO,NOME,SOBRENOME) VALUES(?,?,?)");
Scanner sc = new Scanner(System.in);
while(true){
System.out.println("Insira numero, nome e sobrenome (Para
encerrar digite \"S\" no nome ou sobrenome:");
int numero = sc.nextInt();
String nome = sc.next();
String sobrenome = sc.next();
if(nome.equals("S")||sobrenome.equals("S"))
break;
pstmt.setInt(1, numero);
pstmt.setString(2, nome);
pstmt.setString(3, sobrenome);
pstmt.executeUpdate();
}
pstmt.close();
System.out.println("Fim da inclusão");
conexao.close();
}
} 47
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
OO e JDBC
Os comandos SQL até agora estão misturados na
lógica de negócio
Isto não é desejável. O ideal é separarmos a lógica
e o acesso ao banco de dados em classes
diferentes.
Como fazemos isso?
JavaBeans: São classes que possuem o construtor sem
argumentos e métodos de acesso do tipo get e set para
acesso aos seus atributos. (Não confundir com Enterprise
JavaBeans)
DAO (Data Access Objects): Pattern que separa o acesso
ao banco de dados da lógica de negócios.
48
Conexão Operação
Universidade Federal do Paraná –interativa Operação
Linguagem Orientada a Objetos preparada OO e JDBC
– Prof. Rafael Romualdo Wandresen
OO e JDBC – Exemplo 1
Preparação
Criar uma classe
create table contatos (
id BIGINT NOT NULL AUTO_INCREMENT,
nome VARCHAR(255),
email VARCHAR(255),
endereco VARCHAR(255),
dataNascimento DATE,
primary key (id)
);
49
Conexão Operação
Universidade Federal do Paraná –interativa Operação
Linguagem Orientada a Objetos preparada OO e JDBC
– Prof. Rafael Romualdo Wandresen
OO e JDBC – Exemplo 1
Preparação: Criar a classe para representar a entidade de negócio
public class Contato {
private Long id;
private String nome;
private String email;
private String endereco;
private Calendar dataNascimento;
public Contato() {
}
public Calendar getDataNascimento() {
return dataNascimento;
}
public void setDataNascimento(Calendar dataNascimento) {
this.dataNascimento = dataNascimento;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}....
}
50
Conexão Operação
Universidade Federal do Paraná –interativa Operação
Linguagem Orientada a Objetos preparada OO e JDBC
– Prof. Rafael Romualdo Wandresen
OO e JDBC – Exemplo 1
public class ContatoDAO {
private String sql = "insert into contatos
(nome,email,endereco,dataNascimento) values
(?,?,?,?)";
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
OO e JDBC – Exemplo 2
Aplicação Autor/Livro
Uma biblioteca possui um sistema para gerenciar
seus livros. Os livros e autores são entidades
separadas. Um livro pode ser escrito por diversos
autores e um autor pode escrever diversos livros. A
relação no banco de dados é muitos para muitos.
53
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen
OO e JDBC- Exemplo 2
O mapeamento para o diagrama de classes fica
assim:
54
Universidade Federal do Paraná – Linguagem Orientada a Objetos – Prof. Rafael Romualdo Wandresen