- 1. JDBC Java Database Connectivity
2. Problema
- Comunicao com o banco via sockets
-
- Todo banco de dados possui um protocolo proprietrio que pode
ser acessado via sockets.
-
- Poderamos ento abrir sockets diretamente com o banco de dados
para realizar os comandos que desejssemos.
-
- Lidar com a complexidade dos protolocos proprietrios de banco
de dados.
-
- Aprender um novo protocolo para cada banco de dados que
quisssemos acessar.
3. Soluo
- JDBC uma interface para acesso a bancos de dados atravs de
SQL.
-
- Permite o acesso a bancos de dados de forma padronizada
-
- Cdigo SQL usado explicitamente dentro do cdigo Java
-
- API nica, independente do Banco de Dados
- Para usar JDBC preciso ter um driver JDBC
-
- O banco deve ter pelo menos um driver ODBC, se no tiver driver
JDBC
-
- No JDK h um driver ODBC que permite o acesso a bancos
4. JDBC 5. Categorias de Drivers
-
- Usam uma ponte para ter acesso a um banco de dados. Este tipo
de soluo requer a instalao de software do lado do cliente.
- Tipo 2: soluo com cdigo nativo
-
- Usam uma API nativa. Esses drivers contm mtodos Java
implementados em C ou C++. Requer software no cliente.
- Tipo 3: soluo 100% Java no cliente
-
- Oferecem uma API de rede via middleware que traduz requisies
para API do driver desejado. No requer software no cliente.
-
- Drivers que se comunicam diretamente com o banco de dados
usando soquetes de rede. uma soluo puro Java. No requer cdigo
adicional do lado do cliente.
6. Categorias de Drivers 7. JavaDB = SUN + Apache Derby
- A partir do Java 6 a Sun incorporou um banco de dados 100% Java
chamado JavaDB.
- Baseado no banco Derby do projeto Apache, que por sua vez veio
do banco Cloudscape que foi doado ao projeto Apache pelas empresas
Cloudscape, Informix e IBM.
8. JavaDB = SUN + Apache Derby
-
- flexibilidade (cliente/server ou embarcado);
-
- suporte das principais IDEs (Netbeans e Eclipse).
-
- Inclui views, triggers, stored procedures e foreign keys.
-
- Suporta transaes multi-usurio, utilizando os principais nveis
de isolao e de propriedades ACID.
-
- Segurana com encriptao de dados
-
- Autenticao no lado do cliente
-
- Segue padres como JDBC 4.0 e SQL92/99/2003/XML.
9. JavaDB = SUN + Apache Derby Embarcado Cliente-Servidor 10.
JavaDB = SUN + Apache Derby
- Inicializando o servidor:
-
- java -jar derbyrun.jar server start
-
- java -jar derbyrun.jar ij
-
- Pode-se colocar os arquivosderby.jarederbytools.jarno classpath
e executar o mtodomainda classeorg.apache.derby.impl.tools.ij.Main
:
-
-
- java -classpath derby.jar;derbytools.jar
org.apache.derby.impl.tools.ij.Main
11. JavaDB = SUN + Apache Derby
-
- ij>connect 'jdbc:derby:posbd4; create=true';
-
- ij> CREATE TABLE clientes (id INT PRIMARY KEY GENERATED
ALWAYS AS IDENTITY, cpf VARCHAR(11), nome VARCHAR(50), fone
VARCHAR(10), renda DECIMAL(12, 2));
-
- ij> SELECT * FROM CLIENTES;
-
- ij> create table tabela1(num int, addr varchar(40));
-
- ij> insert into tabela1 values (1956,'Webster St.');
-
- ij> insert into tabela1 values (1910,'Union St.');
-
- ij> update tabela1 set num=180, addr='Grand Ave.' where
num=1956;
-
- ij> select * from tabela1;
12. Passos para uso do JDBC
- Adicionar o driver JDBC ao classpath
- Carregar a classe do driver JDBC
- Estabelecer a conexo a partir de uma URL
- Executar uma query ou update
13. Conectando com o banco
- Adicionar o driver JDBC ao classpath
-
-
- mysql-connector-java-5.1.6-bin.jar
14. Conectando com o banco
- Carregar a classe do driver
-
- Basta carregar o driver atravs do mtodoClass.forName:
Class.forName( "com.mysql.jdbc.Driver" );
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Class.forName("org.apache.derby.jdbc.ClientDriver");
-
- No java 6 e com driver que implementa a API JDBC 4 no mais
necessrio carregar a classe para que o driver seja registrado no
DriverManager.
-
-
- Basta inserir o jar do driver no classpath e confiar no recurso
de auto-discovery ou auto-loading de Driver JDBC.
-
- Como o DriverManager sabe se um jar possui um driver?
-
-
- O jar de um Driver possui o arquivo:
META-INF/services/java.sql.Driver. Este arquivo armazena a classe
do driver. No caso do mySQL ser: com.mysql.jdbc.Driver.
15. Conectando com o banco
-
- O servio que permite o uso do driver delegado para um gerente
de drivers: oDriverManager .
-
- Atravs doDriverManager , usamos o mtodogetConnectioncom uma url
que indica que banco queremos acessar.
-
- O padro da url para acessar o mysql :
-
-
- Exemplo: jdbc:mysql://localhost/teste
-
- Exemplos de URL para acessar o derby (JavaDB) :
-
-
- jdbc:derby:teste; create=true
-
-
- jdbc:derby://localhost/teste; create=true
16. URL
- A URL JDBC tem o seguinte formato:
-
-
- Subprotocolo identifica qual driver ser instanciado.
-
-
- dsn - nome que o subprotocolo usa para identificar um servidor
e/ou base de dados.
-
- jdbc:odbc:nomedabasededados
-
- jdbc:oracle:thin@localhost:nomedabasededados
-
- jdbc:postgresql://localhost/nomedabasededados
-
- jdbc:mysql://localhost/nomedabasededados
-
- jdbc:derby:teste; create=true
-
- jdbc:derby://localhost/teste; create=true
17. Conectando com o banco - MySQL importjava.sql.Connection;
importjava.sql.DriverManager; importjava.sql.SQLException; public
classExemplolJDBC { public static voidmain(String[] args) { try{
Class. forName ( "com.mysql.jdbc.Driver" ); Connection con =
DriverManager. getConnection ( "jdbc:mysql://localhost/posbd4" ,
"root" , "root" ); System. out .println( "Conectado" );
con.close(); }catch(ClassNotFoundException e) {
e.printStackTrace(); }catch(SQLException e) { e.printStackTrace();
} } } 18. Conectando com o banco - JavaDB
importjava.sql.Connection; importjava.sql.DriverManager;
importjava.sql.SQLException; public classExemplolJDBC { public
static voidmain(String[] args) { try{ Class. forName (
"org.apache.derby.jdbc.EmbeddedDriver" ); Connection con =
DriverManager. getConnection ( "jdbc:derby:posbd4; create=true" );
System. out .println( "Conectado" ); con.close();
}catch(ClassNotFoundException e) { e.printStackTrace();
}catch(SQLException e) { e.printStackTrace(); } } } 19. Fbrica de
conexes - MySQL importjava.sql.Connection;
importjava.sql.DriverManager; importjava.sql.SQLException; public
classConnectionFactory { public staticConnection
getConnection()throwsSQLException { try{ Class. forName (
"com.mysql.jdbc.Driver" ); returnDriverManager. getConnection (
"jdbc:mysql://localhost/posbd4" , "root" , "root" );
}catch(ClassNotFoundException e) { throw
newSQLException(e.getMessage()); } } } 20. Fbrica de conexes -
JavaDB importjava.sql.Connection; importjava.sql.DriverManager;
importjava.sql.SQLException; public classConnectionFactory { public
staticConnection getConnection()throwsSQLException { try{ Class.
forName ( "org.apache.derby.jdbc.EmbeddedDriver" );
returnDriverManager. getConnection ( "jdbc:derby:posbd4;
create=true") ; }catch(ClassNotFoundException e) { throw
newSQLException(e.getMessage()); } } } 21. Comandos SQL
- String sql ="insert into contatos (nome,email,endereco) values
('"+ nome +"', '"+ email +"', '"+ endereco +"')" ;
- String sql ="insert into contatos (nome,email,endereco) values
(?,?,?)" ;
-
- Evita SQL Injection (injeo de SQL)
-
- Pode ser pre-compilada pelo SGBD
22. Comandos SQL
- A execuo de comandos SQL pode ser feita via:
-
-
- Interface que estende a interface Statement.
-
-
- Possibilita o uso de comandos pre-compilados pelo SGBD.
-
-
- Torna-se mais rpido quando usado repetidamente
-
-
- Os parmetros so representados pelo smbolo ?.
23. Executando um comando SQL // ... PreparedStatement stmt =
con.prepareStatement( "insert into contatos (nome,email,endereco)
values (?,?,?)" ); stmt.setString(1,"Caelum" );
stmt.setString(2,"[email protected]" ); stmt.setString(3,"R.
Vergueiro 3185 cj57" ); stmt.executeUpdate(); stmt.close(); //
...
- O ndice dos parmetros inicia por 1.
- Para executar o comando podemos usar os mtodos:
-
- boolean execute()- qualquer comando SQL
-
- int executeUpdate()- DML (insert, update, delete) ou DDL.
-
- ResultSet executeQuery()- Somente para consultas
24. ResultSet
- Permite navegar por seus registros atravs do mtodo next().
// ... PreparedStatement stmt =this .con.prepareStatement(
"select * from contatos" ); ResultSet rs = stmt.executeQuery();
List contatos =newArrayList(); while(rs.next()) { Contato contato
=newContato(); contato.setNome(rs.getString( "nome" ));
contato.setEmail(rs.getString( "email" ));
contato.setEndereco(rs.getString( "endereco" ));
contatos.add(contato); } rs.close(); stmt.close(); returncontatos;
25. Result Set
- O mtodo executeQuery(), da interface Statement, retorna um
objeto ResultSet.
-
- Cursor para as linhas de uma tabela
-
- Pode-se navegar pelas linhas da tabela recuperar as informaes
armazenadas nas colunas
- Os mtodos de navegao so:next(), previous(), absolute(), first()
e last()
- Mtodos para obteno de dados:getInt(), getString(),
getDate()...
26. Recuperando dados de ResultSets
-
- Usam-se mtodos dos ResultSets come ados por get
-
- Recuperam um dado de acordo com o tipo
-
- Como parmetros podem ser usados a posio do campo (comenando de
1) ou o nome do campo na tabela
- Ex:rs. getInt( codigo ) ou rs.getInt(1) rs. getString(
descricao ) ou rs.getString(2)
27. Recuperando dados de ResultSets getBigDecimal()DECIMAL 28.
Passos para uso do JDBC
- 1. Carregar o driver 2. Estabelecer uma conexo com o BD 3.
Criar uma declarao (PreparedStatement) e setar os parmetros 4.
Executar o comando ou consulta SQL 5. Processar o resultado 6.
Fechar a conexo Em Java: 1. Class.forName("com.mysql.jdbc.Driver");
2. Connection con = DriverManager.getConnection
("jdbc:mysql://localhost/teste", "root","root"); 3.
PreparedStatement ps = con.prepareStatement(); 4.1.
ps.executeUpdate("delete from Produtos"); // ou 4.2. ResultSet rs =
ps.executeQuery("select * from Produtos"); 5. while(rs.next()) {
System.out.println(Cd.: " + rs.getString(1) + " Desc: " +
rs.getString(2)); }6. con.close();
29. Fechando recursos
- Statements, PreparedStatements, ResultSets e Connections
possuem um mtodo close().
- Sempre que esses recursos no forem mais utilizados, importante
fech-los.
- Ao fechar a conexo, PreparedStatements e ResultSets que esto
associados conexo sero automaticamente fechados.
- Exemplo de tratamento de excees:
try{ // ... }catch(SQLException e) { // ... }finally{ try{
con.close(); }catch(SQLException e) { // ... } } 30. Transaes
- Para permitir a criao de transaes com mais de um comando, o
modo de auto-commit deve ser desabilitado
- O mtodosetAutoCommit deve ser invocado no objeto do tipo
Connection passando-se o valor false para ele
-
- con.setAutoCommit(false) ;
- Para realizar, respectivamente, ocommitou orollbackem uma
transao utilize os seguintes mtodos do objeto Connection:
- Nota : a ps terminar o uso de uma conexo, feche-a invocando o
mtodoclose() da mesma
31. Fechando recursos com uso de transao // ... Connection conn
= null; try{ conn = ConnectionFactory.getConnection();
conn.setAutoCommit( false ); // ... conn.commit();
}catch(SQLException ex) { try{ conn.rollback(); }catch(SQLException
e) { // ... } }finally{ try{ conn.close(); }catch (SQLException
ex){ // ... } } 32. DataSource
- Representa uma fbrica de conexes para o banco de dados
fsico
-
- Alternativa ao mais adequada ao uso DriverManager
-
- Sua implementao de responsabilidade do fornecedor do banco de
dados
-
-
- Implementao Bsica cria conexes fsicas da mesma forma do
DriverManager
-
-
- Implementao de Pool de Conexes cria conexes que participaro de
um pool (esta abordagem usada em aplicaes multi-camadas)
-
-
- Implementao de Transaes Distribudas semelhante anterior exceto
pelo fato de trabalhar com transaes distribudas
33. DataSource
- DataSource ds =newOracleConnectionPoolDataSource(url);
- ds.getConnection(user, password);
... Context initContext =newInitialContext(); Context envContext
= (Context)initContext.lookup( "java:/comp/env" ); DataSource ds =
(DataSource)envContext.lookup( "jdbc/cefet" ); conn =
ds.getConnection()); ... 34. RowSet
-
- Interface disponvel a partir do JDBC 3.
-
- CachedRowSet pode ser usado em modo desconectado, permitindo
acesso ao banco mesmo aps ofechamentoda conexo. Depois, pode ser
retornado ao servidor para sincronizao com a base de dados.
-
- WebRowSet permite manipular dados de origem no-relacional
(XML).
-
- RowSets so uma boa representao de dados tabulares.
35. Verses do JDBC
-
- Interface DataSource para conexes gerenciadas por containers
JEE;
-
- Suporte a transaes distribudas;
-
- Interface RowSet, que permite cache do resultado de consultas
no cliente.
-
- Atualizaes em batch para envio de vrios comandos SQL de uma s
vez;
-
- Suporte a resultados rolveis (scrollable) e atualizveis para
navegao livre por um ResultSet;
-
- Atualizao direta do registro corrente em um ResultSet, sem
necessidade de enviar comandos de SQL update;
-
- Mapeamento de tipos definidos pelo usurio.
36. Verses do JDBC
-
- Save points, que permitem rollback parcial de uma transao;
-
- Parmetros nomeados em stored procedures;
-
- Forma padronizada de obter o valor de campos gerados
automaticamente pelo banco (identity e autoincrement).
37. Verses do JDBC
-
- Auto-loading de driver JDBC;
-
- Maior controle sobre pool de conexes e comandos;
-
- Suporte ao tipo rowid (identif.Fsica de registros em alguns
bancos como Oracle);
-
- Suporte ao padro SQL 2003;
-
- Excees mais especficas e no somente SQLException;
-
- Manipulao de XML e suporte a extenses do SQL para dados
XML.
38. Verses do JDBC
- A proposta original do JDBC 4.0, includo no Java 6,
disponibilizava novas interfaces Query e DataSet apoiadas por
anotaes para mapear diretamente operaes sobre o banco para mtodos e
atributos de classes.
- Infelizmente esse recurso foi cancelado, pois sua implementao
estava atrasada e a Sun no queria atrasar a release final do Java 6
que trouxe o JDBC 4.
- Talvez esse recurso seja includo no Java 7.
39. Verses do JDBC classUser { int userID ; Stringname ;
Stringdepartment ; } interfaceMyQueriesextendsBaseQuery { @
Query(sql= "select * from user" ) DataSet getAllUsers(); @
Query(sql= "select * from user where department= {department}" )
DataSet getDepartmentUsers(String department); @ Update(sql=
"delete from user where name= {userName}" ) intdeleteUser(String
userName); @ Update(sql= "update user set department={department}
where " +"name= {userName}" ) intupdateDeparment(String userName,
String department); } 40. Verses do JDBC ... Connection c =
myDataSource.getConnection(); MyQueries q =
c.createQueryObject(MyQueries. class ); DataSet users =
q.getAllUsers(); for(User u: users) { System.out.println( "User's
name is: "+ user.name; } ... ... Connection c =
myDataSource.getConnection(); MyQueries q =
c.createQueryObject(MyQueries. class ); DataSet users = q.create();
User user =newUser(); user.setUserID(1); user.setName( "Joe" );
user.setDeparment( "Accounting" ); users.insert(user); ... 41.
Referncias
- Apostila da Caelum FJ-21 Java para desenvolvimento Web Captulo
2 - JDBC
-
- http://pt.wikipedia.org/wiki/JDBC
-
- http://java.sun.com/javase/technologies/database/
-
- http://developers.sun.com/product/jdbc/drivers
- Pgina sobre o uso de Java com MySQL
-
- http://dev.mysql.com/usingmysql/java/