JAVA JDBD - Aplicação Java com Acesso a um SGBD

37
Java JDBC Aplicação Java com Acesso a um SGBD Ricardo Terra [email protected]

Transcript of JAVA JDBD - Aplicação Java com Acesso a um SGBD

Page 1: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC Aplicação Java com Acesso a um SGBD

Ricardo Terra [email protected]

Page 2: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 2

Ricardo Terra

  Mestre em Informática – PUC Minas   Doutorando em Ciência da Computação – UFMG

  Especializado em Java   SCJP   SCWCD

  Professor FUMEC

Page 3: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 3

Conexão Java com SBGD

  Não faria sentido um SGBD se não existisse a conexão entre uma linguagem de programação e um banco de dados   Em Java, existe o Java Database Connectivity (JDBC)

  JDBC é uma biblioteca vinculada a API da linguagem de programação Java que define como um cliente pode acessar um banco de dados. Inclusive provê métodos para consulta e atualização

  JDBC é direcionado a banco de dados relacionais

Page 4: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 4

JDBC

  A API JDBC já está vinculada ao JDK do Java, porém é necessário baixar as API específicas para o Oracle   São 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 implementação das interfaces JDBC. Ela possui a extensão JAR e deve ser adicionada ao "Build Path" do projeto que a utilizará, conforme demonstrado no próximo slide

Page 5: JAVA JDBD - Aplicação Java com Acesso a um SGBD

5

Importando Bibliotecas Externas...

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

Page 6: JAVA JDBD - Aplicação Java com Acesso a um SGBD

6

Importando Bibliotecas Externas...

  Selecione a biblioteca (extensão JAR) desejada onde ela estiver

Page 7: JAVA JDBD - Aplicação Java com Acesso a um SGBD

7

Importando Bibliotecas Externas...

  Observe que a biblioteca aparecerá em "Referenced Libraries"

Page 8: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 8

Conexão Java com SGBD

  Para exemplos, utilizaremos o seguinte modelo relacional:

CONTATO (cpf, nome, sexo, data_nascimento, telefone)!! ! dom(cpf) = numérico(11) NN!! ! dom(nome) = alfabético(60) NN, com nome único!! ! dom(sexo) = char(1) NN, pode ser 'M' ou 'F'!! ! dom(data_nascimento) = data NN!! ! dom(telefone) = numérico(10) NN!

  Por didática, todos os campos serão não-nulos (not null)

Page 9: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 9

Conexão Java com Oracle

  Criação do modelo relacional proposto no Oracle:

create table CONTATO(

CPF number(11) not null,

NOME varchar2(60) not null,

SEXO char(1) 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'))

);

Page 10: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 10

Conexão Java com MySql

  Criação do modelo relacional proposto no MySql:

create table CONTATO(

CPF bigint not null,

NOME varchar(60) not null,

SEXO char(1) 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'))

);

Page 11: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 11

JDBC

  As classes e interfaces JDBC estão contidas no pacote java.sql!

  Veremos nos próximos slides a classe e as interfaces deste pacote.   A única classe é a DriverManager que é responsável pelo

gerenciamento de conectores (connectors ou drivers)

  Todos os outros tipos são interfaces, pois a implementação deles encontra-se na biblioteca (connector) que foi adicionado ao projeto e que deve ser registrado pela classe DriverManager

Page 12: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 12

JDBC

  Arquitetura JDBC:

Page 13: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 13

JDBC – java.sql.DriverManager!

  DriverManager é a classe responsável por:   Registrar o connector   Abrir conexão

  Os principais métodos são:   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 conexão a um SGDB. Deve ser passado a url de acesso ao

SGBD, o nome e a senha do usuário Connection conn = DriverManager.getConnection(!! "jdbc:oracle:thin:@localhost:1521:xe","user”,"pw");!

Page 14: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 14

JDBC – java.sql.Connection!

  Connection é a interface responsável por:   Realizar commit ou rollback de uma transação   Criar instruções

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

  Os principais métodos são:   setAutoCommit(autoCommit: boolean) : void!

  Configura se a conexão será "auto-comitada" ou não   conn.setAutoCommit(false);

  commit() : void!  Realiza o commit da conexão

  conn.commit();!

Page 15: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 15

JDBC – java.sql.Connection

  rollback() : void!  Realiza o rollback da conexão

  conn.rollback();

  createStatement() : java.sql.Statement!  Cria uma instrução para que seja enviado algum SQL ao banco de dados

  Statement st = conn.createStatement();!

  prepareStatement(sql : String) : java.sql.PreparedStatement!  Cria uma instrução 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 conexão. Sempre ao abrir uma conexão, a

mesma deverá ser encerrada   conn.close();!

Page 16: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 16

JDBC – java.sql.Statement

  Statement é a interface responsável por:   Executar instruções   Realizar consultas

  Os principais métodos são:   executeUpdate(sql : String) : int!

  Realiza a execução de um insert, update, delete ou qualquer instrução SQL que não retorne nada, por exemplo, instruções 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!

Page 17: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 17

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, porém possui métodos para inserir os parâmetros

  Alguns destes métodos de inserção de parâmetros:   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);

Page 18: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 18

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();!! ...!

Page 19: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 19

JDBC – java.sql.ResultSet

  ResultSet é a interface responsável por:   Manipular o conjunto de resultados de uma consulta

  Os principais métodos são:   next() : boolean!

  Move o cursor para a próxima posição do conjunto de resultados, retornando um booleano dizendo se a próxima posição é válida ou não   rs.next();

  close() : void!

  Métodos de recuperação de valores das colunas que será abordado no próximo slide

Page 20: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 20

JDBC – java.sql.ResultSet

  Possui métodos para recuperação dos valores das colunas:   Os valores poderão ser recuperados pelo nome da coluna ou mesmo

pela posição em que a coluna se encontra no resultado

  Alguns destes métodos de recuperação 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

Page 21: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 21

Utilizando JDBC

  A programação usando JDBC pode ser descrita em um fluxo de atividades que será descrita em Diagrama de Atividade da UML no próximo slide

Page 22: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 22

Utilizando JDBC

Page 23: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 23

JDBC - Exemplos

  Os slides a seguir apresentam alguns exemplos da utilização do JDBC em um SGBD MySql

  Os primeiros três exemplos estão focados na utilização, ignorando completamente qualquer exceção que possa ocorrer

  O último exemplo apresenta um tratamento de exceção adequado

Page 24: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 24

Exemplos – Utilizando Instrução 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();

}

Page 25: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 25

Exemplos – Utilizando Instrução 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(); }

Page 26: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 26

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(); }

Page 27: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 27

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 CÓDIGO EFETIVO */ conn.commit(); // realiza commit } catch (SQLException e) { System.out.println("Ocorreu uma exceção de SQL. Causa: " + e.getMessage()); if (conn != null) { // se a conexão estiver aberta try { conn.rollback(); // realiza rollback } catch (SQLException e1) { System.out.println("Exceção ao realizar rollback. Causa: " + e1.getMessage()); } } } finally { if (conn != null) { // se a conexão estiver aberta try { conn.close(); } catch (SQLException e) { System.out.println("Exceção ao fechar a conexão. Causa: " + e.getMessage()); } } } }

Page 28: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 28

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 CÓDIGO EFETIVO */ conn.commit(); // realiza commit } catch (SQLException e) { System.out.println("Ocorreu uma exceção de SQL. Causa: " + e.getMessage()); if (conn != null) { // se a conexão estiver aberta try { conn.rollback(); // realiza rollback } catch (SQLException e1) { System.out.println("Exceção ao realizar rollback. Causa: " + e1.getMessage()); } } } finally { if (conn != null) { // se a conexão estiver aberta try { conn.close(); } catch (SQLException e) { System.out.println("Exceção ao fechar a conexão. Causa: " + e.getMessage()); } } } }

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);

ps.executeUpdate(); ps.close();

Page 29: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 29

Importante

  Prefira a utilização de transações.   Isto é, opte por conn.setAutoCommit(false)!

  Encerre tudo que tiver sido aberto.   Invoque o método close() de conexões, instruções e conjunto de

resultados

  Sempre faça o acesso a um banco de dados utilizando um tratamento de exceção adequado   Isto é, fazer rollback em caso de erro, fechar sempre a conexão

independente de sucesso ou falha na transação etc

Page 30: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Desenvolvendo uma Aplicação Completa

  Com toda a teoria absorvida e entendida, vamos agora criar uma aplicação Java completa com acesso à uma base de dados

  Para isso, utilizaremos:   Eclipse   Oracle XE ou MySql   Connector para Oracle ou MySql   Biblioteca TerraUtil!

  Disponível em: www.ricardoterra.com.br/palestras

  A aplicação a ser desenvolvida será explicada nos próximo slides

Java JDBC: Aplicação Java com Acesso a um SGBD 30

Page 31: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Desenvolvendo uma Aplicação Completa

  Inicialmente, o usuário poderá escolher dentre uma das opções abaixo. Cada opção será implementada em um método específico

========================! CADASTRO DE CONTATOS !========================!1 – SALVAR!2 – ATUALIZAR!3 – EXCLUIR!4 – PESQUISAR!5 – LISTAR!6 – ENCERRAR! !DIGITE A OPÇÃO DESEJADA: !

Java JDBC: Aplicação Java com Acesso a um SGBD 31

Page 32: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Desenvolvendo uma Aplicação Completa

1.  Salvar   Pedirá ao usuário todas as informações do contato e gravará no SGBD   Retornará ao menu de opções

2.  Atualizar   Pedirá ao o usuário para digitar o cpf do contato

  Caso exista, pedirá todas as informações do contato novamente – com a exceção do cpf – e atualizará no SGBD. Caso não exista, isso deverá ser avisado ao usuário

  Retornará ao menu de opções

3.  Excluir   Pedirá para o usuário digitar o número da matrícula

  Caso exista, excluir-se-á e avisará ao usuário que a exclusão foi efetuada com sucesso. Caso não exista, isto deverá ser avisado ao usuário

  Retornará ao menu de opções

Java JDBC: Aplicação Java com Acesso a um SGBD 32

Page 33: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Desenvolvendo uma Aplicação Completa

4.  Pesquisar   Pedirá para o usuário digitar o cpf do contato   Caso exista, irá exibir as informações do contato. Caso não exista, isto

deverá ser avisado ao usuário   Retornará ao menu de opções

5.  Listar   Se existir algum contato, exibirá as informações de todos. Caso não

exista nenhum, isso deverá ser avisado ao usuário   Retornará ao menu de opções

6.  Encerrar   Deverá encerrar o aplicativo

Java JDBC: Aplicação Java com Acesso a um SGBD 33

Page 34: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Desenvolvendo uma Aplicação Completa

  Teremos uma classe do tipo Contato!

  Teremos uma classe de busca de conexão (DBLocator)

  Teremos um ContatoDAO!

  Teremos a classe Aplicacao!  que fará toda a interação com o usuário através da biblioteca TerraUtil!

Java JDBC: Aplicação Java com Acesso a um SGBD 34

Page 35: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 35

Dúvidas?

???

Page 36: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 36

Obrigado!

Ricardo Terra [email protected]

Apresentação e fontes disponíveis em: www.ricardoterra.com.br/palestras

Page 37: JAVA JDBD - Aplicação Java com Acesso a um SGBD

Java JDBC: Aplicação Java com Acesso a um SGBD 37

Referência Bibliográfica

  DEITEL, H. M; DEITEL, P. J. Java, como programar. 6 ed. São Paulo: Prentice-Hall, 2005.

  DAWES, Chip; THOMAS, Biju. OCA/OCP: Introduction to Oracle9i™ SQL. São Francisco: Sibex, 2002.