Upload
maikie-franca
View
137
Download
0
Tags:
Embed Size (px)
Citation preview
JDBC Java Database Connectivity
Introdução• JDBC é uma API (Application Program Interface)
para acesso a SGDB (Sistemas Gerenciadores de Banco de Dados) relacionais por meio de comandos SQL (Structured Query Language).
• Quando o SGBD não dispõe de um driver JDBC mas somente o ODBC, será necessário uma ponte para o acesso ao banco. A figura a seguir ilustra o que acontece.
JDBC e o caminho da comunicação com o Banco de Dados
PonteJDBC/ODBC
Driver JDBC suprido pelofornecedor
DriverODBC
Banco de dados
Banco de dados
Aplicativo Java
Gerenciador de Driver JDBCAPI JDBC
API do driver JDBC
Vantagens• A API para programação do sistema é a
mesma para qualquer SGBD, não há necessidade de se desenvolver aplicações voltadas para um SGBD específico.
• Permite a construção de páginas WWW que acessam BD
• Mantém a independência de plataforma da linguagem Java.
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, banco de dados que utilizam ODBC podem ser utilizados em aplicações Java via a ponte JDBC-ODBC.
Carga do driver no programa Java• Vários drivers podem ser carregados com o método
Class.forName, este método força o carregamento do driver. Por exemplo:Class.forName (“oracle.jdbc.driver.OracleDriver”);
Class.forName (“sun.jdbc.odbc.JdbcOdbcDriver”);
• Caso não seja encontrada a classe é lançada uma exceção ClassNotFoundException
• 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.
Conexão com o BD
• A abertura da conexão é feita pelo método getConnectionda classe DriverManager.ê 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.
• getConnection(String url, Properties info)– url: a url do banco de dados;– info : propriedade do sistema como: usuário e senha.
• getConnection(String url, String user, String password)– url: a url do banco de dados;– user: o usuário que está conectando ao banco de dados;– password: a senha do usuário.
• getConnection(String url)– url: a url do banco de daoos
import java.sql.*;. . .java.util.Properties props = new Properties();props.put("user", objAccessManager.getConta());props.put("password", objAccessManager.getSenha());String url = "jdbc:caribou:jsqlingres//"+ "fava" +":6024/" + bancoPar;try{
// carrega o driver jdbc - cariboulakeClass.forName("COM.cariboulake.sql.ingres.JSQLDriver");
// abre conexao com o banco de dadosConnection con = DriverManager.getConnection(url, props);
// especifica o autocommit para off (ingress aceita isto)con.setAutoCommit( false );
}
Exemplo: Conexão com o BD
catch(SQLException e) {
System.out.println("Falha na conexão com o banco de dados:" );System.out.println(e.getMessage();
}catch(ClassNotFoundException e) {
System.out.println("Classe do Driver JDBC não encontrada"); }
Exemplo: Conexão com o BD - cont.
Envio de comandos SQL
• O envio de um comando SQL é feito por meio de um Statementê 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 FUHDWH6WDWHPHQW a conexão com o BDStatement stmt = con.createStatement ( );
• Execução de comandos SQLê Método H[HFXWH4XHU\: usado para comandos SQL que
retornam uma tabela (ResultSet).
ResultSet rs = stmt.executeQuery (“select * from EMP”);
ê Método H[HFXWH8SGDWH: usado para executar comandos SQL que retornam int.
Obtenção do resultado• A classe 5HVXOW6HW oferece à aplicação a tabela
resultante de um Select eê Mantém um cursor posicionando em uma linha da tabela.
Inicialmente este cursor está antes da primeira linha e a mensagem QH[W�����movimenta o cursor para frente.
ê Permite à aplicação pegar os dados das colunas da linha correnteatravés de mensagem getXXX(<coluna>).• 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”);
}
Criação e inserção numa tabela
• Exemplo de criação e inserção em uma tabela utilizando a mensagem H[HFXWH8SGDWH ao StatementStatement st = conn.createStatement ( );
st.executeUpdate ( “ create table Alunos (nome varchar (32),idade integer); ” );
st.executeUpdate (“ insert into Alunos values (‘Jonas’, 18); ” );conn.close ( );
Transações• Uma transação é um conjunto de comandos
(Statements) que são validados no BD com FRPPLW ou cancelados com UROOEDFN.ê Por default, todos os comandos no JDBC são auto-
commit.conn.setAutoCommit (false); // muda o defaultStatement s = conn.createStatement ( );s.executeUpdate(“ ... ” );s.executeUpdate (“ ... ” );if ( ... ) // se determinada condição está ok
conn.commit ( ); // valida os 2 updateselse
conn.rollback ( ); // senão, desfaz os updates
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 o SGBD dá-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 • 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.
Conexão com o BD
• A abertura da conexão é feita pelo método getConnection da classe DriverManager.
Ö 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.
• getConnection(String url, Properties info)• getConnection(String url, String user, String password)• getConnection(String url)
A Classe Connection• public abstract void setAutoCommit(boolean autoCommit) throws
SQLException
• public abstract void commit() throws SQLException
• public abstract void close() throws SQLException
• public abstract DatabaseMetaData getMetaData() throwsSQLException
• public abstract Statement createStatement() throws SQLException
• public abstract PreparedStatement prepareStatement(String sql) throws SQLException
– sql: comando SQL que pode conter um ou mais '?' parâmetros.
Consultas preparedStatement
• Comandos SQL com ou sem parâmetros podem ser pré-processados e armazenados em um objeto do tipo PreparedStatement.
• É possível preparar uma consulta com uma variável para ser usadas muitas vezes, apenas inserindo uma string diferente para a variável a cada vez. Por exemplo:
String consultaLivros = “ select prec_livro, titulo_livro from livro, editorawhere livro.id_editora = editora.id_editora and
editora.nome = ?” ;PreparedStatement stmConsultaLivros = conn.preparedStatement
(consultaLivros);
• Utilizar o método set para fazer a ligação com a variável.
stmConsultaLivros.setString(1, editora); // 1 denota a posição da variável e editora o valor que será atribuído a variável
PreparedStatement
• public abstract ResultSet executeQuery() throws SQLException
• public abstract int executeUpdate() throws SQLException
• public abstract void setXXX(int indice, XXX x) throwsSQLException
– indice: começando com 1
• public abstract void setNull(int indice, int sqlType) throwsSQLException
• public abstract void clearParameters() throws SQLException
Dados SQL x JAVA
SQL
integer ou intsmallintnumeric (m,n)decimal (m,n)float(n)realdoublecharacter(n) ou char(n)varchar(n)datetimetimestamp
Java
intshort
java.sql.Numericdoublefloatdoublestringstringjava.sql.Datejava.sql.Timejava.sql.Timestamp
Exercício 1: criar as tabelas para empregado e dependente no BD
Empregadomatriculanomeruacepcidadepaisestadocurriculum
Dependentematriculanome
Obs: criar os campos das tabelas acima como string.
IR
DatabaseMetaData• public abstract ResultSet getColumns(String catalog,
String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException
• Exemplo:public void setDBMetaDados(String tabela)
{DatabaseMetaData dbMetaDados;ResultSet rs = null;try{
dbMetaDados = con.getMetaData();rs = dbMetaDados.getColumns("","",tabela,"");
}}
DatabaseMetaData• O ResultSet tem as seguintes colunas:
1.TABLE_CAT String => table catalog (pode ser nulo) 2.TABLE_SCHEM String => table schema (pode ser nulo) 3.TABLE_NAME String => nome da tabela 4.COLUMN_NAME String => nome da coluna 5.DATA_TYPE short => tipo de acordo com java.sql.Types6.TYPE_NAME String => tipo no sgbd7.COLUMN_SIZE int 8.BUFFER_LENGTH (não usada) 9.DECIMAL_DIGITS int. . .
17.ORDINAL_POSITION int => índice da coluna na tabela(começa com 1)
18.IS_NULLABLE String => NO, YES ou NULL (indeterminado).
DatabaseMetaDatapublic void setMetaDadosResultSet(String tabela) {Vector vetorNomesColunas = new Vector();Vector vetorTiposColunas = new Vector();DatabaseMetaData dbMetaDados;ResultSet rs = null;try{dbMetaDados = conexaoEstabelecida.getMetaData();rs = dbMetaDados.getColumns("","", tabela,"");while (resultSetColunasTabela.next()) {vetorNomesColunas.addElement (rs.getString(4));vetorTiposColunas.addElement(rs.getString(6));
}}catch (SQLException e) {. . .}
}
ResultSetMetaData• Obtido pelo método getMetaData, da classe ResultSet• public abstract int getColumnCount() throws SQLException• public abstract int isNullable(int column) throws
SQLException• public abstract String getColumnName(int column) throws
SQLException• public abstract String getTableName(int column) throws
SQLException• public abstract int getColumnType(int column)
throws SQLException– tipo de acordo com java.sql.Types
• public abstract String getColumnTypeName(int column)throws SQLException
– tipo no SGBD
Exercício 1
• Objetivo:– Fixar os conceitos iniciais sobre JDBC usando
a ponte JDBC_ODBC
• Crie uma base de dados base_UCB.mdb no
access e salve no seu diretório de trabalho.
• Crie no Painel de Controle / Fontes de
Dados ODBC 32 bits um DSN com o nome
teste_UCB associada ao arquivo acima.
Exercício 1 - Continuação
• Criar uma classe TesteJDBC_ODBC– Esta classe pode receber um dos seis
parâmetros possíveis• Create (Cria tabelas)• Drop (Apaga tabelas)• Insert (Inclui dados )• Update (Altera dados)• Delete (Apaga dados)• Select (Seleciona dados e mostra na saída
padrão)
Exercício 1- Continuação
• Dica: Crie um método Conecta( ) para obter uma conexão com a base de dados
String url= "jdbc:odbc:teste_UCB";Connection con;try {
System.out.println("Iniciando a conexão com o BD...");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");con = DriverManager.getConnection(url,"","");
System.out.println("Banco de Dados Ok e Pronto...");return con;
}
Exercício 1- Continuação
• Não esqueça das Exceções !!!
catch(ClassNotFoundException cnf)
{System.out.println("Houve uma ClassNotFoundException: "+cnf);return null;
}catch(SQLException sql) {
System.out.println("Houve uma SQLException: "+sql);return null;
}
Novas Funcionalidades daJDBC 2.0
• Requisitos– JDK 1.2 ou superior– Driver JDBC 2.0– Suporte pelo SGBD
• Funcionalidades– Mover cursores em Scrollable Result Sets
– Fazer Atualizações em Updatable Result Sets
– Suporte aos tipos de dados SQL3