Issuu on Google+

Objetivos O objetivo deste apresentação é oferecer uma introdução a JDBC para desenvolver aplicações que utilizem banco de dados. Tópicos abordados

Java JDBC

Arquitetura JDBC Drivers Conexão Operações para Manipulação de Dados

Osmar de Oliveira Braz Junior

Inclusão, Exclusão, Alteração e Consulta 1

JDBC

2

JDBC

JDBC é uma interface baseada em Java para acesso a bancos de dados através de SQL. Pacote Java padrão: java.sql Baseada em ODBC

Usando JDBC, pode-se obter acesso direto a bancos de dados através de applets e outras aplicações Java Este módulo apresenta uma introdução ao JDBC suficiente para o desenvolvimento de aplicações com banco de dados.

JDBC é uma interface de nível de código. O pacote java.sql consiste de um conjunto de classes e interfaces que permitem embutir código SQL em métodos. Com JDBC possível construir uma aplicação Java para acesso a qualquer banco de dados SQL. O banco deve ter pelo menos um driver ODBC, se não tiver driver JDBC

Para usar JDBC é preciso ter um driver JDBC O JDK distribui um driver ODBC que permite o acesso a bancos que não suportam JDBC mas suportam ODBC

3

Pacote java.sql

4

Tipos de Drivers Tipo 1 usam uma ponte para ter acesso a um banco de dados. Este tipo de solução requer a instalação de software do lado do cliente.(ultimo caso, restrito a plataforma windows).

Tipo 2 usam uma API nativa. Esses drivers contém métodos Java implementados em C ou C++. Pode precisar de software no cliente.

Tipo 3 oferecem uma API de rede via middleware que traduz requisições para API do driver desejado. Não requer software no cliente.

Tipo 4 drivers que se comunicam diretamente com o banco de dados usando soquetes de rede. É uma solução puro Java. Não requer código adicional do lado do cliente. 5

6

1


Arquitetura JDBC

URL JDBC Uma aplicação JDBC pode carregar ao mesmo tempo diversos drivers. Para determinar qual driver será usado usa-se uma URL: jdbc:<subprotocolo>:<dns> A aplicação usa o subprotocolo para identificar o driver a ser instanciado. O dsn é o nome que o subprotocolo utilizará para localizar um determinado servidor ou base de dados. 7

URL JDBC

8

DriverManager e Driver

Oracle

A interface Driver é utilizada apenas por implementações de drivers. É preciso, porém, carregar(registrá-lo) a classe do driver na aplicação que irá utilizá-lo. Isto pode ser feito com a operação estática registerDriver() da classe java.sql.DriverManager. Esta classe fornece um serviço básico para o gerenciamento de um conjunto de drivers JDBC. O registerDriver() é a operação que tem como entrada um “driver” de classe, ou seja uma classe que implementa a interface java.sql.Driver.

Porta default: 1521 Sintaxe: jdbc:oracle:thin:@host:port:SID ou jdbc:oracle:thin:@//host:port/SERVICE Exemplo: jdbc:oracle:thin:@192.168.0.1:1521:xe jdbc:oracle:thin:@//192.168.0.1:1521/xe

DriverManager.registerDriver(new oracle.jdbc.OracleDriver());

Postgres Porta default: 5432 Sintaxe: jdbc:postgresql://host:port/database Exemplo: jdbc:postgresql://192.168.0.1:5432/database

Alternativamente, você pode usar a operação forName() da classe java.lang.Class para carregar os drivers JDBC diretamente.

Mysql

Class.forName("oracle.jdbc.OracleDriver");

Porta default: 3306 Sintaxe: jdbc:mysql://host:port/database Exemplo: jdbc:mysql://192.168.0.1:3306/database

No entanto, esta operação é válida somente para máquinas virtuais java compatível com JDK. Não é válido para as máquinas virtuais Java da Microsoft. Necessita tratar a exceção ClassNotFoundException 9

DriverManager e Driver

10

DriverManager e Driver Oracle

A classe DriverManager manipula objetos do tipo Driver. Possui operações para registrar novos drivers, removê-los ou listálos. É usado para retornar Connection, que representa uma conexão a um banco de dados, a partir de uma URL JDBC recebida como parâmetro Connection con = DriverManager.getConnection ("jdbc:oracle:thin:@192.168.0.1:1521:xe","nome","senha");

Driver Class: oracle.jdbc.OracleDriver oracle.jdbc.driver.OracleDriver (depreciado)

JAR: odbc14.jar (_g opção para depuração com “javac –g”) Link:http://www.oracle.com/technetwork/database/features/jdbc/inde x-091264.html ou no diretório de instalação do oracle(C:\oraclexe\app\oracle\product\X.X.X\server\jdbc\lib).

Postgres Driver Class: org.postgresql.Driver JAR: postgresql-9.0-801.jdbc4.zip (jdbc5 para java 6) Link: http://jdbc.postgresql.org/download.html

Mysql

11

Driver Class: com.mysql.jdbc.Driver JAR: mysql-connector-java-5.1.15.bin.jar dentro de mysqlconnector-java-5.1.15.zip (versão 5 para java 6) Link: http://dev.mysql.com/downloads/connector/j/

12

2


Testando Connection

Connection

Ele analisa a URL, e pergunta a cada um dos drivers que você carregou se são ou não capazes de lidar com ele.

import java.sql.*; ... String dbdriver = "oracle.jdbc.OracleDriver"; String dburl = "jdbc:oracle:thin:@192.168.0.1:1521:xe"; String dbusuario = "usuario"; String dbsenha = "senha"; try { Class.forName(dbdriver); Connection con = DriverManager.getConnection(dburl,dbusuario,dbsenha); } catch( ClassNotFoundException e ) { /* Falha em carregar o DRIVER */ }

Se encontrar o driver adequado, então faz a conexão, caso contrário ele lança uma exceção.

catch( SQLException e ) { /* Falha na Conexão ou no SQL */ ...

Depois de ter registrado o driver, você estará pronto para dar o grande passo: fazer uma conexão com o SGBD. A conexão é feita por DriverManager.getConnection() que retorna um objeto na forma de um objeto Connection.

}

13

14

Testando Statement(execute)

Statement

import java.sql.*; ... String dbdriver = "oracle.jdbc.OracleDriver"; String dburl = "jdbc:oracle:thin:@192.168.0.1:1521:xe"; String dbusuario = "usuario"; String dbsenha = "senha"; try { Class.forName(dbdriver); Connection con = DriverManager.getConnection(dburl,dbusuario,dbsenha); Statement stmt = con.createStatement(); stmt.execute("CREATE TABLE dinossauros " +"(codigo INT PRIMARY KEY, genero CHAR(20), " +" especie CHAR(20) )"); } catch( ClassNotFoundException e ) { /* Falha em carregar o DRIVER */ } catch( SQLException e ) { /* Falha na Conexão ou no SQL */ } ...

Oferece meios de passar instruções SQL para o SGBD. 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 SGBD. Subinterfaces: PreparedStatement e CallableStatement. PreparedStatement pstmt = con.prepareStatement(); CallableStatement cstmt = con.prepareCall();

15

Testando Statement(executeUpdate)

16

PreparedStatement

import java.sql.*; ... String dbdriver = "oracle.jdbc.OracleDriver"; String dburl = "jdbc:oracle:thin:@192.168.0.1:1521:xe"; String dbusuario = "usuario"; String dbsenha = "senha"; try { Class.forName(dbdriver); Connection con = DriverManager.getConnection(dburl,dbsuario,dbsenha); Statement stmt = con.createStatement(); int linhasModificadas = stmt.executeUpdate("INSERT INTO dinossauros " +"(codigo, genero, especie) VALUES " +"(499,'Fernandosaurus','brasiliensis') "); } catch( ClassNotFoundException e ) { /* Falha em carregar o DRIVER */ } catch( SQLException e ) { /* Falha na Conexão ou no SQL */ } ...

As instruções preparadas são uma característica avançada dos drivers JDBC para servidores de BD. Nem todo driver JDBC oferece esta característica. As instruções preparadas possibilitam pré-compilar uma instrução SQL. Obtendo-se um objeto Connection, chama-se sobre ele o método prepareStatement() para obter um objeto do tipo PreparedStatement passando uma String sql a ser preparada. PreparedStatement pstmt = con.prepareStatement("SQL"); 17

18

3


Testando a PreparedStatement Insert

Testando a PreparedStatement Update

import ... String String String

import ... String String String

java.sql.*; dbdriver = "oracle.jdbc.OracleDriver"; dburl = "jdbc:oracle:thin:@192.168.0.1:1521:xe"; dbsuario = "usuario"; String dbenha = "senha";

try { Class.forName(dbdriver); Connection con = DriverManager.getConnection(dburl,dbusuario,dbsenha); PreparedStatement pstmt = con.prepareStatement("INSERT INTO " + " dinossauros(codigo, genero, especie) VALUES (?,?,?) ");

java.sql.*; dbdriver = "oracle.jdbc.OracleDriver"; dburl = "jdbc:oracle:thin:@192.168.0.1:1521:xe"; dbusuario = "usuario"; String dbsenha = "senha";

try { Class.forName(dbdriver); Connection con = DriverManager.getConnection(dburl,dbusuario,dbsenha); PreparedStatement pstmt = con.prepareStatement("UPDATE dinossauros" + " set genero=?, especie=? WHERE codigo=? ");

pstmt.setInt(1,123); pstmt.setString(2,"Tiranosaurus"); pstmt.setString(3,"Rex");

pstmt.setString(1,"Patossaurus"); pstmt.setString(2,"Marrecus"); pstmt.setInt(3,123);

int linhasModificadas = pstmt.executeUpdate(); } catch( ClassNotFoundException e ) { /* Falha em carregar o DRIVER */ } catch( SQLException e ) { /* Falha na Conexão ou no SQL */ } ...

int linhasModificadas = pstmt.executeUpdate(); } catch( ClassNotFoundException e ) { /* Falha em carregar o DRIVER */ } catch( SQLException e ) { /* Falha na Conexão ou no SQL */ } ... 19

Testando a PreparedStatement Delete import ... String String String String

20

Transações

java.sql.*; dbdriver = "oracle.jdbc.OracleDriver"; dburl = "jdbc:oracle:thin:@192.168.0.1:1521:xe"; dbdriver = "oracle.jdbc.OracleDriver"; dbusuario = "usuario"; String dbsenha = "senha";

Operações de Connection commit(); rollback(); setAutoCommit(boolean autoCommit);

try { Class.forName(dbdriver); Connection con = DriverManager.getConnection(dburl,dbusuario,dbsenha); PreparedStatement pstmt = con.prepareStatement("DELETE FROM " + " dinossauros WHERE codigo=?");

Por default, as informações são processadas a medida em que são recebidas. Para mudar: con.setAutoCommit(false);

pstmt.setInt(1,123);

Agora várias instruções podem ser acumuladas. Para processar:

int linhasModificadas = pstmt.executeUpdate(); } catch( ClassNotFoundException e ) { /* Falha em carregar o DRIVER */ } catch( SQLException e ) { /* Falha na Conexão ou no SQL */ } ...

con.commit();

Se houver algum erro e todo o processo necessitar ser cancelado, pode-se emitir um ROLLBACK usando: con.rollback(); 21

ResultSet (Consulta)

22

Tipos JDBC e métodos getXXX()

A operação executeQuery(), da interface Statement, retorna um objeto ResultSet ponteiro para as linhas de uma tabela. é um cursor para os dados recebidos. pode-se navegar pelas linhas da tabela recuperar as informações armazenadas nas colunas

As operações de navegação são next(), previous(), first() e last()

Operações para obtenção de dados: getInt(); getString(); getDate(); getXXX(); , ...

Pode ser usado o nome da coluna ou o índice da coluna na consulta para recuperar um valor. No caso de usar índice a primeira coluna é 1, a segunda é 2 e assim por diante. 23

Operações de ResultSet getInt() getLong() getFloat() getDouble() getBignum() getBoolean() getString() getDate() getTime() getTimestamp() getObject()

Tipo de dados SQL2003 INTEGER BIG INT REAL FLOAT DECIMAL BIT CHAR, VARCHAR DATE TIME TIME STAMP Qualquer tipo

24

4


Testando o ResultSet

Passos para executar uma Consulta

import java.sql.*; ... Class.forName(dbdriver); Connection con = DriverManager.getConnection(dburl,dbusuario,dbsenha); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("Select codigo, genero, " + " especie from dinossauros "); while (rs.next()) { int cod = rs.getInt("codigo"); String gen = rs.getString("genero"); String esp = rs.getString("especie"); // faça algo com os valores obtidos... } ...

1 - Carregar o JDBC Driver apropriado para o banco de dados, que deve ser registrado com DriverManager Class.forName(JDBCDriver); 2 - Recuperar um objeto Connection usando DriverManager.getConnection( ) Connection con = DriverManager.getConnection (dbURL, nome, senha); 3 - Recuperar um objeto Statement, usando o método createStatement de Connection; Statement stmt = con.createStatement( ); 4 - Recuperar um objeto ResultSet usando o método executeQuery de Statement; ResultSet rs = stmt.executeQuery("select campo1, campo2 from tabela"); 5 - Iteragir com o ResultSet: while (rs.next( )) { int x = rs.getInt(“campo1"); // ou int x = rs.getInt(1); 6 - Fechar o ResultSet; 7 - Fechar o Statement; 8 - Fechar o Connection. 25

Testando o ResultSet

Fechamento de conexão

sd Modelo de Sequencia Principal

26

:Dri verManager

Após o uso, os objetos Connection, Statement e ResultSet devem ser fechados. Isto pode ser feito com o método close():

getConnection(String, String, Stri ng) : Connection Connection()

:Connecti on

«create»

createStatement() :Statement

Statement()

con.close(); stmt.close(); rs.close();

stmt :Statement

«create»

executeQuery(Stri ng) :ResultSet

ResultSet()

rs :ResultSet

«create»

next() :bool ean

27

28

Fechamento de conexão

Garantindo o Fechamento da Conexão

import java.sql.*; ...

import java.sql.*; ... Connection con = null; Statement stmt = null; // ou PreparedStatement se necessário ResultSet rs = null; try { Class.forName(dbdriver); con = DriverManager.getConnection(dburl,dbusuario,dbsenha); stmt = con.createStatement("select ..."); rs = stmt.executeQuery(); /* Pode não existir */ /* Faça alguma coisa com os dados */ rs.close(); rs = null; stmt.close(); stmt = null; con.close(); con = null; } catch ( ClassNotFoundException e ) { /* Falha em carregar o DRIVER */ } } catch ( SQLException e ) { /* Falha na Conexão ou no SQL */ } } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { ; } rs = null; } if (stmt != null) { try { stmt.close(); } catch (SQLException e) { ; } stmt = null; } if (con != null) { try { con.close(); } catch (SQLException e) { ; } con = null; } }

Class.forName(dbdriver); Connection con = DriverManager.getConnection(dburl,dbusuario,dbsenha); Statement stmt = con.createStatement() ResultSet rs = stmt.executeQuery("Select codigo, genero, " + " especie from dinossauros "); ... rs.close(); stmt.close(); con.close();

Se os objetos rs, stmt ou con não forem fechados na clausula finally eles são verificados e fechados. Tudo para garantir que a conexão seja fechada.

... 29

30

5


Exceções

Metadados Classe DatabaseMetaData

A exceção ClassNotFoundException é a exceção que a aplicação gera quando não encontra os drivers para a conexão com o banco.

Informações sobre o banco de dados Connection con; (...) DatabaseMetaData dbdata = con.getMetaData(); String nomeDoSoftwareDoBanco = dbdata.getDatabaseProductName(); String versao = dbdata.getDatabaseProductVersion();

Classe ResultSetMetaData Informações: quantas colunas e quantas linhas existem na tabela de resultados, qual o nome das colunas, etc.

A exceção SQLException é a principal exceção a ser observada em aplicações JDBC para a conexão e envio de comandos

ResultSet rs; (...) ResultSetMetaData meta = rs.getMetaData(); int colunas = meta.getColumnCount(); for ( int i = 1; i<= colunas; i++) { String nomeColuna = meta.getColumnName(i); } 31

Usando Stored Procedures

Conclusão

Para chamar procedimentos armazenados em um banco de dados utilize CallableStatement. CallableStatment cs = con.prepareCall("{ call baixarEstoque }"); ResultSet rs = cs.executeQuery( ); O ResultSet é usado como em uma consulta para ver o resultado da execução da Procedure. Se precisar passar parâmetros utilize ? da mesma forma que o PreparedStatement. CallableStatment cs = con.prepareCall("{ call baixarEstoque(?,?) }"); cs.setString(1,"xuxu"); cs.setString(2,"20"); ResultSet rs = cs.executeQuery( );

32

É possível se conectar a diferentes SGBD basta ter o JDBC Driver, consulte o site do fornecedor. Domínio do SGBD a ser utilizado e imprescindível para aproveitar o máximo do BD. As operações de manipulação de dados necessitam que você conheça SQL. Existem diversas estratégias para construção de programas que utilizam BD.

33

34

Bibliografias/Referências H.M. Deitel, P.J. Deitel; Java - Como programar; Terceira Edição: Editora Bookman, 2001. CORNELL, G. Core Java São Paulo: Makron Books, 2002.

Fim

http://download.oracle.com/javase/tutorial/jdbc/ind ex.html http://www.oracle.com/technetwork/java/javase/jd bc/index.html 35

36

6


[25599 117010]java jdbc