Acessando Banco de Dados
Objetivos Entender o que são Drivers. Diferenciar ODBC, JDBC e DRIVERMANAGER. Desenvolver uma aplicação Java para conexão com Banco de Dados. Criar um objeto a partir da classe Statement. Utilizar os métodos executeupdate e executequery da classe Statement. Saber configurar o ODBC da Microsoft para criar uma fonte de dados. Saber utilizar os métodos da Classe DataBaseMetaData. Saber utilizar os métodos da Classe ResultSetMetaData. Saber criar as Prepared Statement. Entender e aplicar o conceito de Transação.
O que é? JDBC é uma interface baseada em Java para acesso a bancos de dados através de SQL. Pacote Java padrão: java.sql Baseada em ODBC Um driver JDBC nada mais é que um tradutor utilizado pela JVM (Java Virtual Machine) para converter instruções no padrão JDBC (usadas no código do programa) para instruções específicas do Banco de Dados. A maioria dos bancos de dados, em uso atualmente, possuem drivers implementados ou o u pelo próprio fabricante ou por terceiros. Caso não exista ainda um driver JDBC, pode-se usar o padrão ODBC para comunicação com o banco. Nesta situação, teremos no entanto, uma perda de performance na comunicação. A própria SUN disponibiliza na API JDBC, o driver para comunicação via ODBC.
O que é? JDBC é uma interface de nível de código Código SQL é usado explicitamente dentro do código Java O pacote java.sql consiste de um conjunto de classes e interfaces que permitem embutir código SQL em métodos. Com JDBC é possível construir uma aplicação Java para acesso a qualquer banco de dados SQL. O banco deve ter pelo menos um driver ODBC, se não tiver driver JDBC Para usar JDBC é preciso ter um driver JDBC O J2SE distribui um driver ODBC que permite o acesso a bancos que não suportam JDBC mas suportam ODBC
O pacote java.sql.* JDBC
O que é um driver? Driver é um tipo de software que tem por finalidade permitir a comunicação entre dois sistemas. Os drivers geralmente são desenvolvidos e fornecidos pelos fabricantes, mas é comum encontrar drivers genéricos distribuídos com o sistema operacional e também drivers de terceiros, gratuitos ou não. O que se espera de um driver é a máxima compatibilidade e velocidade sem degradar a performance do sistema como um todo.
O que é ODBC? Open Database Connectivity. É uma interface desenvolvida pela Microsoft para permitir acesso genérico a diferentes sistemas de banco de dados na plataforma Windows, com grande disponibilidade de drivers para acesso a banco de dados.
O que é JDBC? Java Database Connectivity. É uma interface que possibilita às aplicações Java acessarem banco de dados relacionais e arquivos de dados.
O que é ponte JDBC-ODBC? Embora uma aplicação escrita em Java possa utilizar diretamente a interface ODBC para acessar banco de dados, este procedimento é trabalhoso e elimina a portabilidade da aplicação. Para superar este obstáculo, usamos uma ponte JDBC-ODBC. Não precisamos nos preocupar com a instalação do JDBC ou da ponte JDBC-ODBC. Na plataforma Java 2, essas interfaces fazem parte do pacote e são instaladas juntamente com o SDK 1.X em diante.
Resumindo: Tipos de Driver JDBC
Driver Manager O DriverManager é uma classe do pacote java.sql e serve para: Fazer a conexão com o Banco de Dados Gerenciar o conjunto de Drivers JDBC correspondentes Controlar o Login ao Banco (se houver) Controlar as mensagens entre o banco de dados e o driver. Um programador que utiliza um driver, não precisa saber como ele foi codificado, mas deve saber como carregá-lo para que ele se registre no DriverManager.
Carga de Drivers Para executar a ponte JDBC:ODBC, basta executar a instrução: Class.forName( sun.jdbc.odbc.jdbcodbcdriver ); Esta linha chama o método estático forname( ) da classe Class e carrega para a memória, o driver indicado, no caso o JdbcOdbcDriver. Dentro do driver, existe um bloco estático de código que cria uma instância da própria classe e a registra junto ao DriverManager com o método registerdriver( ). A instrução: DriverManager.registerDriver(new sun.jdbc.odbc.jdbcodbcdriver()); colocada em nosso código, teria efeito semelhante, porém teríamos duas instâncias da classe JdbcOdbcDriver criadas. Class.forName( oracle.jdbc.driver.oracledriver )
Conectando O comando Connection con = DriverManager.getConnection( jdbc:odbc:nomebanco, LoginBanco, SenhaBanco ); pede que o DriverManager, através de um driver carregado anteriormente, estabeleça uma conexão com o banco. Devemos observar a URL JDBC informada: jdbc:<subprotocolo>:<dsn> Exemplos: jdbc:odbc:anuncios jdbc:oracle:thin:@200.206.192.216:1521:exemplo jdbc:mysql://alnitak.orion.org/clientes jdbc:cloudscape:rmi://host:1098/mydb;create=true
Conectando no Oracle Strings de conexão do oracle Thin Driver (Tipo 4 100%) url= jdbc:oracle:thin@ + Host + : + porta + : + instancia ; Connection con=drivermanager.getconnection(url, login, senha ); OCI Driver (Net8) (Tipo 2) Connection conn = DriverManager.getConnection ("jdbc:oracle:oci8:@hostname_orcl", "scott", "tiger"); // or oci7 @TNSNames_Entry, userid, password
Criando um Statement Statement é o objeto que envia os comandos SQL para o banco de dados. Statement stmt = con.createstatement( ); Este objeto, como dissemos, será responsável para enviar comandos SQL para o banco de dados. A classe Statement possui dois métodos para enviar comandos para o banco: executequery( ) - Utilizado para enviar comandos que retornam dados de tabelas executeupdate( ) - Utilizado para enviar comandos que criam, alteram a estrutura ou apagam tabelas ou registros dentro das tabelas
Comando executeupdate(); Retorna o número de linhas alteradas CRIANDO TABELAS NO BANCO DE DADOS stmt.executeupdate( CREATE TABLE aluno + (nome VARCHAR(32),idade INTEGER, mensalidade FLOAT) ); Esta instrução cria uma tabela de nome aluno, com os campos nome, idade e mensalidade. INSERINDO DADOS EM UMA TABELA DO BANCO DE DADOS stmt.executeupdate( INSERT INTO aluno + VALUES ( Joao, 49, 500.00) ); ALTERANDO O CONTEÚDO DE TABELAS stmt.executeupdate( UPDATE aluno + SET mensalidade = 750.00 + WHERE nome = Joao ); APAGAR TABELAS stmt.executeupdate( drop table aluno );
Comando executequery(); Este comando é utilizado para recuperar informações de tabelas. O resultado em um objeto do tipo ResultSet: ResultSet rs = stmt.executequery( SELECT * FROM aluno ); while(rs.next()) { String nome = rs.getstring(1); int idade = rs.getint(2); double mensalidade = rs.getdouble( mensalidade );
ResultSet - Gets Existe um método get para cada tipo:
Resumo até aqui 1) Importar o pacote java.sql 2) Criar um objeto do tipo Connection que é uma interface que gerencia a conexão entre o programa e o banco de dados. Também fornece suporte para execução de instruções SQL. 3) Criar a URL (Uniform Resource Locator) que especifica o banco de dados ao qual a aplicação se conecta, utilizando a ponte JDBC:ODBC para conectar a um banco de dados da Microsoft. 4) Informar o nome do usuário que se conectará ao banco e a senha. 5) Carregar o Driver para a memória, a fim de permitir a conexão ao banco de dados. 6) Criar uma conexão com o Banco de Dados 7) Dependendo da aplicação, criar as Statements, ResultSet, PreparedStatement etc...
Exemplo import java.io.*; import java.sql.*; import java.util.*; public class TestaOdbcBasico extends Object { public static void main(string args[]) { String URL = jdbc:odbc:teste String username = ; String password = ; try { Class.forName( sun.jdbc.odbc.jdbcodbcdriver ); System.out.println( Driver carregado ); Catch (Exception e) { System.out.println( Erro na Carga do Driver ); System.exit(0);
Exemplo (cont.) Statement stmt = null; Connection con = null; try { con = DriverManager.getConnection ( URL,username,password); System.out.println( Conexão criada ); stmt = con.createstatement(); System.out.println( Statement Criado ); catch (Exception e) { System.out.println( Problemas com a Conexão com o Banco); try { stmt.executeupdate( CREATE TABLE aluno (nome VARCHAR(32),idade INTEGER, mensalidade FLOAT) ); JDBC stmt.executeupdate("insert INTO aluno (nome,idade,mensalidade) " + "VALUES ('Joao', 5, 600.00)");
Exemplo (cont.) JDBC stmt.executeupdate("update aluno SET mensalidade = 750.00 WHERE nome = 'Joao'"); ResultSet rs = stmt.executequery( SELECT * FROM aluno ); while(rs.next()) { String nome = rs.getstring( nome ); int idade = rs.getint( idade ); double mensalidade = rs.getdouble( mensalidade ); System.out.println( Nome: +nome+ \tidade: con.close(); catch (Exception e) { +idade+ \tmensalidade: +mensalidade); System.err.println( Problemas com SQL: +e.getmessage());
Transações Permite a execução atômica de comandos enviados ao banco. Implementada através dos métodos de Connection commit() rollback() setautocommit(boolean autocommit): default é true. Por default, as informações são processadas a medida em que são recebidas. Para mudar: con.setautocommit(false); Agora várias instruções podem ser acumuladas. Para processar: con.commit(); JDBC Se houver algum erro e todo o processo necessitar ser desfeito, pode-se emitir um ROLLBACK usando: con.rollback();
Exercício 31 1) Atualize o programa TestaBanco de forma que: 1) Ao informar um cliente, o programa verificará se este cliente existe na base de dados (Tabela Cliente). Caso não exista, crie o cliente na base, caso contrário, recupere os dados do cliente. 2) Verifique se existe uma conta para este cliente na base de dados (Tabela Conta). Caso não exista, crie a conta do cliente na base, caso contrário, recupere os dados da conta do cliente. 3) Efetue três saques de: R$ 150,00, R$ 50,00 e R$ 350,00. 4) Ao final da movimentação, apresente o saldo da conta do cliente
Informações do Banco de Dados Podemos obter informações sobre o Banco de Dados sendo utilizado, com o auxílio da classe DataBaseMetaData. JDBC import java.sql.*; import java.util.*; public class TestaDataBaseMetaData extends Object { public static void main(string args[]) { String URL = jdbc:odbc:testeodbc ; String username = ; String password = ; try { Class.forName( sun.jdbc.odbc.jdbcodbcdriver ); System.out.println( Driver Carregado com sucesso ); catch (Exception e) { Connection con = null; ResultSet rs = null; DatabaseMetaData md = null;
Informações do Banco de Dados (cont.) try { con = DriverManager.getConnection(URL,username,password); System.out.println( Conexão criada com Sucesso!! ); md = con.getmetadata(); if(md == null) { System.out.println( No Database Meta Data ); else { System.out.println( Nome do Banco : + md.getdatabaseproductname()); System.out.println( Maximo numero de conexoes : + md.getmaxconnections()); System.out.println( Versao do Driver : + md.getdriverversion()); System.out.println( Versao do Banco : + md.getdatabaseproductversion()); System.out.println( Stored Procedures : + md.supportsstoredprocedures());
Informações do Banco de Dados (cont.) catch (Exception e) { System.out.println( Problemas na conexao com o banco ); System.out.println( Schemas do Banco ); try { rs = md.getschemas(); while (rs.next()) { System.out.println(rs.getString(1)); catch (Exception exc) { System.out.println( Schemas Falha ); System.out.println( Catalogs ); try { rs = md.getcatalogs(); while (rs.next()) { System.out.println(rs.getString(1)); catch (Exception exc) { System.out.println( Catalogs Falha ); JDBC
Informações do Banco de Dados (cont.) System.out.println( Tabelas ); String nome; String[] tipos = { TABLE, VIEW ; try { rs = md.gettables(null,null, %,tipos); while (rs.next()) { nome = rs.getstring(3); System.out.println(nome+ - +rs.getstring(4)); catch (Exception exc) { System.out.println( Tables Falha );
Informações do ResultSet ( ) ResultSetMetaData meta = result.getmetadata(); int columns = meta.getcolumncount(); for (int i=1;i<=columns;i++) { System.out.print(meta.getColumnLabel(i) + ( + meta.getcolumntypename(i) + ) + \t\t ); ( )
Prepared Statements (Instruções Preparadas) Quando queremos enviar um comando repetidas vezes para o banco de dados, podemos simplificar o processo e otimizar a performance com a classe PreparedStatement. JDBC A idéia é preparar uma Query parametrizada que será enviada para o Servidor, sendo pré compilada antes de ser usada. Tudo vai depender de como o banco lida com as Queries précompiladas. prep = con.preparestatement( INSERT into aluno +"(nome,idade,mensalidade)" + VALUES (?,?,?)); prep.setstring(1, Joao ); prep.setint(2,5); prep.setdouble(3,650.00); prep.executeupdate();
Verifique seu progresso: Entender o que são Drivers. Diferenciar ODBC, JDBC e DRIVERMANAGER. Desenvolver uma aplicação Java para conexão com Banco de Dados. Criar um objeto a partir da classe Statement. Utilizar os métodos executeupdate e executequery da classe Statement. Saber configurar o ODBC da Microsoft para criar uma fonte de dados. Saber utilizar os métodos da Classe DataBaseMetaData. Saber utilizar os métodos da Classe ResultSetMetaData. Saber criar as Prepared Statement. Entender e aplicar o conceito de Transação. JDBC