XV Simpósio Brasileiro de Bancos de Dados 2-6 de Outubro de 2000 João Pessoa - Paraíba, Brasil Integrando Java e Banco de Dados (Tutorial) por Jorge Henrique Cabral Fernandes Departamento de Informática e Matemática Aplicada Universidade Federal do Rio Grande do Norte
Conteúdo Referências Introdução O Modelo Computacional Um Exemplo Simples Elementos da API JDBC 1.0 Aspectos Avançados da API JDBC Exemplo de Sistema Three-Tier
Referências JDBC TM - Connecting Java and Databases. Sun Microsystems, 1996 JDBC Database Access, by Maydene Fisher (Java Tutorial, Sun Microsystems, 1999) JDBC Home Page http://java.sun.com/products/jdbc
JDBC TM : Introdução JDBC Facilita a integração entre programas Java e SGBDs Relacionais Suporta a execução de comandos SQL através de uma API definida em Java. Call Level Interface Pacote java.sql, integrado ao núcleo do JDK TM Aplicações, Applets, Servlets ou quaisquer outros programas Java podem: Estabelecer conexão com base de dados Enviar comandos SQL Processar resultados
Modelo Computacional Cliente getconn() Aplicação createstmt() next(); next();next(); get*( Col-n ); get*(n); execquery() execupdate() Col-1 Col-2... Col-n Conn Stmt ResultSet Servidor SGBD Relacional Bases de Dados DriverMngr JDBC API Java CORE APIs Driver A B C
JDBC 1.0 Um Exemplo Simples
import java.sql.*; public class Select { static { Um try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Exemplo Simples} catch ( ClassNotFoundException cnfe) { System.out.print(cnfe.toString()); } } public static void main(string[] args) { try { Connection conn = DriverManager.getConnection( "jdbc:odbc:banco_de_java", user", password"); Statement stmt = conn.createstatement(); ResultSet rs = stmt.executequery("select numero, saldo FROM contas"); System.out.println("Resultados da consulta"); while (rs.next()) { String numero = rs.getstring(1); int saldo = rs.getint(2); System.out.println(" Conta Bancária número:["+numero+"] Saldo:["+saldo+"]"); } stmt.close(); conn.close(); } catch (SQLException ex) { ex.printstacktrace(); } System.exit(0); } }
Principais Elementos da API JDBC Usados no Exemplo Carregar Driver Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Estabelecer Connection Connection connection = DriverManager.getConnection( "jdbc:odbc:bancodejava" /*JDBC URL*/,"jorge","jhcf"); Criar Statement Statement statement = connection.createstatement(); Executar Queries ResultStatement result = statement.executequery( "SELECT * FROM contas WHERE numero =\'1\' ); Executar Updates statement.executeupdate( "UPDATE contas SET saldo = 100 WHERE numero = \'1\'"); Fechar Statement e Connection statement.close(); connection.close();
JDBC 1.0: pacote java.sql Interfaces Driver Connection DatabaseMetaData ResultSet ResultSetMetaData Statement PreparedStatement CallableStatement Classes java.util.date Date Time Timestamp DriverManager DriverPropertyInfo Types Exceções SQLException SQLWarning DataTruncation
Classes do Exemplo Driver DriverManager Connection Statement ResultSet SQLException
Driver (interface) Cria uma instância e registra-se junto ao DriverManager quando a classe é carregada Conecta-se a um tipo de SGBD específico Principais Métodos boolean acceptsurl(string) Connection connect(string, Properties) boolean jdbccompliant()
Java, JDBC e JDBC Drivers Aplicação Java JDBC DriverManager JDBC Net Driver Protocolo Middleware JDBC JDBC-ODBC Bridge Driver ou Native API-Partly Java Driver ODBC & DB Drivers Protocolo ODBC e/ou Proprietário Native Protocol Pure Java Driver Protocolo Proprietário JDBC Connector SGBD Relacional A B C
Categorias de Drivers para JDBC 1 - JDBC-ODBC Bridge plus ODBC driver ALL JAVA? No; Protocolo: Direct 2 - Native API partly-java driver ALL JAVA? No; Protocolo: Direct 3 - JDBC-Net pure Java Driver ALL JAVA? Yes ; Protocolo: Requer Connector 4 - Native protocol pure Java Driver ALL JAVA? Yes; Protocolo: Direct
DriverManager (classe) Gerencia um conjunto de drivers JDBC disponíveis. Testa qual deles é mais apropriado para uma dada conexão Busca o nome dos drivers para carga na propriedade jdbc.drivers da classe System. Ex: jdbc.drivers=sun.jdbc.odbc.jdbcodbcdriver:wombat.sql.driver Principais Métodos Connection getconnection(string, String, String) registerdriver(driver) get(set)logintimeout(int) get(set)logstream(printstream)
Connection (interface) Representa uma sessão junto a uma base de dados específica Gerencia a execução de comandos (Statement) e o retorno de resultados (ResultSet) Por default, realiza um commit após a execução de cada Statement. Principais Métodos Statement createstatement(); close(), commit(), rooback(), setautocommit(boolean b) DatabaseMetaData getmetadata(); PreparedStatement preparestatement(string sql); CallableStatement preparecall(string sql);
Statement Executa comandos estáticos SQL A cada momento, apenas um ResultSet por Statement Principais Métodos ResultSet executequery(string sql) SQL statement SELECT int executeupdate(string sql) SQL statement INSERT, UPDATE ou DELETE close(); cancel(); get(set)maxrows(); get(set)maxfieldsize();
ResultSet Tabela de dados gerada pela execução de um comando executequery() Linhas são acessadas seqüencialmente - next(); Colunas são acessadas em qualquer ordem métodos getxxx(int collumnindex String collname) * getboolean(), _Byte(), _Int(), _Float(), _Double(), Long(), Short(), String() byte[] getbytes() java.lang.bigdecimal getbigdecimal(); InputStream getbinarystream() getmetadata();
SQLException Informação sobre erro no acesso à base de dados String descrevendo o erro getmessage() SQLState - String no Padrão XOPEN SQL getsqlstate() Código de erro específico do fabricante geterrorcode() Link para próxima exceção, contendo informação adicional getnextexception()
Banco de Java em JDBC
Arquitetura do Sistema client.x.br Controle da Aplicacao server.dimap.ufrn.br Oracle:1721 createconta(...); getconta(...); setconta(...); ContaBancaria BancoJDBC ContaBancaria Banco_de_Java CONTAS NUMERO SALDO 1 500 2-800 TCP/IP
Funcionamento do Sistema BancoJDBC Cliente Cliente (Applet/Servlet/Aplicação) next(); BancoJDBC getint( saldo ); execquery() getconn() execupdate() createstmt() numero saldo...... Conn Stmt ResultSet Server SGBD Relacional Bases de Dados DriverMngr JDBC API Java CORE APIs Driver A B C
O Banco de Java e JDBC package BancoJDBC; import java.sql.*; import model.*; public class BancoJDBC { static {...try {}} private String urlbancodedados = "jdbc:oracle:thin:@server.dimap.ufrn.br:1721:banco_de_java"; private String nomeusuario = "jorge"; private String senhausuario = "jhcf"; private Connection conn; private Statement stmt;...
O Banco de Java e JDBC (Continuação) public BancoJDBC() {...} public void closeconnection() {...} public ContaBancaria getconta(string numeroconta) {...} private ContaBancaria getcontasql(string numeroconta) {...} public boolean setconta(contabancaria conta) {...} private void setcontasql(contabancaria conta) {...} public ContaBancaria createconta(string numeroconta) {...} private ContaBancaria createcontasql(string numeroconta) {...}
public BancoJDBC() public BancoJDBC() throws FalhaDeComunicacaoException { try { conn = DriverManager.getConnection(urlBancoDeDados, nomeusuario, senhausuario); stmt = conn.createstatement(); stmt.getclass(); } catch (SQLException sqle) { throw new FalhaDeComunicacaoException(sqle); } }
public void closeconnection() public void closeconnection() throws FalhaDeComunicacaoException { try { stmt.close(); conn.close(); } catch (SQLException sqle) { throw new FalhaDeComunicacaoException(sqle); } }
public ContaBancaria getconta(string numeroconta) public ContaBancaria getconta(string numeroconta) throws ContaNaoExistenteException, FalhaDeComunicacaoException { ContaBancaria conta = null; try { conta = getcontasql(numeroconta); return conta; } catch (SQLException sqle) { throw new FalhaDeComunicacaoException(sqle); } }
private ContaBancaria getcontasql(string numeroconta) private ContaBancaria getcontasql(string numeroconta) throws SQLException, ContaNaoExistenteException { String comando = "SELECT * FROM contas "+ "WHERE numero = \'"+numeroconta+"\'"; ResultSet query = stmt.executequery(comando); if (query.next()) { ContaBancaria conta = new ContaBancaria(query.getString("numero")); conta.setsaldoanterior(query.getint("saldo")); return conta; } else { throw new ContaNaoExistenteException(numeroConta); } }
public boolean setconta(contabancaria conta) public boolean setconta(contabancaria conta) throws FalhaDeComunicacaoException { this.setcontasql(conta); }
private void setcontasql(contabancaria conta) private void setcontasql(contabancaria conta) throws FalhaDeComunicacaoException { try { stmt.executeupdate("update contas SET saldo = "+ conta.getsaldoatual()+ " WHERE numero = \'"+conta.getnumero()+"\'"); } catch (SQLException sqle) { throw new FalhaDeComunicacaoException(sqle); } }
public ContaBancaria criaconta(string numeroconta) public ContaBancaria createconta(string numeroconta) throws ContaExistenteException, FalhaDeComunicacaoException { try { return this.createcontasql(numeroconta); } catch (SQLException sqle) { throw new FalhaDeComunicacaoException(sqle); } }
Arquiteturas Multi-Camadas com JDBC, RMI, EJBs, Servlets, Applets e Browsers
Arquiteturas Two-Tier e Three-Tier com JDBC Two-Tier (Duas Camadas) Three-Tier (Três Camadas) Aplicação/Applet Java Cliente Cliente Aplicação/Applet Java, HTML Browser java.sql java.rmi, java.net ou java.idl HTTP, RMI ou CORBA Middleware JDBC, ODBC ou Proprietário Servidor de Aplicação Servidor de SGBD SGBD Relacional A B C Business Objects java.sql Middleware JDBC, ODBC ou Proprietário
Arquiteturas Multi-Camadas com RMI Two-Tier Cliente Java Aplicação/Applet Middleware RMI java.rmi java.rmi Objetos Distribuídos Three-Tier Cliente Java Aplicação/Applet Middleware RMI java.rmi java.rmi Objetos Distribuídos java.sql Three-Tier (Três Camadas) Aplicação/Applet Java, HTML Browser HTTP Servlets java.net javax.servlet java.rmi SGBD Relacional A B C
Arquiteturas Multi-Camadas com Servlets Two-Tier Cliente Java Aplicação/Applet, HTML Browser java.net Middleware HTTP Servlets java.servlet Three-Tier Cliente Java Aplicação/Applet, HTML Browser java.net Middleware HTTP Servlets javax.servlet java.sql HTTP Servlets N-Tier Cliente Java Aplicação/Applet, HTML Browser java.net javax.servlet java.net, javax.servlet SGBD Relacional A B C
Arquiteturas Multi-Camadas com Enterprise Java Beans (EJBs) Two-Tier Cliente Java Aplicação/Applet, java.rmi, javax.jndi Middleware RMI, JNDI EJBs javax.ejb N-Tier Cliente Java Aplicação/Applet java.rmi, javax.jndi Middleware RMI, JNDI javax.ejb EJBs java.rmi, javax.jndi java.sql HTTP Servlets N-Tier Cliente Java Aplicação/Applet, HTML Browser java.net javax.servlet java.rmi, javax.jndi SGBD Relacional A B C
Criar uma pequena aplicação na Web com HTML + Servlets + JDBC
Como Capturar Dados neste Formulário HTML...
E Mostrar Dados Consolidados em uma Página HTML!
Unindo Servlets e JDBC Host #1 Web Browser GET Survey.html POST surveyinsert Host #2 Servletrunner/HTTP Server SurveyInsert Survey.html SurveyQuery GET surveyquery Host #3 JDBC-ODBC Bridge Driver ou Native API-Partly Java Driver Local ODBC Configuration ODBC Connector Surveys survey1 employee comments...
O Futuro de JDBC
O Futuro de JDBC TM JDBC 1.0 (JDK 1.1) JDBC 2.0 (JDK 1.2) JDBC Standard Extensions Heavy-duty DB Computing SQL3 types Scrollable cursors programatic and batch updates Fundamental p/ Enterprise JavaBeans
Aspectos Avançados de JDBC 2.0 - Batch Updates Extraído de Jguru.com try { dbcon.setautocommit(false); Statement stmt= dbcon.createstatement(); stmt.addbatch("insert INTO bugs "+ "VALUES (1007, 'Server stack overflow', 1,2,{d '1999-01-01'})"); stmt.addbatch("insert INTO bugs "+ "VALUES (1008,'Cannot load DLL', 3,1,{d '1999-01-01'})"); stmt.addbatch("insert INTO bugs "+ "VALUES (1009,'Applet locks up',2,2,{d '1999-01-01'})"); int[] updcnt = stmt.executebatch(); dbcon.commit(); } catch (BatchUpdateException be) { //handle batch update exception int[] counts = be.getupdatecounts(); for (int i=0; I counts.length; i++) { System.out.println("Statement["+i+"] :"+counts[i]); } dbcon.rollback(); } catch (SQLException e) { //handle SQL exception dbcon.rollback(); }
Outras Referências Servlets Introduction to SQL Language http://w3.one.net/~jhoffman/sqltut.htm Jguru FAQ http://www.jguru.com/jguru/faq/printablefaq.jsp?faq=jdbc
Próximos Passos JDBC Tutorial da Sun Microsystems JDBC Guide Jguru FAQ Connection Pool Aspectos Avançados da JDBC 2.0
XV Simpósio Brasileiro de Bancos de Dados 2-6 de Outubro de 2000 João Pessoa - Paraíba, Brasil Integrando Java e Banco de Dados (Tutorial) por Jorge Henrique Cabral Fernandes Departamento de Informática e Matemática Aplicada Universidade Federal do Rio Grande do Norte