11
Fundamentos Fundamentos de JDBCde JDBC
14
AULAAULA
CENTRO FEDERAL DE EDUCAÇÃO CENTRO FEDERAL DE EDUCAÇÃO TECNOLOGICA DO RNTECNOLOGICA DO RN
Prof. Alessandro J. de Souza
22
JDBC
JDBC é uma interface baseada em Java para acesso a bancos de dados através de SQL.
O pacote java.sql consiste de um conjunto de classes e interfaces que permitem embutir código SQL em métodos.
Com JDBC é possível construir uma aplicação Java para acesso a qualquer banco de dados SQL.
Para usar JDBC é preciso ter um driver JDBC
33
Tipos de Driver JDBC
Tipo 1: ponte ODBC-JDBC
O tipo 1 é um driver de ponte entre Java e ODBC.
O driver de ponte mais conhecido é o fornecido pela Sun o JDBC-ODBC
bridge.
Tipo 2: solução com código nativo
Usam uma API nativa. Esses drivers contém métodos Java
implementados em C ou C++.
Tipo 3: solução 100% Java no cliente
O tipo 3 é um driver totalmente Java que se comunica com algum tipo de
middleware que então se comunica com o banco de dados
Tipo 4: solução 100% Java
O tipo 4 é um driver totalmente Java que vai diretamente ao banco de
dados
44
Tipos de Driver JDBC
Fonte- http://www.argonavis.com.br
55
Como enviar consultas ao banco?
1. Carregar Driver JDBC;
2. Conectar a fonte de dados;
3. Executar declarações SQL;
66
Carregar Driver JDBC
Carregar Driver JDBC É preciso carregar a classe do driver na aplicação que irá utilizá-lo.
Isto pode ser feito com Class.forName():
Exemplo:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Class.forName(“org.postgresql.Driver");
77
Conectar a fonte de dados
Conectar a fonte de dados Para determinar qual driver será usado usa-se uma URL:
jdbc:<subprotocolo>:<dsn>
A aplicação usa o subprotocolo para identificar e selecionar o
driver a ser instanciado.
O dsn é o nome que o subprotocolo utilizará para localizar
um determinado servidor ou base de dados.
Sintaxe dependente do fabricante:
jdbc:odbc: nome_fonte_de_dados
jdbc:postgresql://maquina:porta/nome_fonte_de_dados
Connection con = DriverManager.getConnection ("jdbc:odbc:banco",“usuário","senha")
A classe DriverManager manipula objetos do tipo Driver.
88
Executar declaraões SQL
Existem três formas diferentes de executar declarações SQL:
Statement - Oferece meios de passar instruções SQL para o sistema de bancos de dados.
PreparedStatement – Declarações SQL semi-estáticas
CallableStatement - para chamada de stored procedures
Statement stmt = con.createStatement()
PreparedStatement pstmt = con.prepareStatement(...);
CallableStatement cstmt = con.prepareCall(...);
99
Exemplo de uso de Statement
stmt.execute("CREATE TABLE pessoas "
+ "(codigo INT PRIMARY KEY, "
+ " nome CHAR(20), "
+ " cidade CHAR(20));");
int linhasModificadas =
stmt.executeUpdate("INSERT INTO pessoas "
+ "(codigo, nome, cidade) VALUES "
+ "(001, 'Carlos', 'natal')");
ResultSet cursor =
stmt.executeQuery("SELECT nome, cidade "
+ " FROM pessoas "
+ " WHERE codigo = 001");
1010
Exemplo de uso de PreparedStatement
Statement pré-compilado que é mais eficiente quando várias
queries similares são enviadas com parâmetros diferentes
String com instrução SQL é preparado previamente,
deixando-se "?" no lugar dos parâmetros
Parâmetros são inseridos em ordem, com setTipo().
String sql = "INSERT INTO pessoas (codigo, nome, cidade)
VALUES(?, ?, ?)";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setInt(1, 002);
pstmt.setString(2, "Alessandro");
pstmt.setString(3, "João Pessoa");
pstmt.executeUpdate();
1111
ResultSet
O método executeQuery(), da interface Statement, retorna um objeto ResultSet. Pode-se navegar pelas linhas da tabela recuperar as informações armazenadas nas colunas
Os métodos de navegação são next(): move uma linha para frente
previous(): move uma linha para trás
absolute(int n): move para alinha com número específico
first(): move para o primeiro registro
last(): move para o ultimo registro
....
ResultSet rs = stmt.executeQuery(sql);
While(rs.next()){
//processa dados ...
}
1212
Tipos Java / SQL e métodos de Acesso
1313
Exemplo de ResultSet
ResultSet rs =
stmt.executeQuery("SELECT * FROM pessoas");
while (rs.next()) {
int cod = rs.getInt("codigo");
String nome = rs.getString("nome");
String cidade = rs.getString("cidade");
// faça algo com os valores obtidos na consulta...
}
1414
Método Close() e Exceções
Após o uso, os objetos Connection, Statement e ResultSet
devem ser fechados através do método close():
conexão.close();
statement.close();
resultset.close();
A exceção SQLException é a principal exceção a ser
observada em aplicações JDBC
Try{
//comando de acesso ao banco
}cacth (SQLException ex) {
//tratamento de exceções
}finally{
//fechamento de conexões
}
1515
Exemplo de Persistência
public class Banco {
public static Connection conn = null;
public static Connection getConexao(){
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn = DriverManager.getConnection("jdbc:odbc:testemy","SA","");
}catch (ClassNotFoundException exc) {
System.out.println("Error ao carregar o Driver");
} catch (SQLException ex) {
System.out.println("Probelmas ao abrir a conexao com o banco");
}
return conn;
}
1616
Exemplo de Persistência
public void salva(Pessoa pessoa) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn = Banco.getConexao();
stmt = conn.prepareStatement("insert into tabela1 (nome,telefone, endereco) values (?, ?, ? )");
stmt.setString(1, pessoa.getNome().trim());
stmt.setString(2, pessoa.getTelefone().trim());
stmt.setString(3, pessoa.getEndereco().trim());
stmt.executeUpdate();
} catch (SQLException ex) {
System.out.println("Error fatal");
} finally {
Banco.closeConexao(conn, rs, stmt);
}
}
1717
Transações
Permite a execução atômica de comandos enviados ao banco.
Implementada através dos métodos de Connection
commit() – aplica mudanças no banco
con.commit();
rollback() – desfaz operações realizadas até o
momento
con.rollback();
setAutoCommit(boolean autoCommit): default é
true.
con.setAutoCommit(false);
1818
Construindo uma Aplicação web com acesso
a banco de dados