Java 16 Jdbc

Embed Size (px)

Citation preview

  • 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/