por (tutorial) - cic.unb.brjhcf/mybooks/itjava/slides/integrandojavaeban...integrando java e banco...
TRANSCRIPT
XV Simpósio Brasileiro de Bancos de Dados2-6 de Outubro de 2000
João Pessoa - Paraíba, Brasil
Integrando Java e Banco de Dados (Tutorial)
porJorge Henrique Cabral Fernandes
Departamento de Informática e Matemática AplicadaUniversidade Federal do Rio Grande do Norte
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
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
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Referências
�JDBCTM - Connecting Java and Databases. Sun Microsystems, 1996
�JDBC Database Access, by MaydeneFisher (Java Tutorial, Sun Microsystems, 1999)
�JDBC Home Pagehttp://java.sun.com/products/jdbc
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
JDBCTM: 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 JDKTM
�Aplicações, Applets, Servlets ou quaisquer outros programas Java podem:�Estabelecer conexão com base de dados�Enviar comandos SQL�Processar resultados
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
ClienteCliente
Java CORE APIsJDBC API A B C
Bases de DadosSGBD Relacional
Modelo Computacional
createStmt()
execUpdate()execQuery()
ConnStmt ResultSet
get*(“Col-n”); get*(n);next();next();
DriverMngr
Aplicação
Driver
getConn()
Servidor
Col-1 Col-2 ... Col-nnext();
JDBC 1.0
Um Exemplo Simples
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Um Exemplo Simples
import java.sql.*;public class Select {
static {try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); }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);
}}
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Principais Elementos da API JDBC Usados no Exemplo
� Carregar Driver Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
� Estabelecer ConnectionConnection connection = DriverManager.getConnection(
"jdbc:odbc:BancodeJava" /*JDBC URL*/ ,"jorge","jhcf");
� Criar StatementStatement statement = connection.createStatement();
� Executar QueriesResultStatement result = statement.executeQuery(
"SELECT * FROM contas WHERE numero =\'1\'”);
� Executar Updatesstatement.executeUpdate(
"UPDATE contas SET saldo = 100 WHERE numero = \'1\'");
� Fechar Statement e Connectionstatement.close(); connection.close();
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
JDBC 1.0: pacote java.sql
�InterfacesDriverConnectionDatabaseMetaDataResultSet ResultSetMetaDataStatement
PreparedStatementCallableStatement
� Classesjava.util.Date
DateTime Timestamp
DriverManager DriverPropertyInfo Types
� ExceçõesSQLException
SQLWarningDataTruncation
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Classes do Exemplo
�Driver�DriverManager�Connection�Statement�ResultSet�SQLException
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
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 Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Java, JDBC e JDBC Drivers
A B C
SGBD Relacional
JDBC DriverManager
Aplicação Java
JDBC Net Driver
ProtocoloMiddleware
JDBC
JDBC-ODBC Bridge Driver ouNative API-Partly Java Driver
ODBC & DB Drivers
ProtocoloODBC e/ouProprietário
Native ProtocolPure Java Driver
ProtocoloProprietário
JDBC Connector
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Categorias de Drivers paraJDBC
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
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
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)
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
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);
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
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();
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
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();
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
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
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Banco_de_Java
Arquitetura do Sistema
1 0NUMERO SALDO
CONTAS
Oracle:1721server.dimap.ufrn.br
TCP/IP
BancoJDBC
ContaBancaria
client.x.br
Controleda Aplicacao
createConta(...);getConta(...);setConta(...);
2 -8001 50
ContaBancaria
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
ClienteCliente (Applet/Servlet/Aplicação)
Java CORE APIsJDBC API A B C
Bases de DadosSGBD Relacional
Funcionamento do Sistema BancoJDBC
createStmt()
execUpdate()execQuery()
ConnStmt ResultSet
getInt(“saldo”);
DriverMngr
BancoJDBC
Driver
getConn()
Server
next();numero saldo ... ...
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
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;
...
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
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) {...}
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
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);
}}
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
public void closeConnection()
public void closeConnection()throws FalhaDeComunicacaoException {
try {stmt.close();conn.close();
} catch (SQLException sqle) {throw new FalhaDeComunicacaoException(sqle);
}}
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
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);
}}
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
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);
}}
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
public boolean setConta(ContaBancaria conta)
public boolean setConta(ContaBancaria conta)throws FalhaDeComunicacaoException {
this.setContaSQL(conta);}
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
private voidsetContaSQL(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);
}}
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
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-Camadascom JDBC, RMI, EJBs, Servlets, Applets e Browsers
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Arquiteturas Two-Tier e Three-Tier com JDBC
Two-Tier (Duas Camadas)Aplicação/Applet
Java
java.sql
A B C
SGBD Relacional
MiddlewareJDBC,
ODBC ouProprietário
MiddlewareJDBC,
ODBC ouProprietário
Three-Tier (Três Camadas)Aplicação/Applet
Java, HTML Browser
java.rmi, java.net ou java.idl
Servidor de Aplicação
java.sql
BusinessObjects
Cliente
Servidor de SGBD
HTTP, RMI ou CORBA
Cliente
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Arquiteturas Multi-Camadascom RMI
Two-TierCliente Java
Aplicação/Applet
java.rmi
A B C
SGBD Relacional
MiddlewareRMI
Three-Tier (Três Camadas)Aplicação/Applet
Java, HTML Browser
java.net
Servlets
HTTP
javax.servletObjetos
Distribuídos
java.rmi
Three-TierCliente Java
Aplicação/Applet
java.rmi
MiddlewareRMI
ObjetosDistribuídos
java.rmi
java.sql java.rmi
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Arquiteturas Multi-Camadascom Servlets
Two-TierCliente Java
Aplicação/Applet,HTML Browser
java.net
A B C
SGBD Relacional
MiddlewareHTTP
N-Tier
Servlets
HTTP
Three-Tier
MiddlewareHTTP
javax.servlet
java.sqlServlets
java.servlet
Servlets
javax.servlet
Cliente JavaAplicação/Applet,
HTML Browserjava.net
Cliente JavaAplicação/Applet,
HTML Browserjava.net
java.net, javax.servlet
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Arquiteturas Multi-Camadas com Enterprise Java Beans (EJBs)
Two-TierCliente Java
Aplicação/Applet,
java.rmi, javax.jndi
A B C
SGBD Relacional
MiddlewareRMI, JNDI
N-Tier
Servlets
HTTP
N-Tier
MiddlewareRMI, JNDI
javax.ejb
java.sqlEJBs
javax.ejbEJBs
javax.servlet
Cliente JavaAplicação/Applet
Cliente JavaAplicação/Applet,
HTML Browserjava.net
java.rmi, javax.jndi
java.rmi, javax.jndi
java.rmi, javax.jndi
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
JDBC-ODBC Bridge Driver ouNative API-Partly Java Driver
Local ODBC Configuration
Surveys
employee comments ...survey1
ODBC Connector
Servletrunner/HTTP Server
SurveyQuerySurvey.htmlSurveyInsertGET Survey.html
POST surveyinsert
GET surveyquery
Web BrowserHost #1 Host #2
Host #3
O Futuro de JDBC
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
O Futuro de JDBCTM
�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
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Aspectos Avançados de JDBC 2.0 - Batch UpdatesExtraí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 exceptionint[] 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 exceptiondbCon.rollback();
}
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
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
Java Deployment Course - JDBCTM: Integrando JavaTM e SQL. Copyright © 2000, 1999, 1998. Jorge H. C. Fernandes. Todos os Direitos Reservados.
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 Dados2-6 de Outubro de 2000
João Pessoa - Paraíba, Brasil
Integrando Java e Banco de Dados (Tutorial)
porJorge Henrique Cabral Fernandes
Departamento de Informática e Matemática AplicadaUniversidade Federal do Rio Grande do Norte