JDBC Java DataBase Connectivity
JDBC??? Uma API que permite o acesso a virtualmente qualquer fonte de dado tabular a partir de um programa escrito em Java O que é uma uma fonte de dados tabular? acesso a virtualmente qualquer fonte de dado, de banco de dados relacional a planilhas e arquivos. Documentação JDBC O nosso foco será o acesso a uma base de dados MySQL 2
Arquitetura Geral Qual a vantagem dessa arquitetura para o desenvolvedor? 3
Arquitetura JDBC Oracle Driver Oracle Aplicação java JDBC Rede DB2 Driver DB2 MySQL Driver 4 MySQL
O Básico para se usar um banco de dados em Java 0.Carga do driver adequado 1.Estabelecer uma conexão(connection) 2.Criar comandos JDBC(Statements) 3.Executar comandos SQL 4.Obter Resultados (ResultSet) 5.fechar Conexões 5
0. Carga do driver... import java.sql.*; Class.forName("com.mysql.jdbc.Driver"); Carga da hierarquia de classes própria para o banco de dados mysql Class.forName carrega a classe especificada 6
1. Estabelecer uma conexão Connection conn = DriverManager.getConnection( "jdbc:mysql://ender eçointernetdabase/abase", username, passwd); Estabelece uma conexão com a base obtendo um objeto da classe Connection 7
2. Criar comando(s) JDBC Statement stmt = conn.createstatement() ; Cria Objetos da classe Statement para o envio de comandos SQL para a base de dados 8
Executando Comandos SQL String createagenda = "Create table agenda " + "(Name VARCHAR(32), " + "fone VARCHAR(10)"; stmt.executeupdate(createagenda); String insertagenda = "Insert into agenda values + "( \ maria\, \ 9236511179\ )"; stmt.executeupdate(insertagenda); 9
Manipulando o Resultado String queryagenda = "select * from agenda"; ResultSet rs = stmt.executequery(queryagenda); while (rs.next()) { String nome = rs.getstring("nome"); String fone = rs.getstring("fone"); } 10
Fechar Conexão stmt.close(); con.close(); 11
Transações e JDBC JDBC permite que comandos SQL sejam agrupados em uma única transação; Controle da Transação é feito via objeto Connection, cujo o modo default é auto-commit, i.e., cada comando sql é visto com uma transação O modo auto-commit pode ser desligado com o conn.setautocommit(false); E reativado com conn.setautocommit(true); Uma vez desligado, nenhum comando SQL será comprometido (comitado) até que se o faça explitamente atravês da seguinte chamada conn.commit(); Neste ponto todas as mudanças serão efetivadas definitivamente na base de dados. 12
Tratando erros com TryCatchFinally Programas devem sempre se recuperar e deixar a base de dados em um estado consistente. Se um comando no bloco try levanta uma exceção, pode-se capturá-la em uma das entradas catch correspondente; Como um bloco finally { } pode ser útil neste caso? Pode-se desfazer a transação no bloco catch { } ou fechar a conexão com o banco e liberar os recursos relacionados ao banco no bloco finally { } 13
Mapeando Tipos JDBC - Java 14
JDBC 2 O Result Set é navegável Statement stmt = conn.createstatement(resultset.type_scroll_insensitive, ResultSet.CONCUR_READ_ONLY); String query = select students from class where type= not sleeping ; ResultSet rs = stmt.executequery( query ); rs.previous(); / / volta no RS rs.relative(-5); / / volta 5 registros em relação a posição corrente rs.relative(7); / / avança 7 em relação a posição corrente rs.absolute(100); / / avança para o 100-ésimo registro 15
Metadados do BD Um Objeto Connection' de uma BD é capaz de fornecer informações do schema que descrevem as tabelas e outras informações; Essa informação está disponível atravês do objeto DatabaseMetaData. 16
Metadado do BB - exemplo Connection conn =. ; DatabaseMetaData dbmd = conn.getmetadata(); String catalog = null; String schema = null; String table = sys% ; String[ ] types = null; ResultSet rs = dbmd.gettables(catalog, schema, table, types ); 17
JDBC Metadados do RS public static void printrs(resultset rs) throws SQLException { ResultSetMetaData md = rs.getmetadata(); // número de colunas int ncols = md.getcolumncount(); // imprime os nomes das colunas for(int i=1; i < ncols; ++i) System.out.print( md.getcolumnname( i)+","); / / imprime todo o resultset while ( rs.next() ) { for(int i=1; i < ncols; ++i) System.out.print( rs.getstring( i)+","); System.out.println( rs.getstring(ncols) ); } 18 }
Referências JDBC Data Access API JDBC Technology Homepage http://java.sun.com/products/jdbc/index.html JDBC Database Access The Java Tutorial http://java.sun.com/docs/books/tutorial/jdbc/index.html JDBC Documentation http://java.sun.com/j2se/1.4.2/docs/guide/jdbc/index.html java.sql package http://java.sun.com/j2se/1.4.2/docs/api/java/sql/package-summary.html JDBC Technology Guide: Getting Started http://java.sun.com/j2se/1.4.2/docs/guide/jdbc/getstart/gettingstartedtoc.fm.html JDBC API Tutorial and Reference (book) http://java.sun.com/docs/books/jdbc/ 19
JDBC JDBC Data Access API JDBC Technology Homepage http://java.sun.com/products/jdbc/index.html JDBC Database Access The Java Tutorial http://java.sun.com/docs/books/tutorial/jdbc/index.html JDBC Documentation http://java.sun.com/j2se/1.4.2/docs/guide/jdbc/index.html java.sql package http://java.sun.com/j2se/1.4.2/docs/api/java/sql/package-summary.html JDBC Technology Guide: Getting Started http://java.sun.com/j2se/1.4.2/docs/guide/jdbc/getstart/gettingstartedtoc.fm.html JDBC API Tutorial and Reference (book) http://java.sun.com/docs/books/jdbc/ 20