Vous êtes sur la page 1sur 37

Java JDBC

Aplicao Java com Acesso a um SGBD


Ricardo Terra rterrabh@gmail.com

Ricardo Terra

Mestre em Informtica PUC Minas Doutorando em Cincia da Computao UFMG Especializado em Java SCJP SCWCD Professor FUMEC

Java JDBC: Aplicao Java com Acesso a um SGBD

Conexo Java com SBGD

No faria sentido um SGBD se no existisse a conexo entre uma linguagem de programao e um banco de dados

Em Java, existe o Java Database Connectivity (JDBC)

JDBC uma biblioteca vinculada a API da linguagem de programao Java que define como um cliente pode acessar um banco de dados. Inclusive prov mtodos para consulta e atualizao JDBC direcionado a banco de dados relacionais

Java JDBC: Aplicao Java com Acesso a um SGBD

JDBC

A API JDBC j est vinculada ao JDK do Java, porm necessrio baixar as API especficas para o Oracle

So conhecidas como connectors

O connector Oracle pode ser facilmente baixado em:

http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html

O connector MySql pode ser facilmente baixado em:

http://dev.mysql.com/downloads/connector/j/

O connector a implementao das interfaces JDBC. Ela possui a extenso JAR e deve ser adicionada ao "Build Path" do projeto que a utilizar, conforme demonstrado no prximo slide

Java JDBC: Aplicao Java com Acesso a um SGBD

Importando Bibliotecas Externas...

Clique com o boto direito no projeto, v em "Build Path" e depois em "Add External Archives..."

Importando Bibliotecas Externas...

Selecione a biblioteca (extenso JAR) desejada onde ela estiver

Importando Bibliotecas Externas...

Observe que a biblioteca aparecer em "Referenced Libraries"

Conexo Java com SGBD

Para exemplos, utilizaremos o seguinte modelo relacional:

CONTATO (cpf, nome, sexo, data_nascimento, telefone)!


! ! ! ! ! ! ! ! ! !

dom(cpf) = numrico(11) NN! dom(nome) = alfabtico(60) NN, com nome nico! dom(sexo) = char(1) NN, pode ser 'M' ou 'F'! dom(data_nascimento) = data NN! dom(telefone) = numrico(10) NN!
Por didtica, todos os campos sero no-nulos (not null)

Java JDBC: Aplicao Java com Acesso a um SGBD

Conexo Java com Oracle

Criao do modelo relacional proposto no Oracle:


create table CONTATO( CPF number(11) NOME varchar2(60) SEXO char(1)

not null, not null, not null,

DATA_NASCIMENTO date not null, TELEFONE number(10) not null, constraint PK_CONTATO primary key (CPF), constraint UN_NOME_CONTATO unique (NOME), constraint CK_SEXO_CONTATO check (SEXO in ('M','F')) );

Java JDBC: Aplicao Java com Acesso a um SGBD

Conexo Java com MySql

Criao do modelo relacional proposto no MySql:


create table CONTATO( CPF bigint NOME varchar(60) SEXO char(1)

not null, not null, not null,

DATA_NASCIMENTO date not null, TELEFONE int not null, constraint PK_CONTATO primary key (CPF), constraint UN_NOME_CONTATO unique (NOME), constraint CK_SEXO_CONTATO check (SEXO in ('M','F')) );

Java JDBC: Aplicao Java com Acesso a um SGBD

10

JDBC

As classes e interfaces JDBC esto contidas no pacote java.sql! Veremos nos prximos slides a classe e as interfaces deste pacote.

A nica classe a DriverManager que responsvel pelo gerenciamento de conectores (connectors ou drivers) Todos os outros tipos so interfaces, pois a implementao deles encontra-se na biblioteca (connector) que foi adicionado ao projeto e que deve ser registrado pela classe DriverManager

Java JDBC: Aplicao Java com Acesso a um SGBD

11

JDBC

Arquitetura JDBC:

Java JDBC: Aplicao Java com Acesso a um SGBD

12

JDBC java.sql.DriverManager!

DriverManager a classe responsvel por:


Registrar o connector Abrir conexo

Os principais mtodos so:

registerDriver(driver: Driver) : void! Utilizado para o registro de um connector (ou driver). a primeira atividade a ser realizada DriverManager.registerDriver(! ! ! new oracle.jdbc.driver.OracleDriver());! getConnection(url: String, user : String, pword: String) : Connection! Utilizado para criar uma conexo a um SGDB. Deve ser passado a url de acesso ao SGBD, o nome e a senha do usurio Connection conn = DriverManager.getConnection(! ! "jdbc:oracle:thin:@localhost:1521:xe","user,"pw");!

Java JDBC: Aplicao Java com Acesso a um SGBD

13

JDBC java.sql.Connection!

Connection a interface responsvel por:


Realizar commit ou rollback de uma transao Criar instrues

Qualquer DML ou DDL, como insert, select, create view etc

Os principais mtodos so:

setAutoCommit(autoCommit: boolean) : void! Configura se a conexo ser "auto-comitada" ou no conn.setAutoCommit(false); commit() : void! Realiza o commit da conexo conn.commit();!

Java JDBC: Aplicao Java com Acesso a um SGBD

14

JDBC java.sql.Connection

rollback() : void! Realiza o rollback da conexo conn.rollback(); createStatement() : java.sql.Statement! Cria uma instruo para que seja enviado algum SQL ao banco de dados Statement st = conn.createStatement();! prepareStatement(sql : String) : java.sql.PreparedStatement! Cria uma instruo parametrizada para que seja enviado algum SQL ao banco de dados

PreparedStatement ps = conn.prepareStatement("select * from CONTATO where CPF = ?");!

close() : void! Realiza o encerramento da conexo. Sempre ao abrir uma conexo, a mesma dever ser encerrada

conn.close();! Java JDBC: Aplicao Java com Acesso a um SGBD 15

JDBC java.sql.Statement

Statement a interface responsvel por:


Executar instrues Realizar consultas

Os principais mtodos so:

executeUpdate(sql : String) : int! Realiza a execuo de um insert, update, delete ou qualquer instruo SQL que no retorne nada, por exemplo, instrues DDL

st.executeUpdate("delete from CONTATO where SEXO='M'");

executeQuery(sql : String) : java.sql.ResultSet! Realiza uma consulta

ResultSet rs = st.executeQuery("select * from CONTATO");

close() : void!
Java JDBC: Aplicao Java com Acesso a um SGBD 16

JDBC java.sql.PreparedStatement

PreparedStatement a i n t e r f a c e c o m a s m e s m a s responsabilidades da Statement, porm possui mtodos para inserir os parmetros Alguns destes mtodos de insero de parmetros:

setInt(paramIndex : int, x : int) : void! setLong(paramIndex : int, x : long) : void! setString(paramIndex : int, x : String) : void! setDate(paramIndex : int, x : java.sql.Date) : void! setNull(parameterIndex : int, sqlType : int) : void! Ex.: ps.setNull(5, java.sql.Types.NULL);

Java JDBC: Aplicao Java com Acesso a um SGBD

17

JDBC java.sql.PreparedStatement

Exemplo:

! ! ! ! ! ! ! ! ! ! !

...! PreparedStatement ps = ! ! conn.prepareStatement(! ! ! ! "insert into CONTATO values (?,?,?,?,?)");! ! ps.setLong(1, 12345678903L);! ps.setString(2, "Marcos");! ps.setString(3, "M");! ps.setDate(4, new java.sql.Date(500000000000L));! ps.setLong(5, 3134181010L);! ps.executeUpdate();! ...!

Java JDBC: Aplicao Java com Acesso a um SGBD

18

JDBC java.sql.ResultSet

ResultSet a interface responsvel por:

Manipular o conjunto de resultados de uma consulta

Os principais mtodos so:

next() : boolean!

Move o cursor para a prxima posio do conjunto de resultados, retornando um booleano dizendo se a prxima posio vlida ou no

rs.next();

close() : void! Mtodos de recuperao de valores das colunas que ser abordado no prximo slide

Java JDBC: Aplicao Java com Acesso a um SGBD

19

JDBC java.sql.ResultSet

Possui mtodos para recuperao dos valores das colunas:

Os valores podero ser recuperados pelo nome da coluna ou mesmo pela posio em que a coluna se encontra no resultado

Alguns destes mtodos de recuperao de valores das colunas:

getInt( [columnName : String | columnIndex : int ] ) : int! getLong( [columnName : String | columnIndex : int ] ) : long!
getString( [columnName : String | columnIndex : int ] ) : String!
getDate([columnName : String | columnIndex : int]) : java.sql.Date! Somente a data
getTimestamp([columnName : String | columnIndex : int]) : java.sql.Date!

Data e hora

Java JDBC: Aplicao Java com Acesso a um SGBD

20

Utilizando JDBC

A programao usando JDBC pode ser descrita em um fluxo de atividades que ser descrita em Diagrama de Atividade da UML no prximo slide

Java JDBC: Aplicao Java com Acesso a um SGBD

21

Utilizando JDBC

Java JDBC: Aplicao Java com Acesso a um SGBD

22

JDBC - Exemplos

Os slides a seguir apresentam alguns exemplos da utilizao do JDBC em um SGBD MySql Os primeiros trs exemplos esto focados na utilizao, ignorando completamente qualquer exceo que possa ocorrer O ltimo exemplo apresenta um tratamento de exceo adequado

Java JDBC: Aplicao Java com Acesso a um SGBD

23

Exemplos Utilizando Instruo Simples


public static void insert() throws SQLException { DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/dbexemplo", "root", "root"); conn.setAutoCommit(false); Statement st = conn.createStatement(); st.executeUpdate( "insert into CONTATO values (12345678903,'Marcos','M',to_date('04/11/1985','dd/MM/yyyy'),3132501111)"); st.close(); conn.commit(); conn.close(); }

Java JDBC: Aplicao Java com Acesso a um SGBD

24

Exemplos Utilizando Instruo Preparada


public static void insertPreparado() throws SQLException { DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/dbexemplo", "root", "root"); conn.setAutoCommit(false); PreparedStatement ps = conn.prepareStatement( "update CONTATO set NOME = ?, SEXO = ?, DATA_NASCIMENTO = ?, TELEFONE = ?" + "where CPF = ?"); ps.setString(1, "Carla"); ps.setString(2, "F"); ps.setDate(3, new java.sql.Date(500000000000L)); ps.setLong(4, 3132501111L); ps.setLong(5, 12345678904L); ps.executeUpdate(); ps.close(); conn.commit(); conn.close(); }

Java JDBC: Aplicao Java com Acesso a um SGBD

25

Exemplos Conjunto de Resultados


public static void select() throws SQLException { DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/dbexemplo", "root", "root"); conn.setAutoCommit(false); Statement st = conn.createStatement(); ResultSet rs = st.executeQuery("select * from CONTATO"); while (rs.next()) { System.out.println("CPF: " + rs.getLong("CPF")); System.out.println("NOME: " + rs.getString("NOME")); System.out.println("SEXO: " + rs.getString("SEXO")); System.out.println("DATA DE NASCIMENTO: " + rs.getDate("DATA_NASCIMENTO")); System.out.println("TELEFONE: " + rs.getLong("TELEFONE")); System.out.println("========================================"); } rs.close(); st.close(); conn.commit(); conn.close(); }

Java JDBC: Aplicao Java com Acesso a um SGBD

26

Exemplos Bloco Transacional


public static void blocoTransacional() { Connection conn = null; try { DriverManager.registerDriver(new com.mysql.jdbc.Driver()); conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/dbexemplo", "root", "root"); conn.setAutoCommit(false);

/* AQUI VEM O CDIGO EFETIVO */


conn.commit(); // realiza commit } catch (SQLException e) { System.out.println("Ocorreu uma exceo de SQL. Causa: " + e.getMessage()); if (conn != null) { // se a conexo estiver aberta try { conn.rollback(); // realiza rollback } catch (SQLException e1) { System.out.println("Exceo ao realizar rollback. Causa: " + e1.getMessage()); } } } finally { if (conn != null) { // se a conexo estiver aberta try { conn.close(); } catch (SQLException e) { System.out.println("Exceo ao fechar a conexo. Causa: " + e.getMessage()); } } } }

Java JDBC: Aplicao Java com Acesso a um SGBD

27

Exemplos Bloco Transacional

PreparedStatement ps = conn.prepareStatement( "insert into CONTATO values (?,?,?,?,?)"); ps.setLong(1, 12345678905L); ps.setString(2, "Clodovil");

ps.setString(3, "I"); ps.setDate(4, new java.sql.Date(500000000000L)); ps.setLong(5, 3132501111L); public static void blocoTransacional() { ps.executeUpdate(); Connection conn = null; ps.close(); try { DriverManager.registerDriver(new com.mysql.jdbc.Driver() ()); conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/dbexemplo", "root", "root"); conn.setAutoCommit(false);

/* AQUI VEM O CDIGO EFETIVO */


conn.commit(); // realiza commit } catch (SQLException e) { System.out.println("Ocorreu uma exceo de SQL. Causa: " + e.getMessage()); if (conn != null) { // se a conexo estiver aberta try { conn.rollback(); // realiza rollback } catch (SQLException e1) { System.out.println("Exceo ao realizar rollback. Causa: " + e1.getMessage()); } } } finally { if (conn != null) { // se a conexo estiver aberta try { conn.close(); } catch (SQLException e) { System.out.println("Exceo ao fechar a conexo. Causa: " + e.getMessage()); } } } }

Java JDBC: Aplicao Java com Acesso a um SGBD

28

Importante

Prefira a utilizao de transaes.

Isto , opte por conn.setAutoCommit(false)!

Encerre tudo que tiver sido aberto.

Invoque o mtodo close() de conexes, instrues e conjunto de resultados

Sempre faa o acesso a um banco de dados utilizando um tratamento de exceo adequado

Isto , fazer rollback em caso de erro, fechar sempre a conexo independente de sucesso ou falha na transao etc

Java JDBC: Aplicao Java com Acesso a um SGBD

29

Desenvolvendo uma Aplicao Completa

Com toda a teoria absorvida e entendida, vamos agora criar uma aplicao Java completa com acesso uma base de dados Para isso, utilizaremos: Eclipse Oracle XE ou MySql Connector para Oracle ou MySql Biblioteca TerraUtil!

Disponvel em: www.ricardoterra.com.br/palestras

A aplicao a ser desenvolvida ser explicada nos prximo slides

Java JDBC: Aplicao Java com Acesso a um SGBD

30

Desenvolvendo uma Aplicao Completa

Inicialmente, o usurio poder escolher dentre uma das opes abaixo. Cada opo ser implementada em um mtodo especfico
========================! CADASTRO DE CONTATOS ! ========================! 1 SALVAR! 2 ATUALIZAR! 3 EXCLUIR! 4 PESQUISAR! 5 LISTAR! 6 ENCERRAR! ! DIGITE A OPO DESEJADA: !

Java JDBC: Aplicao Java com Acesso a um SGBD

31

Desenvolvendo uma Aplicao Completa


1.

Salvar Pedir ao usurio todas as informaes do contato e gravar no SGBD Retornar ao menu de opes Atualizar Pedir ao o usurio para digitar o cpf do contato

2.

Caso exista, pedir todas as informaes do contato novamente com a exceo do cpf e atualizar no SGBD. Caso no exista, isso dever ser avisado ao usurio

Retornar ao menu de opes

3.

Excluir Pedir para o usurio digitar o nmero da matrcula

Caso exista, excluir-se- e avisar ao usurio que a excluso foi efetuada com sucesso. Caso no exista, isto dever ser avisado ao usurio

Retornar ao menu de opes


Java JDBC: Aplicao Java com Acesso a um SGBD 32

Desenvolvendo uma Aplicao Completa


4.

Pesquisar Pedir para o usurio digitar o cpf do contato Caso exista, ir exibir as informaes do contato. Caso no exista, isto dever ser avisado ao usurio Retornar ao menu de opes Listar Se existir algum contato, exibir as informaes de todos. Caso no exista nenhum, isso dever ser avisado ao usurio Retornar ao menu de opes Encerrar Dever encerrar o aplicativo

5.

6.

Java JDBC: Aplicao Java com Acesso a um SGBD

33

Desenvolvendo uma Aplicao Completa

Teremos uma classe do tipo Contato! Teremos uma classe de busca de conexo (DBLocator) Teremos um ContatoDAO! Teremos a classe Aplicacao!

que far toda a interao com o usurio atravs da biblioteca TerraUtil!

Java JDBC: Aplicao Java com Acesso a um SGBD

34

Dvidas?

???
Java JDBC: Aplicao Java com Acesso a um SGBD 35

Obrigado!
Ricardo Terra rterrabh@gmail.com Apresentao e fontes disponveis em: www.ricardoterra.com.br/palestras

Java JDBC: Aplicao Java com Acesso a um SGBD

36

Referncia Bibliogrfica

DEITEL, H. M; DEITEL, P. J. Java, como programar. 6 ed. So Paulo: Prentice-Hall, 2005. DAWES, Chip; THOMAS, Biju. OCA/OCP: Introduction to Oracle9i SQL. So Francisco: Sibex, 2002.

Java JDBC: Aplicao Java com Acesso a um SGBD

37

Vous aimerez peut-être aussi