Aula - JDBC

30
JDBC Java Database Connectivity

Transcript of Aula - JDBC

Page 1: Aula - JDBC

JDBC Java Database Connectivity

Page 2: Aula - JDBC

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.

Page 3: Aula - JDBC

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

Page 4: Aula - 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.

Page 5: Aula - JDBC

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.

Page 6: Aula - JDBC

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.

Page 7: Aula - JDBC

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

Page 8: Aula - JDBC

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

Page 9: Aula - JDBC

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.

Page 10: Aula - JDBC

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.

Page 11: Aula - JDBC

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.

Page 12: Aula - JDBC

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”);

}

Page 13: Aula - JDBC

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 ( );

Page 14: Aula - JDBC

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

Page 15: Aula - JDBC

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.

Page 16: Aula - JDBC

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)

Page 17: Aula - JDBC

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.

Page 18: Aula - JDBC

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

Page 19: Aula - JDBC

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

Page 20: Aula - JDBC

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

Page 21: Aula - JDBC

Exercício 1: criar as tabelas para empregado e dependente no BD

Empregadomatriculanomeruacepcidadepaisestadocurriculum

Dependentematriculanome

Obs: criar os campos das tabelas acima como string.

IR

Page 22: Aula - JDBC

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,"");

}}

Page 23: Aula - JDBC

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).

Page 24: Aula - JDBC

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) {. . .}

}

Page 25: Aula - JDBC

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

Page 26: Aula - JDBC

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.

Page 27: Aula - JDBC

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)

Page 28: Aula - JDBC

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;

}

Page 29: Aula - JDBC

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;

}

Page 30: Aula - JDBC

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