Você está na página 1de 47

Integrao com Banco de Dados usando JDBC

Introduo

Diferentes bancos de dados relacionais possuem diferentes formas de se comunicar com uma aplicao que necessite acessar os seus dados.

Problema: codificao e manuteno nas aplicaes que


precisam trabalhar com diversos banco de dados e tambm requer o aprendizado de uma nova API para cada BD diferente. Isso no torna a aplicao flexvel. 2012
POS-DAW - Bacal 2

Soluo

Sun desenvolveu a API JDBC, com a inteno de uniformizar os acessos aos diferentes bancos de dados relacionais, dando maior flexibilidade aos sistemas.

Com JDBC as chamadas ao BD so padronizadas, apesar de que os comandos SQL podem variar de banco para banco, se no for usado o SQL padro.
2012 POS-DAW - Bacal 3

Acesso a bancos de dados

Aplicaes Java podem usar JDBC (Java Database Connectivity) e integrar-se com um banco de dados relacional

JDBC API

framework para manipular os dados armazenados em um banco de dados relacional Responsvel por gerenciar os drivers especficos de acesso a base de dados Corresponde ao driver especfico para tratar com as requisies e respostas ao SGBD.
POS-DAW - Bacal 4

JDBC Driver Manager

JDBC Driver

2012

Arquitetura JDBC

2012

POS-DAW - Bacal

API

2012

POS-DAW - Bacal

Arquitetura da API JDBC

2012

POS-DAW - Bacal

Cenrio1 : cliente-servidor

2012

POS-DAW - Bacal

Cenrio 2: 2-tier

2012

POS-DAW - Bacal

Cenrio 3: 2-tier+

2012

POS-DAW - Bacal

10

Cenrio 4: 3-tier

2012

POS-DAW - Bacal

11

Principais classes da API JDBC

DriverManager - gerencia o driver e cria uma conexo com o banco. Connection - a classe que representa a conexo com o bando de dados. Statement - controla e executa uma instruo SQL . PreparedStatement - controla e executa uma instruo SQL. melhor que Statement. ResultSet - contm o conjunto de dados retornado por uma consulta SQL. ResultsetMetaData - a classe que trata dos metadados do banco.
POS-DAW - Bacal 12

2012

Processo bsico para utilizar o JDBC


1.

2.
3. 4. 5. 6. 7.

Carregar o driver JDBC Obter uma conexo com o banco de dados Preparar os dados para consulta Executar a consulta Obter e verificar os resultados Formatar a sada para o usurio Ao finalizar a aplicao, fechar a conexo
POS-DAW - Bacal 13

2012

Carregar e registrar um driver JDBC

Driver geralmente uma classe Java. Assim, so disponibilizados como arquivos .jar

Exemplo:

Driver: Mysql connector. Pacote: mysql-connector-java-3.1.12-bin.jar Classe: com.mysql.jdbc.Driver

Comando usado para carga de uma classe Java

Class.forName( nome_classe_driver );

2012

POS-DAW - Bacal

14

Tipos de Drivers

Tipo 1 - Driver Ponte JDBC-ODBC

uma implementao nativa que conecta uma aplicao Java a um banco de

dados atravs de ODBC configurado na mquina. Tipo 2 - Driver API-Nativa Parcialmente Java

uma casca sobre uma implementao nativa de um driver de acesso ao banco (ex: este driver utiliza o OCI para Oracle). Um erro neste driver nativo pode derrubar a JVM. Utiliza um middleware para a conexo com o banco de dados. Driver totalmente implementado em Java. Conhece todo o protocolo de comunicao com o BD e pode acessar o BD sem software extra. o tipo de driver mais indicado.

Tipo 3 - Driver Java c/ Net-Protocol

Tipo 4 - Driver Java Puro

2012

POS-DAW - Bacal

15

Carregar e registrar um driver JDBC

Vrios drivers podem ser carregados com o mtodo Class.forName.

Na verso 3 do JDBC (Java 5 ou anterior), obrigatrio a carga do driver, pois s assim sua aplicao sabe como interpretar os comandos SQL. Por exemplo:

Class.forName ("oracle.jdbc.driver.OracleDriver"); Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");

a JVM precisa encontrar estas classes

para aplicaes (console), a varivel de ambiente CLASSPATH deve incluir os drivers; para aplicaes web, a biblioteca JAR deve estar disponvel na pasta lib para applets, o parmetro archive deve apontar para o driver

2012

POS-DAW - Bacal

16

Obter uma conexo com o banco de dados

So necessrios trs elementos (depende do BD):

URL: utilizada para identificar a base de dados e o driver jdbc:<subprotocol>:<subname> Nome de usurio: identifica o usurio Senha de acesso: senha para o acesso

Pode-se usar java.sql.DriverManager e obter a conexo da forma tradicional

Connection con = DriverManager.getConnection (url, usr, senha);


POS-DAW - Bacal 17

2012

DriverManager

O DriverMaganer manipula os Drivers informados. Possui mtodos para


registrar um driver, remover ou listar todos.

utilizado para recuperar uma conexo baseando-se em parmetros. Exemplo:


Connection con = DriverManager.getConnection( jdbc:mysql://nome_do_servidor/nome_do_database, root, senha);

2012

POS-DAW - Bacal

18

Connection

Conexo fsica com o SGBD. Sintaxe fornecida pelo fabricante, mas todas so similares. Exemplos:

jdbc:odbc:anuncios jdbc:oracle:thin:@200.206.192.216:1521:exemplo jdbc:mysql://alnitak.orion.org/clientes jdbc:cloudscape:rmi://host:1098/MyDB;create=true

2012

POS-DAW - Bacal

19

Conexo com o BD

A abertura da conexo feita pelo mtodo getConnection, que recebe uma URL (Universal Resource Location) como argumento

O DriverManager tenta conectar com o primeiro driver carregado, seno consegue, tenta o driver seguinte JDBC URLs so formadas por:

um protocolo (normalmente jdbc), um sub-protocolo (normalmente o tipo de driver) e informaes para o SGBD.

2012

POS-DAW - Bacal

20

Tipos de conexo

Bridge ODBC:

Connection conn = DriverManager.getConnection ("jdbc:odbc:Sample", "admin", "temp"); o servio Sample tem que estar configurado no ODBC manager da mquina

protocolo nativo com driver Java para o banco MySQL:

Connection conn = DriverManager.getConnection ("jdbc:mysql://host:1521/test?user=demo&password=sec");

2012

POS-DAW - Bacal

21

Resumo de Conexes em BD
Banco
MySQL

Driver (padro)
com.mysql.jdbc.Driver

Conexo padro
jdbc:mysql://hostNAME:3306/nomeBD

PostgresSQL org.postgresql.Driver
HSQLDB MS Access org.hsqldb.jdbcDriver sun.jdbc.odbc.JdbcOdbcDriver

jdbc:postgresql://hostNAME/nomeBD
jdbc:hsqldb:MODO/nomeBD MODO=file, server, etc. jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:/diretorio/nomeBD.mdb

SQL Server

com.microsoft.jdbc.sqlserver.S QLServerDriver oracle.jdbc.driver.OracleDriver

jdbc:microsoft:sqlserver://hostname/nomeBD

Oracle

jdbc:oracle:thin:@hostNAME:1521:nomeBD
22

Preparar e executar consultas


1.

Statements (java.sql.Statement)

Executa uma instruo SQL fixa e retorna um resultado. Por padro, somente um resultado pode permaner aberto por consulta. Executa uma instruo SQL pr-compilada. Fornece meios para passagem de parmetros para essa instruo.

2.

PreparedStatements (java.sql.PreparedStatement)

3.
2012

CallableStatements (java.sql.CallableStatement)

Executa SQL stored Procedure


POS-DAW - Bacal 23

Statement

Meios para passar comandos ao SGBD.

Statement stmt = con.createStatement();

para enviar instrues ao SGBD podemos usar os mtodos :


execute(), executeQuery(), executeBatch() e executeUpdate()


POS-DAW - Bacal 24

2012

Statement

boolean execute(String sql);

Executa uma operao SQL que pode retornar diversos resultados.


Executa uma operao SQL que retorna dados como resultados. Esses dados devem ser armazenados em um objeto ResultSet para serem manipulados.

ResultSet executeQuery(String sql);

2012

POS-DAW - Bacal

25

Statement

boolean executeBatch(String sql);

Executa vrias operaes SQL acessando apenas uma vez o BD.


Executa uma operao SQL que retorna o nmero de linhas afetadas. Utilizado para operaes SQL que no devem retornar dados (insero, deleo ou atualizao) ou ainda para funes de manipulao (criao de tabelas, ...). .
POS-DAW - Bacal 26

int executeUpdate(String sql);

2012

Statement

O exemplo abaixo se conecta ao banco de dados local, na instncia orcl e cria uma tabela chamada PESSOA, com os campos ID e NOME.

2012

Atravs do mtodo createStatement() de Connection retornado um objeto Statement, que usado para executar um comando SQL no BD. O mtodo executeUpdate() de Statement recebe o SQL que ser executado. Este mtodo deve ser usado para DDLs e comandos SQL de INSERT, UPDATE ou DELETE. Depois os mtodos close() de Statement e Connection so invocados para liberar os recursos. POS-DAW - Bacal 27

Statement

O objeto Statement criado pode ser reusado vrias vezes para executar diferentes comandos SQL. Isto at recomendado.

Statement s pode ser liberado com o mtodo close() ao final das execues de todos os comandos SQL.
2012 POS-DAW - Bacal 28

Enviando instrues
stmt.execute(CREATE TABLE Pessoa + (id MEDIUMINT NOT NULL AUTO_INCREMENT + , nome varchar(50) + , endereco varchar(50) + , telefone varchar(20) + , cpf varchar(20) + , PRIMARY KEY(id) ) ); int quantidadeDeRegistros = stmt.executeUpdate(INSERT INTO + PESSOA (nome, endereco, telefone, cpf) + VALUES + (Silvio Jr', Rua X, n 23', 32116968', 12345678900') );

2012

POS-DAW - Bacal

29

Obter e verificar os resultados

A recuperao de dados do BD trivial e feita atravs da execuo de uma query SQL, e os dados podem ser recuperados atravs da interface ResultSet, retornada na execuo da query.

executeQuery() executa uma query SQL e retorna um objeto ResultSet, que contm os dados recuperados. Atravs do mtodo next(), o cursor interno movido para o prximo registro. O mtodo retorna false caso no existam mais registros ou true caso contrrio. Os valores dos registros podem ser recuperados como o mtodo getString(), que recebe o nome do campo ou seu alias.
POS-DAW - Bacal 30

2012

ResultSet

2012

Tabela de dados que representa um conjunto resposta a uma consulta ao banco de dados. Mantm um cursor apontando para a linha atual de dados Inicialmente esse cursor no aponta para nenhuma linha Por padro, a movimentao do cursor somente para frente e os dados no podem ser atualizados diretamente no ResultSet. O objeto ResultSet automaticamente fechado se o objeto Statement que o gerou fechado. Fornece mtodos para obter os dados da linha selecionada.
POS-DAW - Bacal 31

ResultSet - Exemplos

2012

POS-DAW - Bacal

32

ResultSet

ResultSet dispe de outros mtodos para recuperar os dados do BD diretamente nos tipos mais adequados Todos os mtodo recebem o nome do campos (ou alias) ou o nmero do campo no select, comeando por 1 (um).

2012

POS-DAW - Bacal

33

ResultSet - Comandos

boolean absolute(int row): move o cursor para o registro especificado void close(): fecha o ResultSet e libera o BD. boolean first(): move o cursor para o primeiro registro do ResultSet boolean last(): move o cursor para o ltimo registro do ResultSet boolean next(): move o cursor para o prximo registro boolean previous(): move o cursor para o registro anterior Funes getTYPE (int columnIndex) ou getTYPE (String columnName)

Obtm o valor do campo especificado pelo ndice ou pelo nome da coluna do registro corrente.
POS-DAW - Bacal 34

2012

Adicionando Parmetros

Geralmente os comandos SQL recebem valores externos para trabalhr com dados dinmicos na aplicao. Com Statement, isso feito concatenando o valor ao comando SQL.

2012

apesar de ser correta, no a melhor e nem a mais indicada. Torna o trabalho de concatenao chato e passvel de erros na montagem do comando SQL, alm de permitir que outros comandos SQL sejam embutidos e executados maliciosamente. A melhor maneira , certamente, trocar o uso de Statement por PreparedStatement.
POS-DAW - Bacal 35

PreparedStatement

PreparedStatement tem vantagens sobre Statement, pois ela cria instrues SQL prcompiladas, economizando recursos do prprio banco de dados, otimizando o programa. Alm da facilidade de se adicionar parmetros aos comandos SQL.

2012

POS-DAW - Bacal

36

PreparedStatement

Os parmetros, com PreparedStatement, podem ser passados diretamente com o prprio tipo que o dado foi definido, evitando assim ter que ficar formatando ou convertendo campos de data e decimais, alm de poder passar inclusive valores nulos (NULL)..

2012

POS-DAW - Bacal

37

Controle de Transaes

A interface Connection oferece mtodos para o controle transacional. Primeiro necessrio definir o auto-commit como false. Para confirmar a transao o mtodo commit() deve ser invocado. O mtodo rollback() desfaz a transao.

2012

POS-DAW - Bacal

38

Acessando Procedures

Algumas empresas possuem grande parte do seu cdigo legado em Stored Procedures, e trocar estas SPs por Java seria muito caro, portanto mais adequado utilizar o que j existe. As chamadas a Stored Procedures so possveis por meio da interface CallableStatement. O exemplo abaixo executa uma simples procedure no BD, sem parmetros e sem retorno.

2012

POS-DAW - Bacal

39

Acessando Procedures

Geralmente as Stored Procedures recebem argumentos e tambm retornam valores atravs desses argumentos. Isso tudo possvel com a CallableStatement. O exemplo abaixo passa dois parmetros de entrada para a procedure. O segundo exemplo passa um argumento de entrada e recupera ao segundo argumento, do tipo DATE.

2012

POS-DAW - Bacal

40

Acessando Procedures

As Stored Procedures (ou Functions) ainda podem retornar valores e cursores com dados.

2012

POS-DAW - Bacal

41

Tratamento de Erros

Quase todos os mtodos da API JDBC podem lanar uma exceo do tipo SQLException, que representa algum tipo de erro ocorrido no acesso ao banco, seja falha na conexo, SQL mal formado, at violao de PK etc. A classe SQLException possui os mtodos:

2012

getMessage() - retorna a mensagem de erro. getSQLState() - retorna um dos cdigos de estado do padro ANSI-92 SQL. getErrorCode() - retorna o cdigo de erro especfico do fornecedor. getNextException() - retorna a exceo aninhada (encadeada), se houver. POS-DAW - Bacal 42

Tratamento de Erros - Exemplos

2012

POS-DAW - Bacal

43

Servlet que faz um SELECT em banco

Para tornar um servlet capaz de acessar bancos de dados, basta incluir cdigo JDBC dentro dele

2012

POS-DAW - Bacal

44

Servlet que usa DAO

Misturar cdigo de servlet com banco de dados no uma boa idia. O ideal disponibilizar uma interface independente de banco para o servlet

2012

POS-DAW - Bacal

45

Exemplo de DAO

O DAO um objeto que isola o servlet da camada de dados, deixando-o vontade para mudar a implementao Faa-o sempre implementar uma interface Java

2012

POS-DAW - Bacal

46

Exerccio
1.

Implemente uma aplicao Web de leilo com as seguintes funcionalidades, armazenando tudo usando JDBC

Iniciar Leilo: informar o produto e lance mnimo Registrar Lances: informar o nome da pessoa e o valor do lance. S aceitar se for maior que o lance atual Fechar Lote: encerra o leilo do produto no lote (no aceita mais lances) e emite a relao dos lances e o vencedor (lance e nome da pessoa) Emitir Lote finalizado: emite a relao dos lances e o vencedor (lance e nome da pessoa)

2012

POS-DAW - Bacal

47