Java 16 Jdbc
-
Upload
regis-magalhaes -
Category
Documents
-
view
4.836 -
download
2
Transcript of Java 16 Jdbc
- 1. JDBC Java Database Connectivity
-
- Regis Pires Magalhes
-
-
- [email_address]
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.
- Desvantagens:
-
- 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
-
- Pacote:java.sql
- 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
- Tipo 1: ponte JDBC-ODBC
-
- 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.
- Tipo 4: soluo 100% Java
-
- 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
- Vantagens:
-
- flexibilidade (cliente/server ou embarcado);
-
- suporte das principais IDEs (Netbeans e Eclipse).
-
- Pequeno: cerca de 2MB
-
- 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
-
- Comandos GRANT e REVOKE.
-
- 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
- Executando o ij:
-
- java -jar derbyrun.jar ij
-
- ou
-
- 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
- Usando o ij
-
- ij>connect 'jdbc:derby:posbd4; create=true';
-
- ij> show tables;
-
- 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> describe clientes;
-
- 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;
-
- ij> disconnect;
-
- ij> exit;
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
- Criar um Statement
- Executar uma query ou update
- Processar os resultados
- Fechar a conexo
13. Conectando com o banco
- Adicionar o driver JDBC ao classpath
-
- MySQL:
-
-
- mysql-connector-java-5.1.6-bin.jar
-
-
- Derby:
-
-
- derby.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
- Uso do driver
-
- O servio que permite o uso do driver delegado para um gerente de drivers: oDriverManager .
- Obtendo a conexo
-
- Atravs doDriverManager , usamos o mtodogetConnectioncom uma url que indica que banco queremos acessar.
-
- O padro da url para acessar o mysql :
-
-
- jdbc:mysql://host/banco
-
-
-
- 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:
-
- jdbc:subprotocolo:dsn
-
-
- Subprotocolo identifica qual driver ser instanciado.
-
-
-
- dsn - nome que o subprotocolo usa para identificar um servidor e/ou base de dados.
-
- Exemplos de URL:
-
- 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
- Opo 1
- String sql ="insert into contatos (nome,email,endereco) values ('"+ nome +"', '"+ email +"', '"+ endereco +"')" ;
- Opo 2
- String sql ="insert into contatos (nome,email,endereco) values (?,?,?)" ;
- Vantagens da opo 2:
-
- Melhor legibilidade
-
- Evita SQL Injection (injeo de SQL)
-
- Pode ser pre-compilada pelo SGBD
22. Comandos SQL
- A execuo de comandos SQL pode ser feita via:
-
- Statement
-
- PreparedStatement
-
-
- 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
- Mtodos getXXX
-
- 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:
-
- con.commit()
-
- con.rollback()
- 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
- javax.sql.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
- Java 1.1 JDBC 1.0
- Java 1.2 JDBC 2.0
-
- Interface DataSource para conexes gerenciadas por containers JEE;
-
- Suporte a transaes distribudas;
-
- Interface RowSet, que permite cache do resultado de consultas no cliente.
- Java 1.3 JDBC 2.1
-
- 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
- Java 1.4 JDBC 3
-
- 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
- Java 6 JDBC 4
-
- 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
- JDBC na Wikipedia:
-
- http://pt.wikipedia.org/wiki/JDBC
- Java com DB na Sun:
-
- http://java.sun.com/javase/technologies/database/
- Encontrando Drivers JDBC
-
- http://developers.sun.com/product/jdbc/drivers
- Pgina sobre o uso de Java com MySQL
-
- http://dev.mysql.com/usingmysql/java/