Linguagens de Programação Orientadas a Objetos Pós-Gradução(Lato-Sensu) em Sistemas de Banco de Dados - UFPa Marco Fagundes [email protected] Aula 31 a 35 - Conectividade com Banco de Dados (JDBC) http://www.ufpa.br/sampaio/bd2003/lpoo Elaborado com base no material cedido pelo prof. Admilson Ribeiro Marco Fagundes 1 de 22 Acessando BD com JDBC O JDBC - “Java Database Connectivity” É uma API para acesso a SGBDs em Java JDBC não leva em consideração características intrínsecas sobre uma fonte de dados específica ou sobre o esquema de armazenamento de dados Através de JDBC pode-se enviar comandos SQL para o BD e processar os resultados 2 de 22 Funcionamento do JDBC Deve-se ter um driver JDBC instalado e o ambiente de execução configurado Na aplicação o driver JDBC é carregado e registrado para uso Em seguida uma conexão com o banco de dados é criada Faz a instanciação de um objeto do tipo “Statement” Submete-se as instruções SQL para o SGBD por meio do objeto instanciado A partir deste ponto os resultados podem ser acessados Finalmente deve-se fechar a conexão 3 de 22 Estrutura do JDBC Aplicativo Java API JDBC Gerenciador de driver JDBC Ponte JDBC-ODBC ODBC e BD Drivers Driver A ... Drivers JDBC Protocolo de Acesso Proprietários dos BDs 4 de 22 Funcionamento do JDBC As classes JDBC estão no pacote java.sql Os programas em Java usam objetos e métodos deste pacote para ler e escrever de uma fonte de dados. Um programa que usa JDBC necessitará de um driver para a fonte de dados. • JDBCODBC.DLL para o windows. 5 de 22 Tipos Importantes Interfaces • Driver • Connection • Statement • PreparedStatement (sql com parametros) • CallableStatement (stored procedure) • ResultSet Classes • DriverManager • Date • Time 6 de 22 Acessando BD ODBC com a ponte JDBC-ODBC A ponte JDBC-ODBC é implementada como JdbcOdbc.class e uma biblioteca nativa para acessar o driver ODBC(JDBCODBC.DLL) A vantagem desta ponte é que o JDBC pode acessar quase todos os bancos de dados Os drivers ODBC estão amplamente disponíveis ODBC é uma fina camada sobre o JDBC 7 de 22 Classes JDBC A classe superior na hierarquia é a DriverManager O JDBC identifica um banco de dados com um URL: • jdbc:odbc:<ODBC DSN>:User=<username>:PW=<password> DriverManager retorna um objeto Connection com o uso do método getConnection() A classe Connection efetua a conexão com banco de dados Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection("jdbc:odbc: odbcContAcad", "", ""); 8 de 22 Classes JDBC As operações de conexão e acesso a banco devem ser realizadas em um bloco try...catch Por exemplo: try{ .... } catch (SQLException ex){ System.out.println(ex.getMessage()); } catch (java.lang.Exception ex){ System.out.println(ex.getMessage()); } //fim catch 9 de 22 Classes JDBC Cria-se os objetos Statement / PreparedStatement / CallableStatement Quando o método executeQuery() é executado, um objeto ResultSet é retornado O ResultSet contém linhas de dados que são analisadas com o método next() O método executeUpdate() faz atualizações e exclusões e retorna o número de linhas afetadas 10 de 22 Aplicativo JDBC Uma instrução SQL pode ser executada imediatamente(objeto Statement) Uma instrução SQL pode ser compilada(objeto PreparedStatement) Uma instrução SQL pode ser uma chamada para uma Stored Procedure(objeto CallableStatement) 11 de 22 Aplicativo JDBC O método executeQuery() é utilizado para a submissão de comandos de consulta ao BD(SELECT) Qdo o método executeQuery() é executado, um objeto ResultSet é retornado O ResultSet contém linhas de dados que são analisadas com o método next() 12 de 22 Aplicativo JDBC O ResultSet contém linhas de dados que são analisadas com o método next() Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM Turma"); while(rs.next()) { System.out.println(rs.getString(1)); } O método next() • Retorna um boolean • Posiciona o cusor na próxima linha (inicialmente o cursor está antes da primeira linha String getString(int indiceColuna) String getString(String nomeColuna) getString, getInt, getDouble, etc. 13 de 22 Aplicativo JDBC As instruções SQL de atualização(INSERT e UPDATE) e exclusão (DELETE) retornam um número inteiro que denota o número de linhas afetadas Por exemplo: Statement stmt = con.createStatement(); int i = stmt.executeUpdate(”INSERT INTO Turma VALUES (\’001\’, \’Turma001\’) "); 14 de 22 Aplicativo JDBC Para essas instruções e também para a execução de comando DDL(CREATE, DROP, etc.), o método executeUpdate() é utilizado Por Exemplo: Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(”INSERT INTO Turma VALUES (\’001\’, \’Turma001\’) "); while(rs.next()) { System.out.println(rs.getString(1)); } 15 de 22 PrepareStatement Statement pré-compilado Melhoria de performance Utilização de parâmetros String sql = “SELECT * FROM Turma WHERE CodTurma =?”; PrepareStatement ps = con.prepareStatement(sql); ps.setString(1,”001”); ResultSet rs = ps.executeQuery(); 16 de 22 CallableStatement Utilizado na chamada de stored procedures String proc = “{call cons_Turmas”; CallableStatement cs = con.prepareCal(proc); cs.execute(); 17 de 22 Transações Corresponde a um grupo de operações de devem ser executadas de forma atômica. Para implementar uma transação deve-se • Iniciar a transação • Executar comandos • Confirmar ou Desfazer a transação Utilizam-se os métodos da interface Connection: • setAutoCommit (boolean autoCommit) – autoCommit true (o commit é realizado automaticamente após o término de cada operação executada pelo Statement) • commit() : transação com sucesso • roolback(): falha na transação 18 de 22 Transações ... try{ con.setAutoCommint(false); stmt.executeUpdate(...); con.commit(); catch (SQLException ex){ System.out.println(ex.getMessage()); con.rollback(); } catch (java.lang.Exception ex){ System.out.println(ex.getMessage()); } //fim catch con.setAutoCommint(true); ... 19 de 22 Acesso ao BD - Exemplo ODBC-JDBC O acesso a um banco de dados pode ser feito por meio do JDBC e da ponte JDBC-ODBC Precisa-se configurar uma fonte de dados ODBC O método getConnection() requer um nome de fonte de dados(DSN), ID do usuárioe senha para a fonte de dados ODBC O programa ODBC setup permite que se configure a fonte de dados 20 de 22 Tipos de drivers JDBC Tipo Tipo Tipo Tipo 1: 2: 3: 4: Ponte JDBC-ODBC Parte Java, parte código nativo Servidor intemediário de acesso a dados Puro Java 21 de 22 Tipo 1: Ponte JDBC-ODBC Aplicação API JDBC Ponte JDBC/ODBC ODBC Banco de Dados 22 de 22 Tipo 1: Ponte JDBC-ODBC Acompanha o J2SE Deve-se ter um driver ODBC disponível na máquina Faz acesso JDBC usando drivers ODBC Perde em performance 23 de 22 Tipo 2: Java-Nativo Aplicação API JDBC Driver JDBC API Nativa Banco de Dados 24 de 22 Tipo 2: Java-Nativo Chamadas à API JDBC são convertidas em chamadas à API do BD Performance melhor que o do Tipo 1 25 de 22 Tipo 3: Servidor Intermediário Aplicação API JDBC Driver JDBC Servidor de drivers JDBC Driver Nativo Banco de Dados 26 de 22 Tipo 3: Servidor Intermediário Traduz chamadas JDBC para um protocolo de rede independente de BD O servidor intermediário traduz as mensagens para o protocolo nativo do BD O servidor pode se conectar com vários tipos de BD Servidor de Aplicações 27 de 22 Tipo 4: Puro Java Aplicação API JDBC Driver JDBC Banco de Dados 28 de 22 Tipo 4: Puro Java Performance melhor que as dos tipos anteriores Chamadas à API JDBC são convertidas para o protocolo de rede usado pelo BD Drivers deste tipo são mais simples de usar e instalar Ex: thin -> Oracle 29 de 22