Conexão com Bancos de Dados
Carlos Bazilio
Depto de Ciência e Tecnologia
Pólo Universitário de Rio das Ostras
Universidade Federal Fluminense
Noção Geral
●
●
●
●
A aplicação chama a biblioteca JDBC
A biblioteca carrega o driver que “entende” o
SGDB
Após, a aplicação pode se conectar e enviar
requisições ao SGBD
Pacote principal: java.sql
JDBC
●
Java Database Connectivity;
●
Padrão de acesso a BD’s relacionais através de Java:
●
●
●

API comum;

Os fabricantes de drivers JDBC implementam
aspectos específicos;
Qualquer aplicação Java pode acessar um SGBD
através do JDBC;
JDBC é semelhante ao ODBC, mas é escrito em
Java.
"http://java.sun.com/javase/6/docs/api/java/sql/packag
e-summary.html"
JDBC – Tipos de drivers
●
Classe 1: Ponte ODBC-JDBC: Aplicações para
Windows com o BD registrado;
JDBC – Tipos de drivers –
Classe 1
●
●
●
●
ODBC fornece uma interface uniforme para que
aplicações em Windows acessem bancos de
dados de fornecedores diferentes;
O JDK é distribuído com um driver desse tipo;
Uma aplicação que utilize este drive se
comunica indiretamente com o banco de dados
através da ponte JDBC-ODBC;
Este uso requer código nativo de acesso ao
banco na máquina cliente.
JDBC – Tipos de drivers
●
Classe 2: Acesso nativo: Usa as bibliotecas
client do SGBD;
Aplicação
JDBC Driver Manager
API Nativa do Banco
Banco
de
Dados
JDBC – Tipos de drivers –
Classe 2
●
●
●
Drivers híbridos, parcialmente escritos em
Java, mas que também utilizam código nativo;
Usualmente, são drivers nativos com um
wrapper Java;
Por utilizarem código nativo, também são
menos portáveis.
JDBC – Tipos de drivers
●
Classe 3: Acesso por middleware: Não há
necessidade de configuração da máquina
cliente. A aplicação se comunica com o
middleware através de sockets. O middleware
converte a chamada de alto nível da API na
chamada ao SGBD;
Aplicação
JDBC Driver Manager
Rede
Middleware
ou Servidor
Banco
de
Dados
JDBC – Tipos de drivers –
Classe 3
●
●
●
Chamadas ao banco de dados através da rede,
utilizando HTTP;
A interação real com o banco de dados estaria
entre os servidores de middleware e banco de
dados;
A aplicação é 100% Java.
JDBC – Tipos de drivers
●
Classe 4: Acesso direto ao servidor utilizandose o protocolo do próprio SGBD;
Aplicação
JDBC Driver Manager
Rede
Banco
de
Dados
JDBC – Tipos de drivers –
Classe 4
●
●
●
Drivers 100% Java;
São portáveis e mais eficientes se comparados
com os que exigem tradução;
Diferentemente dos drivers da classe 3, estes
implementam o acesso ao servidor utilizando
bibliotecas da própria linguagem Java.
JDBC
●
5 passos básicos:

●
Registrar o driver na aplicação
 Conectar no SGBD
 Executar sentenças SQL e procedures
 Processar o resultado recebido
 Fechar a conexão
Principais classes da API:

●
DriverManager, Connection, Statement, ResultSet
Referência:
http://java.sun.com/javase/6/docs/api/java/sql/package
-summary.html
JDBC – Passos Básicos
●
Registro do driver: O driver é registrado
automaticamente quando a classe é carregada
na aplicação;

Class.forName("org.postgresql.Driver"); //
PostgreSQL

Class.forName("com.mysql.jdbc.Driver"); // MySQL
●
Inicializador estático que registra o driver
JDBC – Passos Básicos
●
Conexão com o SGBD: Após o registro do driver,
precisamos fornecer informações ao DriverManager
para a conexão;

Connection con = DriverManager.getConnection(url, login,
senha);
●
url: URL de conexão JDBC


jdbc:postgresql://localhost: 5432/cursodb
jdbc:mysql://localhost:3306/cursodb
●
login: usuário com direitos de acesso ao banco de dados;
●
senha: senha para autenticação.
●
Sintaxe geral de urls:
“jdbc:<subprotocol>://<server>:<port>/<database>”
JDBC – Passos Básicos
●
Execução de sentenças SQL

Para a execução de sentenças devemos criar, por
exemplo, um Statement e obter o resultado através
de um ResultSet;
●
●

Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(“select * from
db.empregados e”);
Neste caso, o resultado é armazenado num
ResultSet e pode ser percorrido com métodos
definidos nesta classe
JDBC – Passos Básicos
●
Exemplo de estrutura básica de uma aplicação
import java.sql.*;
public class AcessoBDSimples {
public static void main(String[] args) {
try {
Class.forName("org.postgresql.Driver");
Connection con = (Connection)
DriverManager.getConnection
("jdbc:postgresql://localhost:5432/cursodb","bazilio","bazilio");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from prod p;")
while (rs.next()) {
System.out.print("Nome: " + rs.getString("PNAME"));
System.out.println("Cidade: " + rs.getString("CITY"));
}
stmt.close(); con.close();
} catch (ClassNotFoundException e) {
System.out.println("A classe do driver de conexão
não foi encontrada!");
} catch (SQLException e) {
System.out.println("O comando SQL não pode ser
executado!");
}
}
}
Alternativas para Criação de
Sentenças
●
●
Statement: executa consultas simples, sem parâmetros
Prepared Statement: executa consultas pré-compiladas com ou
sem parâmetros
PreparedStatement modificaTabela = con.prepareStatement ("UPDATE
TABELA SET CAMPO1 = ? WHERE CAMPO2 LIKE ? ");
modificaTabela.setInt(1, 75);
modificaTabela.setString(2, “Sirius”);
modificaTabela.executeUpdate();
●
Callable Statement: executa chamadas à stored procedures
CallableStatement cs = con.prepareCall ("{call NOME_PROC}");
ResultSet rs = cs.executeQuery()
Exercício
●
Gere 1 tabela contendo os dados básicos de
uma conta, insira manualmente (no SGBD)
alguns clientes e liste estes clientes utilizando
um programa em Java.
Padrões de Projeto
●
●
●
Um padrão de projeto é uma solução comum
para um problema comum encontrado no
desenvolvimento de software (Sun);
Sedimentação do conceito com o lançamento
do livro: “Design Patterns: Elements of
Reusable Object-Oriented Software”;
Não está amarrado à nenhuma linguagem OO.
Padrões de Projeto
(GoF – Gang of Four)
Padrões de Projeto
●
●
A utilização desses padrões usualmente implica em
algumas vantagens:

Facilidade de comunicação: padrões possuem nomes, os
quais resumem uma solução que deve ser de conhecimento
comum entre equipes de desenvolvimento;

Credibilidade: sua implementação estará utilizando soluções
amplamente testadas e aprovadas;

Facilidade de manutenção: padrões tendem a reduzir o
acoplamento entre componentes, o que implica num
sistema de fácil manutenção
Não implica em códigos “mais enxutos”
Padrões de Projeto –
Exemplo: Façade (Facade,
Fachada)
Exemplo de Uso do Façade
Exemplo de Uso do Façade
import java.util.*;
/** "Façade" */
class UserfriendlyDate {
GregorianCalendar gcal;
public UserfriendlyDate(String dataGreg) {
String[] a = dataGreg.split("-");
gcal = new GregorianCalendar(Integer.valueOf(a[0]).intValue(),
Integer.valueOf(a[1]).intValue()-1, Integer.valueOf(a[2]).intValue());
}
public void addDays(int days) { gcal.add(Calendar.DAY_OF_MONTH, days); }
public String toString() {
return new Formatter().format("%1$tY-%1$tm-%1$td", gcal).toString();}
}
/** "Client" */
class FacadePattern
{
public static void main(String[] args)
{
UserfriendlyDate d = new UserfriendlyDate("1980-08-20");
System.out.println("Date: "+d);
d.addDays(20);
System.out.println("20 days after: "+d);
}
}
Padrões de Projeto
●
Usualmente são apresentados seguindo uma
estrutura bem definida, como:



●
Nome do padrão para facilitar a citação
Descrição do uso, apresentando o problema,
contextualização e implicações
Solução para o problema apresentado, usualmente
apresentada no formato de diagramas
Exemplo:



Nome: Façade
Descrição: Necessário quando temos um conjunto de
subsistemas e algumas funcionalidades como combinação
destes subsistemas
Solução
Padrões de Projeto
Livro do GoF
●
Creational Patterns

●
Structural Patterns

●
Factory, Abstract Factory, Singleton, Builder,
Prototype
Adapter, Bridge, Composite, Decorator, Façade,
Flyweight, Proxy
Behavioral Patterns

Chain of Responsibility, Command, Interpreter,
Iterator, Mediator, Momento, Observer, State,
Strategy, Template, Visitor
Padrões J2EE
●
●
●
●
Inspiraram o surgimento de diversos “novos”
padrões, os quais são comumente associados
à linguagem Java
Entretanto, assim como os da GoF, não estão
amarrados à nenhuma linguagem OO
específica
http://www.corej2eepatterns.com/Patterns2ndE
d/index.htm
Destes, podemos destacar o DAO (Data
Access Object)
Padrões de Projeto - DAO
●
●
●
●
Visa a separação entre a lógica de acesso a dados da
lógica do negócio;
Com este padrão podemos utilizar diferentes fontes
de dados e isolar a lógica de negócio de possíveis
modificações na camada de acesso a dados;
Ou seja, um DAO deve esconder todos os detalhes de
implementação de acesso a fontes de dados.
Pode ser utilizada em diversos cenários (web,
desktop, mobile, em aplicação distribuída ou
centralizada)
Padrões de Projeto - DAO
DAO em Java
●
Neste caso, o padrão DAO é bastante útil para
separar a lógica de negócio das diversas
tecnologias de persistência existentes:

●
JDBC, JDO, EJB CMP, TopLink, Hibernate, iBATIS,
openJPA e muitas outras
Ou seja, com este padrão permitimos que estas
tecnologias possam ser substituídas ou
atualizadas sem prejuízo ao restante da
aplicação
Download

Conexão com Bancos de Dados