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, 2010Java 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, 2010Java 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, 2010Java 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, 2010Java 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, 2010Java 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, 2010Java 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, 2010Java JDBC 12
JDBC
n  Arquitetura JDBC:
Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010Java 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, 2010Java 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, 2010Java 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, 2010Java 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, 2010Java 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, 2010Java 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, 2010Java 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, 2010Java 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, 2010Java 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, 2010Java JDBC 22
Utilizando JDBC
Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010Java 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, 2010Java 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, 2010Java 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, 2010Java 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, 2010Java 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, 2010Java 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, 2010Java 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, 2010Java JDBC 35
Dúvidas?
???
Ricardo Terra (rterrabh [at] gmail.com) Maio, 2010Java 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, 2010Java 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.

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

  • 1.
    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
  • 2.
    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)
  • 3.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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
  • 4.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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
  • 5.
    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
  • 6.
    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
  • 7.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010 7 Importando Bibliotecas Externas... n  Observe que a biblioteca aparecerá em "Referenced Libraries" Java JDBC
  • 8.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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)
  • 9.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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')) );
  • 10.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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')) );
  • 11.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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
  • 12.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java JDBC 12 JDBC n  Arquitetura JDBC:
  • 13.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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");!
  • 14.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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();!
  • 15.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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();!
  • 16.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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!
  • 17.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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);
  • 18.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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();! !...!
  • 19.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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
  • 20.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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
  • 21.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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
  • 22.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java JDBC 22 Utilizando JDBC
  • 23.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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
  • 24.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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(); }
  • 25.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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(); }
  • 26.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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(); }
  • 27.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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()); } } } }
  • 28.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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();
  • 29.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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
  • 30.
    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
  • 31.
    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
  • 32.
    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
  • 33.
    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
  • 34.
    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
  • 35.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java JDBC 35 Dúvidas? ???
  • 36.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java JDBC 36 Obrigado! Ricardo Terra rterrabh [at] gmail.com Apresentação e projeto Java disponíveis em: www.ricardoterra.com.br/palestras
  • 37.
    Ricardo Terra (rterrabh[at] gmail.com) Maio, 2010Java 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.