Acesso a Bancos de Dados em Java (JDBC) Jomi Fred Hübner Universidade Regional de Blumenau Departamento de Sistemas e Computação
Roteiro Introdução Objetivo da JDBC Vantagens Visão geral do acesso a SGBDs Drivers JDBC Conexão com o BD Envio de comandos e recebimento de resultados Informações sobre o tipo da tabela Transações
1. Introdução JDBC é uma API (Application Program Interface) para acesso a SGBD (Sistemas Gerenciadores de Banco de Dados) relacionais por meio de comandos SQL (Structured Query Language) Programa Java API JDBC SGBD
Vantagens a API para programação do sistema é a mesma para qualquer SGBD, não há necessidade de se desenvolver aplicações voltadas (e amarradas) para um BD específico permite a construção de páginas WWW que acessam BD pois dispensa a configuração da máquina cliente mantém a independência de plataforma da linguagem Java A aplicação roda em qualquer sistema operacional acessando qualquer BD!?
Visão geral A API encapsula o estabelecimento da conexão com o BD o envio de comandos SQL o processamento dos resultados Exemplo Connection con = DriverManager.getConnection ( "jdbc:odbc:sample", "login", "password"); Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery( "SELECT a, b, c FROM Table1"); while (rs.next()) { int x = getint("a"); String s = getstring("b"); float f = getfloat("c"); }
Comparação com Microsoft ODBC ODBC tem o mesmo propósito e existe para várias plataformas, por que não usar ODBC? Os drivers ODBC são escritos em C, o que limita a portabilidade e auto-instalação dos programas Java o ODBC tem que ser instalado e configurado na máquina do cliente imagine instalar e configurar o ODBC em 40.000.000 computadores da Internet! Entretanto, bancos de dados que utilizam ODBC podem ser utilizados em aplicações Java via a ponte JDBC-ODBC.
Modelos de acesso ao SGBD Arquitetura de duas camadas: cliente/servidor cliente servidor driver oracle aplicação Java api JDBC driver sybase ponte ODBC SQLNet TDS ODBC Oracle SyBase Access Desvantagens o driver JDBC deve ser carregado no cliente se a aplicação for um applet, o SGBD deve estar na mesma máquina que o servidor Web
Arquitetura de três camadas cliente servidor middleware aplicação Java ou applet servidor Java JDBC Dirvers RMI, CORBA, Socket, JDBC independente,... Oracle SyBase outros Dispensa o cliente de conhecer o protocolo do SGBD e, consequentemente, carregar seu driver Melhora o tempo de resposta em aplicações na Internet
2. Tipos de drivers JDBC Ponte com ODBC Acesso ao driver nativo a API JDBC chama procedimentos do driver nativo do SGBD instalado na máquina local Driver com protocolo proprietário escrito em Java a comunicação entre o cliente e a SGBD da-se no protocolo do SGBD, contudo, como o driver é escrito em Java, dispensa a instalação/configuração do driver no cliente. Driver independente de SGBD utilizado pelo cliente para conectar-se com o middleware os dois primeiros tipos são recomendados para Intranets, pois exigem configuração da máquina cliente os outros dois podem ser utilizados na Internet, preferencialmente o último, que tem menor tempo de download.
Carga do driver no programa Java Vários drivers podem ser carregados com o método Class.forName. Por exemplo: Class.forName ("oracle.jdbc.driver.oracledriver"); Class.forName ("sun.jdbc.odbc.jdbcodbcdriver"); a JVM deve poder encontrar estas classes para aplicações, a variável de ambiente CLASSPATH deve incluir os drivers para applets, o parâmetro archive deve apontar para o driver.
3. Conexão com o BD A abertura da conexão é feita pelo método getconnection, que recebe uma URL (Universal Resource Location) como argumento O DriverManager tenta conectar com o primeiro driver carregado, se não consegue, tenta o driver seguinte JDBC URLs são formadas por: um protocolo (normalmente jdbc), um sub-protocolo (normalmente é o tipo de driver) e informações para o SGBD. ponte ODBC Connection conn = DriverManager.getConnection ("jdbc:odbc:sample", "admin", "temp"); // o serviço Sample tem que estar configurado no // ODBC manager da máquina protocolo nativo com driver Java Connection conn = DriverManager.getConnection ("jdbc:mysql://host:1521/test?user=demo&password=sec");
4. Envio de comandos SQL O envio de um comando SQL é feito por meio de um Statement Um statement pode ser criado a partir de três classes: Statement é utilizado para enviar comandos SQL simples PreparedStatement o comando SQL é pré-compilado e utilizado posteriormente, sendo mais eficiente nos casos onde o mesmo comando é utilizado várias vezes CallableStatement utilizado para chamar procedimentos SQL armazenados no BD
A classe Statement Um objeto desta classe é criado pelo envio da mensagem createstatement à conexão com o BD Class.forName ("sun.jdbc.odbc.jdbcodbcdriver"); Connection conn = DriverManager.getConnection ("jdbc:odbc:sample", "admin", "temp"); Statement stmt = conn.createstatement (); Execução de comandos SQL método executequery: usado para comandos SQL que retornam uma tabela ResultSet rs = stmt.executequery("select * from EMP"); método executeupdate: usado para executar comandos SQL que alteram a tabela, retorna o número de colunas alteradas
5. Obtenção do resultado A classe ResultSet oferece à aplicação a tabela resultante de um Select e mantém um cursor posicionado em uma linha da tabela. Inicialmente este cursor está antes da primeira linha e a mensagem next() movimenta o cursos para frente. Permite à aplicação pegar os dados das colunas da linha corrente através de mensagem getxxx(<cloluna>). XXX é o tipo da coluna <coluna> é o nome da coluna ou sua posição (a partir de 1) ResultSet rs = stmt.executequery( "select a, b, c from table1"); while (rs.next()) { int x = rs.getint("a"); String s = rs.getstring(2); float f = rs.getfloat("c");
Exemplo import java.sql.*; class ExAcessoMySQLApp { public static void main (String args []) throws Exception { Class.forName ("com.mysql.jdbc.driver").newinstance(); Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/test"); Statement stmt = conn.createstatement(); ResultSet rset = stmt.executequery ( "select ENAME from EMP"); } while (rset.next ()) System.out.println (rset.getstring(1)); }
Meta dados de um ResultSet Permite obter informações sobre o tipo de tabela que resultou o select. Quais os nomes e os tipos das colunas Se a coluna do tipo é numérico com sinal Se a coluna pode ser alterada... ResultSet result = stmt.executequery( "SELECT * FROM TabEx ORDER BY id DESC"); ResultSetMetaData meta = result.getmetadata(); int columns = meta.getcolumncount(); for (int i=1;i<=columns;i++) { System.out.println (meta.getcolumnlabel(i) + "\t" + meta.getcolumntypename(i)); }
Criação e inserção numa tabela Exemplo de criação e inserção em uma tabela utilizando a mensagem executeupdate ao Statement. Statement st = con.createstatement(); st.executeupdate( "create table Alunos ( nome varchar (32), idade integer);"); st.executeupdate("insert into Alunos values ('Jonas',18);"); st.executeupdate( update Alunos set idade = 18 where idade = 20"); con.close();
Transações Uma transação é um conjunto de Statements que são validados no BD com commit ou cancelados com rollbabk Por default, todos os comandos no JDBC são auto-commit. con.setautocommit(false); // muda o default Statement s = con.createstatement(); try { s.executeupdate("sql statement 1"); s.executeupdate("sql statement 2"); con.commit(); // valida os 2 updates } catch (Exception e) { con.rollback(); // senão, desfaz os updates }