JAVA Marcio de Carvalho Victorino 1 JDBC - Java Database Connectivity 2 1
JDBC conceito JDBC é uma API (Application Program Interface) para acesso a SGBD s (Sistemas Gerenciadores de Banco de Dados) relacionais por meio de comandos SQL (Structured Query Language). Programa Java (cliente) protocolo API JDBC SGBD 3 JDBC vantagens A API para programação do sistema é a mesma para qualquer SGBD. Por isso, não há necessidade de se desenvolverem aplicações voltadas para um SGBD específico, pois elas não estão atreladas a uma arquitetura proprietária. Com isso, fica assegurada a independência de plataforma de Java ("Write Once, Run Anywhere TM "). Permite a construção de páginas WWW dinâmicas que acessam BANCO DE DADOS. Nenhuma configuração é requerida no lado cliente. 4 2
JDBC x Microsoft ODBC Se ODBC tem o mesmo propósito e existe para várias plataformas, então por que não usá-lo? Os drivers ODBC são escritos em C, o que limita a portabilidade e auto-instalação dos programas Java. ODBC é bem mais complexo para se aprender. 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, banco de dados que utilizam ODBC podem ser utilizados em aplicações Java via a ponte JDBC-ODBC. 5 JDBC Carga do driver Vários drivers podem ser carregados com o método Class.forName( String s). Por exemplo: Class.forName ( oracle.jdbc.driver.oracledriver ); Class.forName ( sun.jdbc.odbc.jdbcodbcdriver ); - O ClassLoader tenta localizar e carregar uma instância da classe ou interface designada pela String s. - A JVM deve poder encontrar a classe especificada. Caso essa não seja encontrada, é lançada uma exceção ClassNotFoundException. - Para aplicações, a variável de ambiente CLASSPATH deve incluir os drivers. 6 3
JDBC 4 tipos de drivers 1. Ponte com ODBC : o tipo provido pela Sun. Apropriado para uso experimental e para situações na qual não haja nenhum outro driver disponível. 2. Driver independente de SGBD: converte chamadas JDBC em chamadas à API do cliente para Oracle, Sybase, Informix, DB2 ou outro SGBD. 3. Acesso ao driver nativo: a API JDBC chama procedimentos do driver nativo do SGBD instalado na máquina local. 4. Driver com protocolo proprietário escrito em Java: a comunicação entre o cliente e o SGBD dá-se no protocolo do BD, contudo, como o driver é escrito em Java, dispensa a instalação ou configuração do driver no cliente. 7 JDBC Conexão com o BD A abertura da conexão (sessão) é feita pelo método getconnection da classe DriverManager (o serviço básico para gerenciamento de um conjunto de drivers JDBC). getconnection(string url) getconnection(string url, String user, String password) getconnection(string url, Properties info) - Retorna um objeto do tipo Connection. - A URL é composta de protocolo:subprotocolo:subnome. - O DriverManager tenta conectar com o primeiro driver carregado; se não consegue, tenta o driver seguinte. - Caso não seja localizado, é lançada uma exceção SQLException. - Properties: um objeto de coleção do tipo Hashtable (chave e valor), podendo ser usado para definir, dentre outras coisas, o usuário e a 8 senha. 4
JDBC Conexão com o BD A classe Connection public abstract void setautocommit(boolean autocommit) throws SQLException: determina o modo de commit conforme o parâmetro. public abstract void commit() throws SQLException: confirma todas as mudanças feitas até o ponto e libera todos os bloqueios efetuados pela conexão atual. public abstract void rollback() throws SQLException: desfaz todas as mudanças feitas até o ponto e libera todos os bloqueios efetuados pela conexão atual. 9 JDBC Conexão com o BD A classe Connection - cont. public abstract void close() throws SQLException: fecha a conexão e libera todos os recursos JDBC imediatamente. public abstract DatabaseMetaData getmetadata() throws SQLException:obtém metadados sobre a conexão atual. public abstract Statement createstatement() throws SQLException:cria o comando JDBC a partir da conexão atual. 10 5
JDBC Conexão com o BD - exemplo import java.sql.*;... java.util.properties props = new Properties(); props.put("user", objaccessmanager.getconta()); props.put("password", objaccessmanager.getsenha()); String url = "jdbc:odbc:temp//"+ "fava" +":6024/" + bancodedados; try { // carrega o driver da ponte jdbc-odbc Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // abre conexao com o banco de dados Connection con = DriverManager.getConnection(url, props); // Este banco não aceita autocommit //con.setautocommit( false ); //se o BD lida com transação } //Continua... 11 JDBC Conexão com o BD - exemplo catch(classnotfoundexception e) //Class.forName() { System.out.println("Classe do Driver JDBC não encontrada"); } catch(sqlexception e) //DriverManager.getConnection() { System.out.println( "Falha na conexão com o banco de dados:" ); System.out.println(e.getMessage(); } //FIM. 12 6
JDBC Criação do Statement Esta classe objetiva-se a executar um comando SQL e a obter o resultado produzido por esse. Apenas um ResultSet (resultado SQL) pode ser aberto a cada vez. Um objeto desta classe é criado pelo método createstatement a partir da conexão já estabelecida. Statement stmt = con.createstatement( ); 13 JDBC a classe Statement Dois dos seus principais métodos são: - ResultSet executequery(string sql): usado para comandos SQL que retornam uma única tabela (ResultSet), tipicamente o SELECT. - int executeupdate(string sql): usado para executar comandos SQL que alteram a tabela (CREATE, INSERT, UPDATE ou DELETE). Retorna o número de colunas alteradas. 14 7
JDBC Envio de comandos SQL O envio de um comando SQL é feito por intermédio dos métodos executequery(string s) e executeupdate(string s) de um Statement, da seguinte forma: - executequery: ResultSet rs = stmt.executequery ( SELECT * FROM Alunos ); - executeupdate: stmt.executeupdate ( CREATE TABLE Alunos (nome VARCHAR(32), idade INTEGER); ); stmt.executeupdate ( INSERT INTO Alunos VALUES( Jonas, 18); ); 15 JDBC Envio de comandos SQL Obtenção do resultado A classe ResultSet oferece à aplicação a tabela resultante de um SELECT. - Mantém um cursor posicionando em uma linha da tabela. De início, esse cursor está posicionado antes da primeira linha. O método next( ) é que movimenta o cursor para o próximo registro. - Permite à aplicação capturar os dados de cada coluna da tupla (linha) corrente através do método getxxx(<coluna>), onde XXX é o tipo da coluna e <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 ); } 16 8
JDBC Envio de comandos SQL Equivalência de tipos Tipo JAVA String java.math.bigdecimal boolean byte short int long float double byte[] java.sql.date java.sql.time java.sql.timestamp Tipo JDBC VARCHAR or LONGVARCHAR NUMERIC BIT TINYINT SMALLINT INTEGER BIGINT REAL DOUBLE VARBINARY or LONGVARBINARY DATE (dia + mês + ano) TIME (hora + minutos + segundos) TIMESTAMP (date + time + nanosegundos) Veja também JDBC Guide : Mapping SQL and Java Types. 17 JDBC - Transações Uma transação é um conjunto de um ou mais comandos que são executados juntos como uma unidade: se não for possível que todos sejam executados, então nenhum deles será executado. Uma transação é um conjunto de Statements que são validados no BD com commit ou cancelados com rollback. Transações podem ajudar a preservar a integridade dos dados de uma tabela. Por default, todos os comandos no JDBC são auto-commit. con.setautocommit(false); // muda o default Statement stmt = con.createstatement(); stmt.executeupdate(... ); stmt.executeupdate(... ); if (...) con.commit(); //se Ok, valida os 2 updates else con.rollback(); //senão, desfaz os updates 18 9
Fim 19 10