You are on page 1of 44

JAVA

Jos Marcos Barbosa da Silveira jmarcosbs@hotmail.com

Manipulao de Banco de Dados com Java


Objetivos deste captulo
Demonstrar os fundamentos bsicos para a manipulao de banco de dados com Java; Conceituar e demonstrar a criao de uma fonte de dados; Demonstrar como uma aplicao realiza uma conexo e manipulao de banco de dados; Apresentar as tcnicas para navegao em registros; Apresentar a sintaxe de comandos SQL usados em Java; Enumerar os aspectos essenciais para a consulta de banco de dados.

Definio
A linguagem Java possui classes que permitem a conexo com banco de dados. Para que seja possvel realizar a manipulao de banco de dados em Java, necessrio que diversos procedimentos sejam realizados a fim de configurar o sistema. Os passos necessrios para a manipulao de banco de dados por meio de uma aplicao so os seguintes: 1) A criao do banco de dados; 2) A configurao do sistema por meio da criao de uma fonte de dados entre o banco de dados criado e a linguagem Java (fonte ODBC-JDBC); 3) A criao da aplicao Java propriamente dita.

A Criao do Banco de Dados


A criao do banco de dados uma tarefa bem simples que ser realizada com Microsoft Access 2000. Realize os seguintes procedimentos: 1) Abra o Access; 2) Crie um banco de dados; 3) Crie uma tabela, por exemplo: #cpf numero 11 (duplo) *nome texto 50 *cargo texto 30 *salario numero 9 (decimal) Onde: # representa a chave primria e * campos obrigatrios

Configurao do Sistema
Para que seja possvel acessar o banco de dados em Java, necessrio criar uma fonte de dados ODBC por meio do sistema operacional. Esta fonte de dados ser usada para estabelecer uma ponte de comunicao entre o banco de dados e o Java. Realize os seguintes procedimentos: 1) Clique no boto iniciar, escolha configuraes e Painel de Controle; 2) D um duplo-clique sobre o item ODBC 32 bits; 3) Acesse a guia NDF (Nome da Fontes de Dados) de usurios e pressione o boto adicionar, conforme a figura a seguir:

Configurao do Sistema (cont.)

Configurao do Sistema (cont.)


4) A prxima janela apresenta todos os drivers
disponveis. Como estamos trabalhando com banco de dados Access, deve ser escolhido o driver Microsoft Access Driver. A seguir clique no boto concluir.

Configurao do Sistema (cont.)


5) Na prxima janela no campo Nome da fonte de dados digite o nome que deseja dar a fonte de dados, por exemplo Empresa. Depois clique no boto selecionar e localize o banco de dados criado anteriormente.

Configurao do Sistema (cont.)


6) A fonte de dados criada deve aparecer entre as fontes de dados do usurio. Neste ponto, o banco de dados que ser manipulado pela aplicao j est criado e devidamente configurado.

JDBC principais passos


1. Incluir no programa: import java.sql.*; 2. Carregar corretamente o driver desejado. 3. Conectar com o banco de dados. 4. Criar o comando JDBC. 5. Enviar comandos SQL. 6. Capturar dados da tabela resultante. 7. Confirmar ou desfazer transaes. 8. Recuperar metadados sobre a tabela resultante ou sobre o BD atual.
Importante: os ndices em JDBC comeam em 1.

JDBC Carga do driver


Vrios drivers podem ser carregados com o mtodo Class.forName( String s). Por exemplo:
Class.forName (oracle.jdbc.driver.OracleDriver); Class.forName (sun.jdbc.odbc.JdbcOdbcDriver);

- O ClassLoader tenta localizar e carregar uma

instncia da classe ou interface designada pela String s. - A JVM deve poder encontrar a classe especificada. Caso essa no seja encontrada, lanada uma exceo ClassNotFoundException. - Para aplicaes, a varivel de ambiente CLASSPATH deve incluir os drivers.

JDBC Conexo com o BD


A abertura da conexo (sesso) feita pelo mtodo
-

getConnection da classe DriverManager (o servio bsico para gerenciamento de um conjunto de drivers JDBC). Retorna um objeto do tipo Connection. A URL composta de protocolo:subprotocolo:subnome. O DriverManager tenta conectar com o primeiro driver carregado; se no consegue, tenta o driver seguinte. Caso no seja localizado, lanada uma exceo SQLException. A classe Connection possibilita estabelecer uma conexo em banco de dados utilizando o seu nome (anyname) e uma senha (password) quando isso se fizer necessrio, que no o nosso caso. Esses argumentos so opcionais e podem ser desconsiderados.
Exemplo: Connection conexao=DriverManager.getConnection(url,UserID,password );

Exemplo de Conexo
import java.sql.*; public class TestaConexao{ private String driver,url; private Connection conexao; public TestaConexao(){ driver="sun.jdbc.odbc.JdbcOdbcDriver"; url="jdbc:odbc:Empresa"; conecta(driver,url); } public void conecta(String driver, String url){ try{ // carrega o driver da ponte jdbc-odbc Class.forName(driver); // abre conexao com o banco de dados conexao=DriverManager.getConnection(url); System.out.println("Conexo executada com sucesso"); conexao.close(); }

Exemplo de Conexo (cont.)


catch(SQLException SqlExc){ System.out.println("Erro de SQL!"); } catch(ClassNotFoundException exc){ System.out.println("Classe no encontrada!"); } } public static void main(String args[]){ TestaConexao ins=new TestaConexao(); }

Criao do Statement
Esta classe tem por objetivo executar um comando SQL e obter o resultado produzido por esse. Apenas um ResultSet (resultado SQL) pode ser aberto a cada vez. Um objeto desta classe criado pelo mtodo createStatement a partir da conexo j estabelecida. Statement comando=conexao.createStatement(); ou Statement comando=conexao.createStatement(navegao,ao)- Cria um objeto com os parmetros fornecidos que iro definir o comportamento do objeto Statement, em que: Navegao pode ser: TYPE_FORWARD_ONLY (navegao apenas para frente, TYPE_SCROLL_INSENSITIVE (navegao nos dois sentidos) ou TYPE_SCROLL_SENSITIVE (navegao nos dois sentidos). Os dois ltimos tipos de navegao so similares. A diferena que as alteraes no contedo da tabela realizadas em tempo de execuo no refletem no tipo INSENSITIVE, enquanto no SENSITIVE sim. Se o parmetro de navegao no for especificado, ser usada a navegao TYPE_FORWARD_ONLY.

Criao do Statement (cont.)


Ao pode ser: CONCUR_READ_ONLY (somente leitura) ou CONCUR_UPDATABLE (leitura e atualizao). Refere-se ao modo como o objeto ResultSet ser criado, ou seja, se ele ser somente leitura ou seu valor pode ser alterado. H outros dois subtipos de Statement: - PreparedStatement : o comando SQL pr-compilado e utilizado posteriormente, sendo mais eficiente nos casos onde o mesmo comando utilizado vrias vezes. Utiliza o mtodo con.prepareStatement(String sql) . - Este comando pode conter um ou mais '?' parmetros.

- CallableStatement : utilizado para chamar procedimentos SQL


armazenados no BD (stored procedures). Utiliza o mtodo con.prepareCall(String sql) .

A classe Statement
Dois dos seus principais mtodos so:
- ResultSet executeQuery(String sql): usado para comandos SQL que retornam uma nica tabela (ResultSet), tipicamente o SELECT. - int executeUpdate(String sql): usado para executar comandos SQL que alteram a tabela (CREATE, INSERT, UPDATE ou DELETE). Retorna o nmero de colunas alteradas.

Movimentao em Registros
Quando um ResultSet navegvel, diversas operaes podem ser realizadas por meio dele, pelos mtodos de movimentao do ponteiro, os quais so descritos a seguir: first() posiciona o ponteiro no primeiro registro do objeto ReusltSet; last() posiciona o ponteiro no ltimo registro do objeto do ResultSet; next() posiciona o ponteiro no prximo registro do objeto do ResultSet; previous() posiciona o ponteiro no registro anterior do objeto do ResultSet;

Envio de comandos SQL Obteno do resultado


A classe ResultSet oferece aplicao a tabela resultante de um SELECT.
- Mantm um cursor posicionando em uma linha da tabela. De incio, esse cursor est posicionado antes da primeira linha. O mtodo next( ) que movimenta o cursor para o prximo registro. - Permite aplicao capturar os dados de cada coluna da tupla (linha) corrente atravs do mtodo getXXX(<coluna>), onde XXX o tipo da coluna e <coluna> o nome da coluna ou sua posio (a partir de 1). - Exemplo: 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); }

Transaes
Uma transao um conjunto de um ou mais comandos que so executados juntos como uma unidade: se no for possvel que todos sejam executados, ento nenhum deles ser executado. Uma transao um conjunto de Statements que so validados no BD com commit ou cancelados com rollback. Transaes podem ajudar a preservar a integridade dos dados de uma tabela. Por default, todos os comandos no JDBC so auto-commit.
con.setAutoCommit(false); // muda o default Statement stmt = con.createStatement(); stmt.executeUpdate(...); stmt.executeUpdate(...); if (...) con.commit(); //se Ok, valida os 2 updates else con.rollback(); //seno, desfaz os updates

O exemplo a seguir mostrar os procedimentos necessrios para executar comandos DML ao banco de dados por meio de comandos SQL.
import java.sql.*; public class TestaDML{ private static String driver,url; private Connection conexao; private Statement comando; private ResultSet resultado; public TestaDML(){ driver="sun.jdbc.odbc.JdbcOdbcDriver"; url="jdbc:odbc:Empresa"; //url="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=c:/java/empresa.mdb"; }

Consulta do Banco de Dados por meio do SQL

Exemplo (cont.)
public void conecta(){ try{ // carrega o driver da ponte jdbc-odbc Class.forName(driver); // abre conexao com o banco de dados conexao=DriverManager.getConnection(url); System.out.println("Conexo executada com sucesso"); } catch(SQLException SqlExc){ System.out.println("Erro de SQL!"); } catch(ClassNotFoundException exc){ System.out.println("Classe no encontrada!"); } }

Exemplo (cont.)
public void insereDados(){ try{ String sql="insert into empregados values(1238,'Marcos','Analista',2000);"; comando=conexao.createStatement(); comando.executeUpdate(sql); } catch(SQLException SqlExc){ System.out.println("Erro de SQL!"); } }

Exemplo (cont.)
public void listaDados (){ String sql="select cpf,nome,cargo,salario from empregados"; try{ comando=conexao.createStatement(); resultado=comando.executeQuery(sql); while(resultado.next()){ String cpf=resultado.getString("cpf"); String nome=resultado.getString("nome"); String cargo=resultado.getString("cargo"); String salario=resultado.getString("salario"); System.out.println("CPF: "+cpf+" - "+"NOME: "+nome+" "+"CARGO: "+cargo+" - "+"SALARIO:"+salario); } } catch(SQLException SqlExc){ System.out.println("Erro de SQL!"); }}

Exemplo (cont.)
public void modificaDados(){ try{ String sql="update empregados set salario=3000 where cpf=1238;"; comando=conexao.createStatement(); comando.executeUpdate(sql); } catch(SQLException SqlExc){ System.out.println("Erro de SQL!"); } }

Exemplo (cont.)
public void eliminaDados(){ try{ String sql="delete from empregados where cpf=1238;"; comando=conexao.createStatement(); comando.executeUpdate(sql); } catch(SQLException SqlExc){ System.out.println("Erro de SQL!"); } }

Exemplo (cont.)
public void desconecta(){ try{ conexao.close(); } catch(SQLException SqlExc){ System.out.println("Erro de SQL!"); } } public static void main(String args[]){ TestaDML tdml=new TestaDML(); tdml.conecta(); tdml.insereDados(); tdml.listaDados(); tdml.modificaDados(); tdml.eliminaDados(); tdml.desconecta(); }

Navegando no BD atravs de uma interface grfica


O exemplo a seguir apresenta a navegao em uma interface grfica. O exemplo foi dividido em diversos mtodos a fim de facilitar o entendimento. Os tratamentos de exceo no foram introduzidos para no deixar o cdigo muito extenso.

Exemplo de navegao em BD
import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.sql.*; public class NavegaBanco extends JFrame implements ActionListener{ private JLabel jlcpf,jlnome,jlcargo,jlsalario; private JTextField jtfcpf,jtfnome,jtfcargo,jtfsalario; private JButton jbproximo,jbanterior,jbprimeiro,jbultimo, jbalterar,jbincluir,jbexcluir,jbsair,jblimpa; private JPanel jpdados,jpnavegacao,jpalteracao,jpgeral; private Connection conexao; private Statement comando; private ResultSet resultado; private static String driver,url;

Exemplo de navegao em BD (cont.)


public NavegaBanco(){ driver="sun.jdbc.odbc.JdbcOdbcDriver"; url="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=c:/java/empresa.mdb"; jlcpf=new JLabel("CPF"); jlnome=new JLabel("Nome"); jlcargo=new JLabel("Cargo"); jlsalario=new JLabel("Salrio"); jtfcpf=new JTextField(10); jtfnome=new JTextField(10); jtfcargo=new JTextField(10); jtfsalario=new JTextField(10); jbproximo=new JButton("prximo"); jbanterior=new JButton("anterior"); jbprimeiro=new JButton("primeiro"); jbultimo=new JButton("ltimo");

Exemplo de navegao em BD (cont.)


jbincluir=new JButton("incluir"); jbalterar=new JButton("alterar"); jbexcluir=new JButton("excluir"); jbsair=new JButton("sair"); jblimpa=new JButton("limpar"); jpdados=new JPanel(new GridLayout(4,1)); jpnavegacao=new JPanel(new FlowLayout()); jpalteracao=new JPanel(new FlowLayout()); jpgeral=new JPanel(new GridLayout(4,2)); jpdados.add(jlcpf); jpdados.add(jtfcpf); jpdados.add(jlnome); jpdados.add(jtfnome); jpdados.add(jlcargo); jpdados.add(jtfcargo); jpdados.add(jlsalario); jpdados.add(jtfsalario);

Exemplo de navegao em BD (cont.)


jpnavegacao.add(jbproximo); jpnavegacao.add(jbanterior); jpnavegacao.add(jbprimeiro); jpnavegacao.add(jbultimo); jpalteracao.add(jbincluir); jpalteracao.add(jbalterar); jpalteracao.add(jbexcluir); jpalteracao.add(jblimpa); jpalteracao.add(jbsair); jpgeral.add(jpdados); jpgeral.add(jpnavegacao); jpgeral.add(jpalteracao); getContentPane().add(jpgeral); jbproximo.addActionListener(this); jbanterior.addActionListener(this); jbprimeiro.addActionListener(this); jbultimo.addActionListener(this);

Exemplo de navegao em BD (cont.)


jbsair.addActionListener(this); jblimpa.addActionListener(this); jbincluir.addActionListener(this); jbalterar.addActionListener(this); jbexcluir.addActionListener(this); setTitle("Navegando no Banco de Dados"); setVisible(true); pack(); }

Exemplo de navegao em BD (cont.)


public void actionPerformed(ActionEvent e){ try{ if(e.getSource()==jbproximo) resultado.next(); if(e.getSource()==jbanterior) resultado.previous(); if(e.getSource()==jbprimeiro) resultado.first(); if(e.getSource()==jbultimo) resultado.last(); if(e.getSource()==jbincluir) insereDados(); if(e.getSource()==jbalterar) modificaDados(); if(e.getSource()==jbexcluir) eliminaDados();

Exemplo de navegao em BD (cont.)


if(e.getSource()==jblimpa) limpaCampos(); if(e.getSource()!=jblimpa || e.getSource()!=jbexcluir)atualizaCampos(); if(e.getSource()==jbsair){ desconecta(); System.exit(0); } } catch(SQLException SqlExc){ System.out.println("Erro de SQL!"); } }

Exemplo de navegao em BD (cont.)


public void conecta(){ try{ Class.forName(driver); conexao=DriverManager.getConnection(url); System.out.println("Conexo executada com sucesso"); } catch(SQLException SqlExc){ System.out.println("Erro de SQL!"); } catch(ClassNotFoundException exc){ System.out.println("Classe no encontrada!"); } } public void listaDados (){ String sql="select cpf,nome,cargo,salario from empregados";

Exemplo de navegao em BD (cont.)


try{ comando=conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE ); resultado=comando.executeQuery(sql); resultado.first(); atualizaCampos(); } catch(SQLException SqlExc){ System.out.println("Erro de SQL!"); } }

public void insereDados(){ try{ String sql="insert into empregados values("+jtfcpf.getText()+",'"+jtfnome.getText()+"','"+

Exemplo de navegao em BD (cont.)


jtfcargo.getText()+"',"+jtfsalario.getText()+"); "; comando.executeUpdate(sql); listaDados (); } catch(SQLException SqlExc){ System.out.println("Erro de SQL!"); }

Exemplo de navegao em BD (cont.)


public void modificaDados(){ try{ String sql="update empregados set nome='"+jtfnome.getText()+"',cargo='"+jtfcargo.getText()+"',salari o="+jtfsalario.getText()+" where cpf="+jtfcpf.getText()+";"; comando.executeUpdate(sql); listaDados (); } catch(SQLException SqlExc){ System.out.println("Erro de SQL!"); } }

Exemplo de navegao em BD (cont.)


public void eliminaDados(){ try{ String sql="delete from empregados where cpf="+jtfcpf.getText()+";"; comando.executeUpdate(sql); listaDados (); } catch(SQLException SqlExc){ System.out.println("Erro de SQL!"); } }

Exemplo de navegao em BD (cont.)


public void atualizaCampos(){

try{ jtfcpf.setText(resultado.getString("cpf")); jtfnome.setText(resultado.getString("nome")); jtfcargo.setText(resultado.getString("cargo")); jtfsalario.setText(resultado.getString("salario"));

} catch(SQLException SqlExc){ System.out.println("Erro de SQL!"); } }

Exemplo de navegao em BD (cont.)


public void limpaCampos(){ jtfcpf.setText(""); jtfnome.setText(""); jtfcargo.setText(""); jtfsalario.setText(""); } public void desconecta(){ try{ conexao.close(); } catch(SQLException SqlExc){ System.out.println("Erro de SQL!"); } } public static void main(String args[]){ NavegaBanco nb=new NavegaBanco(); nb.conecta(); nb.listaDados(); } }

Exerccio
Como sugesto para manipulao de banco de dados, faa um cadastro de clientes, seguindo os mesmos procedimentos apresentados no cadastramento de empregados. Utilize pelo menos os campos cdigo, nome, endereo, telefone e sexo. Voc deve seguir todos os passos desde a criao do banco de dados. Utilize sua criatividade.

Bibliografia
- FURGERI, Srgio. Java 2: Ensino didtico: Desenvolvendo e Implementando Aplicaes - So Paulo: rica, 372p. 2002. - TAMASSIA, R.; GOODRICH, M.T. Estrutura de Dados e Algoritmos em Java. Bookman, 2002. - DEITEL,H.M.; DEITEL, P.J. Java: Como Programar, Bookman, 2002.

You might also like