Java JDBC - DCC/UFLA

Propaganda
Java JDBC
Aplicação Java com Acesso a um SGBD
Ricardo Terra
rterrabh [at] gmail.com
Ricardo Terra (rterrabh [at] gmail.com)
Java JDBC
Maio, 2010
1
CV
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)
Java JDBC
Maio, 2010
2
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)
Java JDBC
Maio, 2010
3
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 
n 
O connector Oracle pode ser facilmente baixado em:
q 
n 
http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html
O connector MySql pode ser facilmente baixado em:
q 
n 
São conhecidas como connectors
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
Ricardo Terra (rterrabh [at] gmail.com)
Java JDBC
Maio, 2010
4
Importando Bibliotecas Externas...
n 
Clique com o botão direito no projeto, vá em "Build Path" e depois em "Add External Archives..."
Ricardo Terra (rterrabh [at] gmail.com)
Java JDBC
Maio, 2010
5
Importando Bibliotecas Externas...
n 
Selecione a biblioteca (extensão JAR) desejada onde ela estiver
Ricardo Terra (rterrabh [at] gmail.com)
Java JDBC
Maio, 2010
6
Importando Bibliotecas Externas...
n 
Observe que a biblioteca aparecerá em "Referenced Libraries"
Ricardo Terra (rterrabh [at] gmail.com)
Java JDBC
Maio, 2010
7
Conexão Java com SGBD
Para exemplos, utilizaremos o seguinte modelo relacional:
n 
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)
Java JDBC
Maio, 2010
8
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)
Java JDBC
Maio, 2010
9
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)
Java JDBC
Maio, 2010
10
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 
q 
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
Ricardo Terra (rterrabh [at] gmail.com)
Java JDBC
Maio, 2010
11
JDBC
n 
Arquitetura JDBC:
Ricardo Terra (rterrabh [at] gmail.com)
Java JDBC
Maio, 2010
12
JDBC – java.sql.DriverManager!
n 
DriverManager é a classe responsável por:
q 
q 
n 
Registrar o connector
Abrir conexão
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)
Java JDBC
Maio, 2010
13
JDBC – java.sql.Connection!
n 
Connection é a interface responsável por:
q 
q 
Realizar commit ou rollback de uma transação
Criar instruções
n 
n 
Qualquer DML ou DDL, como insert, select, create view etc
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)
Java JDBC
Maio, 2010
14
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 
q 
PreparedStatement ps = conn.prepareStatement("select * from CONTATO where CPF = ?");!
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)
Java JDBC
Maio, 2010
15
JDBC – java.sql.Statement
n 
Statement é a interface responsável por:
q 
q 
n 
Executar instruções
Realizar consultas
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 
q 
executeQuery(sql : String) : java.sql.ResultSet!
n 
Realiza uma consulta
q 
q 
st.executeUpdate("delete from CONTATO where SEXO='M'");
ResultSet rs = st.executeQuery("select * from CONTATO");
close() : void!
Ricardo Terra (rterrabh [at] gmail.com)
Java JDBC
Maio, 2010
16
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)
Java JDBC
Maio, 2010
17
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)
Java JDBC
Maio, 2010
18
JDBC – java.sql.ResultSet
n 
ResultSet é a interface responsável por:
q 
n 
Manipular o conjunto de resultados de uma consulta
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 
q 
q 
rs.next();
close() : void!
Métodos de recuperação de valores das colunas que será abordado no próximo
slide
Ricardo Terra (rterrabh [at] gmail.com)
Java JDBC
Maio, 2010
19
JDBC – java.sql.ResultSet
n 
Possui métodos para recuperação dos valores das colunas:
q 
n 
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:
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)
Java JDBC
Maio, 2010
20
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)
Java JDBC
Maio, 2010
21
Utilizando JDBC
Ricardo Terra (rterrabh [at] gmail.com)
Java JDBC
Maio, 2010
22
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)
Java JDBC
Maio, 2010
23
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)
Java JDBC
Maio, 2010
24
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)
Java JDBC
Maio, 2010
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();
}
Ricardo Terra (rterrabh [at] gmail.com)
Java JDBC
Maio, 2010
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 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)
Java JDBC
Maio, 2010
27
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);
Exemplos – Bloco Transacional
/* 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)
Java JDBC
Maio, 2010
28
Importante
n 
Prefira a utilização de transações.
q 
n 
Encerre tudo que tiver sido aberto.
q 
n 
Isto é, opte por conn.setAutoCommit(false)!
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
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)
Java JDBC
Maio, 2010
29
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 
n 
Disponível em: www.ricardoterra.com.br/palestras
A aplicação a ser desenvolvida será explicada nos próximo slides
Ricardo Terra (rterrabh [at] gmail.com)
Java JDBC
Maio, 2010
30
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: !
Ricardo Terra (rterrabh [at] gmail.com)
Java JDBC
Maio, 2010
31
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 
q 
3. 
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
Excluir
q  Pedirá para o usuário digitar o número da matrícula
n 
q 
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
Ricardo Terra (rterrabh [at] gmail.com)
Java JDBC
Maio, 2010
32
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
Ricardo Terra (rterrabh [at] gmail.com)
Java JDBC
Maio, 2010
33
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!
Ricardo Terra (rterrabh [at] gmail.com)
Java JDBC
Maio, 2010
34
Dúvidas?
???
Ricardo Terra (rterrabh [at] gmail.com)
Java JDBC
Maio, 2010
35
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)
Java JDBC
Maio, 2010
36
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.
Ricardo Terra (rterrabh [at] gmail.com)
Java JDBC
Maio, 2010
37
Download