37
Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC Aplicação Java com Acesso a um SGBD Ricardo Terra rterrabh [at] gmail.com Java JDBC 1

Java JDBC: Aplicação Java que acessa um SGDB

Embed Size (px)

Citation preview

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010

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

Ricardo Terra rterrabh [at] gmail.com

Java JDBC 1

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010

CV

Java JDBC 2

Nome: Ricardo Terra Email: rterrabh [at] gmail.com www: ricardoterra.com.br Twitter: rterrabh Lattes: lattes.cnpq.br/ 0162081093970868

Ph.D. (UFMG/UWaterloo), Post-Ph.D. (INRIA/Université Lille 1)

Background Acadêmico: UFLA (desde 2014), UFSJ (1 ano), FUMEC (3 anos), UNIPAC (1 ano), FAMINAS (3 anos)

Profissional: DBA Eng. (1 ano), Synos (2 anos), Stefanini (1 ano)

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 3

Conexão Java com SBGD

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

n  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

n  JDBC é direcionado a banco de dados relacionais

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 4

JDBC

n  A API JDBC já está vinculada ao JDK do Java, porém é necessário baixar as API específicas para o Oracle q  São conhecidas como connectors

n  O connector Oracle pode ser facilmente baixado em: q  http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html

n  O connector MySql pode ser facilmente baixado em: q  http://dev.mysql.com/downloads/connector/j/

n  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

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 5

Importando Bibliotecas Externas...

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

Java JDBC

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 6

Importando Bibliotecas Externas...

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

Java JDBC

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 7

Importando Bibliotecas Externas...

n  Observe que a biblioteca aparecerá em "Referenced Libraries"

Java JDBC

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 8

Conexão Java com SGBD

n  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!

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

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 9

Conexão Java com Oracle

n  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'))

);

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 10

Conexão Java com MySql

n  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'))

);

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 11

JDBC

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

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

gerenciamento de conectores (connectors ou drivers)

q  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

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 12

JDBC

n  Arquitetura JDBC:

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 13

JDBC – java.sql.DriverManager!

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

n  Os principais métodos são: q  registerDriver(driver: Driver) : void!

n  Utilizado para o registro de um connector (ou driver). É a primeira atividade a ser realizada DriverManager.registerDriver(!! !new oracle.jdbc.driver.OracleDriver());!

q  getConnection(url: String, user : String, pword: String) : Connection!n  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");!

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 14

JDBC – java.sql.Connection!

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

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

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

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

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

q  conn.commit();!

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 15

JDBC – java.sql.Connection

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

q  conn.rollback();

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

q  Statement st = conn.createStatement();!

q  prepareStatement(sql : String) : java.sql.PreparedStatement!n  Cria uma instrução parametrizada para que seja enviado algum SQL ao

banco de dados n  PreparedStatement ps =

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

q  close() : void!n  Realiza o encerramento da conexão. Sempre ao abrir uma conexão, a

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

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 16

JDBC – java.sql.Statement

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

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

n  Realiza a execução de um insert, update, delete ou qualquer instrução SQL que não retorne nada, por exemplo, instruções DDL q  st.executeUpdate("delete from CONTATO where SEXO='M'");

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

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

q  close() : void!

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 17

JDBC – java.sql.PreparedStatement

n  PreparedStatement é a interface com as mesmas responsabilidades da Statement, porém possui métodos para inserir os parâmetros

n  Alguns destes métodos de inserção de parâmetros: q  setInt(paramIndex : int, x : int) : void!

q  setLong(paramIndex : int, x : long) : void!

q  setString(paramIndex : int, x : String) : void!

q  setDate(paramIndex : int, x : java.sql.Date) : void!

q  setNull(parameterIndex : int, sqlType : int) : void!n  Ex.: ps.setNull(5, java.sql.Types.NULL);

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 18

JDBC – java.sql.PreparedStatement

n  Exemplo: q  ...!!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();!!...!

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 19

JDBC – java.sql.ResultSet

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

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

n  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 q  rs.next();

q  close() : void!

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

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 20

JDBC – java.sql.ResultSet

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

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

n  Alguns destes métodos de recuperação de valores das colunas: q  getInt( [columnName : String | columnIndex : int ] ) : int!

q  getLong( [columnName : String | columnIndex : int ] ) : long!

q  getString( [columnName : String | columnIndex : int ] ) : String!

q  getDate([columnName : String | columnIndex : int]) : java.sql.Date!n  Somente a data

q  getTimestamp([columnName : String | columnIndex : int]) : java.sql.Date!

n  Data e hora

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 21

Utilizando JDBC

n  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

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 22

Utilizando JDBC

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 23

JDBC - Exemplos

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

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

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

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 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(); }

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 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();

}

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 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(); }

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 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()); } } } }

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 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();

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 29

Importante

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

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

resultados

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

independente de sucesso ou falha na transação etc

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010

Desenvolvendo uma Aplicação Completa

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

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

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

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

Java JDBC 30

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010

Desenvolvendo uma Aplicação Completa

n  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 31

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010

Desenvolvendo uma Aplicação Completa

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

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

n  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

q  Retornará ao menu de opções

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

n  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

q  Retornará ao menu de opções

Java JDBC 32

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010

Desenvolvendo uma Aplicação Completa

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

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

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

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

6.  Encerrar

q  Deverá encerrar o aplicativo

Java JDBC 33

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010

Desenvolvendo uma Aplicação Completa

n  Teremos uma classe do tipo Contato!

n  Teremos uma classe de busca de conexão (DBLocator) n  Teremos um ContatoDAO!

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

Java JDBC 34

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 35

Dúvidas?

???

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 36

Obrigado!

Ricardo Terra rterrabh [at] gmail.com

Apresentação e projeto Java disponíveis em:

www.ricardoterra.com.br/palestras

Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010 Java JDBC 37

Referência Bibliográfica

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

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