32
Universidade Católica do Salvador Bacharelado em Informática Antonio Yuri Jailson do Amor Divino Felipe Souza Tutorial: Trabalhando com JDBC Configuração e manipulação. Professor: Eduardo Jorge

JDBC Trabalho

Embed Size (px)

DESCRIPTION

jdbc

Citation preview

  • Universidade Catlica do SalvadorBacharelado em Informtica

    Antonio Yuri Jailson do Amor Divino

    Felipe Souza

    Tutorial: Trabalhando com JDBC

    Configurao e manipulao.

    Professor: Eduardo Jorge

  • Salvador Maio/2008

    Tutorial: Trabalhando com JDBC

    Introduo:

    O presente tutorial tem por objetivo mostrar como aplicaes Java estabelecem uma conexo com o Banco de Dados e a partir das mesmas Inserem, Consultam e Buscam dados. Para isso utilizaremos para a demonstrao o banco de dados Postgresql usando o pgAdmin para manipulao e criao das tabelas e o IDE NetBeans da Sun.

    O que JDBC:

    Java Database Connectivity ou JDBC um conjunto de classes e interfaces (API) escritas em Java que faz o envio de instrues SQL para qualquer banco de dados relacional; APIs de baixo nvel base para APIs de alto nvel; Amplia o que voc pode fazer com Java; Possibilita o uso de bancos de dados j instalados; Para cada banco de dados h um driver JDBC que pode cair em quatro categorias. So elas: Ponto JDBC-ODBC, Driver API-Nativo, Driver de Protocolo de Rede e Driver Nativo.

    Wikipdia, a enciclopdia livre.

    A funo do driver JDBC alm da conectividade aplicao-banco tornar a aplicao mais independente do banco, ou seja, caso seja necessrio por algum motivo a mudana de um banco Postgresql para um banco Oracle, simplesmente basta mudar o conector JDBC, sem ter a necessidade de alterar toda a aplicao.

    Recursos utilizados no tutorial:

    Postgree for Windows -Link: superdownloads.uol.com.br/download/77/postgresql/

    JDK

    IDE Java - opcional, recomendo Netbeans (www.netbeans.org) ou Eclipse (www.eclipse.org) ambos em suas verses mais recentes.

    2

  • Conector JDBC (Ir mudar de acordo com o banco utilizado, no caso desse tutorial ser o conector para o PostgreSql).

    Instalao do PostgreSql:

    1 Passo: Fazer o download do arquivo compactado contendo o instalador, ele possui aproximadamente 17.5 MB de tamanho.

    2 Passo: Descompacte o pacote e executar o arquivo postgresql-8.3.msi. (Fig 1.0).

    3

  • Fig 1.0

    3 Passo: Clique em avanar at a seguinte tela (fig 2.0), voc ter as opes de instalao. Aconselho que os mdulos de Database Server (Servidores de banco de dados) e de User Interface (Interfaces do Usurio) fiquem habilitados. Para isso basta clicar nos mdulos e selecionar a primeira opo.

    Fig 2.0

    4 Passo: Se voc desejar que o PostgreSQL seja instalado como um servio no Windows habilite o checkbox "Instalar como Servio"(fig 3.0), caso no queira marque essa caixa, o servio ter que ser iniciado manualmente, irei falar como fazer isso nos passos a frente. Aqui vem uma das partes mais crticas da instalao, que relacionado colocao do usurio que vai rodar o servio. Esse usurio no um usurio do SGBD, mas sim do prprio Windows. Este usurio no pode ser administrador e tambm no pode ser um usurio sem senha, caso coloque um usurio que no exista o instalador ira perguntar se voc deseja cri-lo.

    4

  • Fig 3.0

    5 Passo: Na janela seguinte so pedidas as opes relacionadas que porta o servidor ir rodar, codificao e tambm qual ser o super usurio. Este usurio um usurio interno do SGBD e no pode possuir a mesma senha do usurio do Windows especificado anteriormente. (fig 4.0). Aps informar a senha e clicar em Prximo ser exibida a tela solicitando a seleo da Linguagem Procedural, basta clicar em Prximo novamente, pois a Linguagem PL/pgsql j estar marcada.

    Tambm existe a opo para aceitar conexes que no so vindas de localhost. Por mais que esta opo esteja selecionada, voc ter que conceder acesso aos endereos que desejar editando o arquivo pg_hba.conf.

    5

  • Fig 4.0

    6 Passo: Ser necessrio tambm optar pelos mdulos adicionais que deseja instalar, fica a seu critrio o que voc realmente vai utilizar. (fig 5.0).

    Fig 5.0

    6

  • 7 Passo: Para concluir a instalao, basta desmarcar a opo Launch Stack Builder at exit, caso voc no deseje acrescentar nenhum mdulo adicional. Caso contrario marque esta opo e acrescente os mdulos desejados antes de concluir a instalao. No nosso caso no necessrio. (Fig. 6.0).

    Fig. 6.0

    7

  • Criando as Tabelas no Banco de Dados:

    Vamos aos passos,

    1 Passo: Caso durante o processo de atualizao a checkbox "Install as service no tenha sido habilitada, ser necessrio inicializar, para isso, acesse o menu Iniciar - > Todos os Programas -> PostgreSQL 8.3 -> Iniciar Servio, conforme mostrado na figura abaixo (fig 7.0).

    Fig 7.0

    8

  • 2 Passo - Aps isso, no mesmo menu execute o pgAdmin III, na tela do programa de um duplo clique no local indicado pela figura (fig 8.0).

    Fig 8.0

    3 Passo - Ser solicitada uma senha, esta senha a mesma criada durante a instalao nos passos anteriores. (fig 3.0).

    9

  • Fig 9.0

    4 Passo - Feito isto, voc estar conectado ao banco, agora iremos criar uma tabela para testes, para isso, acesse a aba Ferramentas -> Ferramenta de Consulta, na tela aberta recorte e cole o cdigo abaixo e click em F5:

    CREATE TABLE dados( id character varying(4) NOT NULL,

    10

  • nome character varying(60) NOT NULL, endereco character varying(60) NOT NULL, telefone character varying(10) NOT NULL, bairro character varying(10) NOT NULL, estado character varying(2) NOT NULL)

    Iniciando a utilizao do JDBC:

    Antes de comearmos a falar de como devem ser feita s configuraes para a utilizao do JDBC na sua aplicao Java, necessrio tratar de algumas questes importantes. Iremos utilizar para exemplificar o uso do JDBC 5 classes com que possuem meios de consultas simples a banco, uma remoo e uma insero.

    11

  • Configurando o JDBC da sua Aplicao:

    - Configurando no Netbeans:

    1 Passo:

    Selecione o menu A) Arquivo sub-menu B)Novo projeto (fig.10.0)

    12

  • Fig. 10.0

    2Passo

    Aps a criao do novo projeto clique com o boto direito do mouse na pasta biblioteca e escolha a opo Adicionar JAR/Pasta (fig.11.0). E escolha o local onde foi salvo o conector JDBC na sua maquina(fig.13,0).

    13

  • Fig.11.0

    Fig.12.0

    - Configurando no Netbeans:

    14

  • 1 Passo:

    No menu Project na opo Properties(fig 14.0)

    fig 14.02 Passo

    Na janela que se abre escolha a opo Java Build Path (fig 15.0)

    15

  • fig 15.0

    3 Passo

    Escolha a aba Libaries(fig 16.0)

    16

  • Fig16.0

    4 Passo

    Clique no boto Add External JARs...(fig 17.0)

    17

  • Fig17.0

    5 Passo

    Escolha o local onde foi salvo o conector JDBC(fig 18.0)

    18

  • fig 18.0

    Aplicao para exemplo do uso do conector JDBC:

    Neste tutorial vamos usar 5 classes para demonstrar como trabalhar com JDBC.

    Vamos a elas:

    Classe ConnectionFactory.java

    Est classe a responsvel por conectar a aplicao ao banco, ela se estrutura como uma fabrica de conexes, ou seja, no importa de onde ela chamada, ela cria a conexo e devolve para quem chamou,toda vez que temos que manipular algo no banco, ela ser chamada, caso ocorra algum erro nesta classe, a aplicao no ir funcionar:

    Como vamos trabalhar com elementos em sql temos que fazer o import :

    19

  • java.sql.*;

    Teremos agora que registrar o driver no sistema, abrindo uma classe que depois ira se registrar no DriverManager , fazemos isso utilizando,:Class.forName ("org.postgresql.Driver").newInstance();

    Aps isso, iremos avisar ao gerente de drivers que existe agora um driver postgre, para criarmos uma ligao entre a aplicao e o banco, passamos como parmetros a url do banco, o usurio e a senha:DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "usuario", "senha");

    A classe completa fica assim:

    import java.sql.*;public class ConnectionFactory {

    public static Connection getConnection() throws Exception { try { Class.forName ("org.postgresql.Driver").newInstance(); return DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "topicos2"); } catch (ClassNotFoundException e) { throw new SQLException(e.getMessage()); } }}

    Classe contato.java

    Para criarmos um objeto com os valores referentes ao do nosso banco, utilizaremos JavaBeans, ou seja, uma classe contendo apenas os Get e Set:

    public class Contato {private String id;private String nome;private String endereco;private String telefone;private String bairro;private String estado;

    20

  • public String getId() { return id; }

    public void setId(String id) { this.id = id; }

    public String getNome() { return nome; }

    public void setNome(String nome) { this.nome = nome; }

    public String getEndereco() { return endereco; }

    public void setEndereco(String endereco) { this.endereco = endereco; }

    public String getTelefone() { return telefone; }

    public void setTelefone(String telefone) { this.telefone = telefone; }

    public String getBairro() { return bairro; }

    public void setBairro(String bairro) { this.bairro = bairro; }

    public String getEstado() { return estado; }

    public void setEstado(String estado) { this.estado = estado; }}

    Classe contatoDAO.java

    21

  • DAO (Data access Object), a funo dessa classe remover todo e qualquer vestgio de cdigo SQL da parte de lgica da sua aplicao. Observe apenas chamarmos um mtodo adiciona e simplesmente ele adiciona o nosso dado no banco.

    justamente isso que essa classe faz, toda a parte da implementao SQL fica encapsulada nela, e o desenvolver nem se preocupa com isso. Inclusive a requisio de conexo feita nesta classe.

    import java.sql.*;import javax.swing.*;import java.util.*;

    public class ContatoDAO {

    // a conexo com o banco de dados private Connection connection;

    public ContatoDAO() throws Exception { this.connection = ConnectionFactory.getConnection(); }

    Um coisa importante de se explicar nessa parte do cdigo a diferena entre PreparedStatement e Statement

    Basicamente ambos executam a mesma coisa, ms utilizar o Statement sinnimo de uma m pratica de programao, pois so esses carinhas que recebem a query para depois ser executada, mas usando o Statement, significa que a query ter que ser montada no prprio cdigo, ela ser esttica.

    Statement stmt = this.connection.Statement("insert into dados values (Nome,Bairro)");

    Por ser mais intuitivo, vamos trabalhar com java.sql.PreparedStatement pois, assim, no iremos ter a necessidade de passarmos a query pronta para o cdigo do programa, como seria o caso se estivssemos utilizando o java.sql.Statement, mas bom em uma outra ocasio estudar o Statement, pois em alguns casos ele se torna necessrio

    J com o PreparedStatement a query montada de acordo com os dados passador pelo usurio na alicao, da a criao da classe contato e contatoDAO, passamos um objeto contento todos os atributos que queremos inserir no banco.

    PreparedStatement stmt = this.connection.prepareStatement("insert into dados values (?,?,?,?,?,?)");// seta os valores stmt.setString(1, contato.getId()); stmt.setString(2, contato.getNome()); stmt.setString(3, contato.getEndereco()); stmt.setString(4, contato.getTelefone()); stmt.setString(5, contato.getBairro()); stmt.setString(6, contato.getEstado());

    22

  • Muito mais elegante e funcional, alem dela ser mais rpida que o Statement.

    Para executar basta chamar o execute:stmt.execute();

    Para finalizar a operao fechamos a conexo com o banco:stmt.close();

    A classe completa fica assim com as funes de adiconar, buscar e remover:

    import java.sql.*;import javax.swing.*;import java.util.*;

    public class ContatoDAO {

    // a conexo com o banco de dados private Connection connection;

    public ContatoDAO() throws Exception { this.connection = ConnectionFactory.getConnection(); }

    public void adiciona(Contato contato) throws SQLException {// prepared statement para insero PreparedStatement stmt = this.connection.prepareStatement("insert into dados values (?,?,?,?,?,?)");// seta os valores stmt.setString(1, contato.getId()); stmt.setString(2, contato.getNome()); stmt.setString(3, contato.getEndereco()); stmt.setString(4, contato.getTelefone()); stmt.setString(5, contato.getBairro()); stmt.setString(6, contato.getEstado()); //JOptionPane.showMessageDialog(null,stmt);// executa stmt.execute(); stmt.close();

    }

    public void retirar(String del[]) throws SQLException { PreparedStatement stmt = this.connection.prepareStatement("delete from dados where id = ?"); stmt.setString(1, del[0]); stmt.executeUpdate(); JOptionPane.showMessageDialog(null, "Dados Removidos com Sucesso"); stmt.close(); }

    public void buscar(String id[]) throws SQLException { ResultSet res = null;

    23

  • PreparedStatement stmt = this.connection.prepareStatement("select * from dados where id = ?"); stmt.setString(1, id[0]); res = stmt.executeQuery(); while (res.next()) { String cod = res.getString(1); String nome = res.getString(2); String endereco = res.getString(3); String telefone = res.getString(4); String bairro = res.getString(5); String estado = res.getString(6); JOptionPane.showMessageDialog(null, "Id: " + cod + "\n" + "Nome: " + nome + "\n" + "Endereo: " + endereco + "\n" + "Telefone: " + telefone + "\n" + "Bairro: " + bairro + "\n" + "Estado: " + estado); stmt.close(); }

    }}

    Classe menu.java

    Nesta classe basicamente toda ela apenas elementos de tela, porem existe uma parte muito importante para nos que a passagem de parmetros para a manipulao do banco, a linha de cdigo que nos interessa a seguinte: if (e.getSource() == toInserir) { Contato contato = new Contato(); contato.setId(valor01.getText()); contato.setNome(valor02.getText()); contato.setEndereco(valor03.getText()); contato.setTelefone(valor04.getText()); contato.setBairro(valor05.getText()); contato.setEstado(valor06.getText()); try { ContatoDAO dao = new ContatoDAO(); dao.adiciona(contato); } catch (Exception f) {

    Aps preencher todos os campos da tela o usurio clica em inserir, feito isso, o programa ira instanciar um objeto contato, e efetuar todos os Set de acordo com os valores que o usurio preencheu, aps isso utilizando um try-catch instanciamos agora um objeto da ContatoDAO e chamamos o mtodo adiciona passando o objeto contato.

    Isso para adicionar ao banco, j para buscar e remover, o procedimento foi diferente.

    Bastou apenas uma passagem de String para a classe ContatoDAO

    24

  • String del; del = valor01.getText();

    try { ContatoDAO dao = new ContatoDAO(); dao.retirar(del); valor01.setText(null); } catch (Exception o) {

    }

    A classe completa ficou assim:

    import javax.swing.*;import java.awt.*;import java.awt.event.*;import javax.swing.JButton;import java.sql.*;import java.util.ArrayList;import java.util.List;

    @SuppressWarnings("serial")public class Menu extends JFrame implements ActionListener {

    List l = new ArrayList(); JMenuBar M1; JTextField T1; JMenu menuOpcao; JMenuItem miInserir, miBusca, miDeletar; public static final long serialVersionUID = 1L; public JLabel titulo, titulo1, titulo2, nome01, nome02, nome03, nome04, nome05, nome06; public JTextField valor01, valor02, valor03, valor04, valor05, valor06; public JButton toInserir, toDeletar, toBuscar;

    public Menu() {

    super("Inserir Novo Contato");

    Container container = getContentPane(); container.setLayout(null); setTitle("Trabalho JDBC - Topicos 2"); setSize(270, 130); setLocation(520, 250);

    25

  • //barra de Menu M1 = new JMenuBar(); //cria a barra de menusd menuOpcao = new JMenu("Opo"); //cria um novo menu miInserir = new JMenuItem("Inserir");//cria um item miInserir.addActionListener(this); miDeletar = new JMenuItem("Deletar");//cria um item miDeletar.addActionListener(this); miBusca = new JMenuItem("Buscar");//cria um item miBusca.addActionListener(this); menuOpcao.add(miInserir);//adiciona o item ao menu menuOpcao.add(miDeletar); menuOpcao.add(miBusca); M1.add(menuOpcao);//adiciona o menu na barra de menus setJMenuBar(M1);

    //todos os titulos titulo = new JLabel("============Inserir Contato==========="); titulo1 = new JLabel("============Deletar Contato==========="); titulo2 = new JLabel("============Buscar Contato==========="); nome01 = new JLabel("ID:(Max 4)"); nome02 = new JLabel("Nome:(Max 60)"); nome03 = new JLabel("Endereo:(Max 60)"); nome04 = new JLabel("Telefone:(Max 10)"); nome05 = new JLabel("Bairro:(Max 20)"); nome06 = new JLabel("Estado:(Max 2)");

    //campos de texto valor01 = new JTextField(50); valor02 = new JTextField(50); valor03 = new JTextField(50); valor04 = new JTextField(50); valor05 = new JTextField(50); valor06 = new JTextField(50);

    //botao: toInserir = new JButton("Inserir"); toInserir.addActionListener(this); toDeletar = new JButton("Deletar"); toDeletar.addActionListener(this); toBuscar = new JButton("Buscar"); toBuscar.addActionListener(this); // define tamanho da janela e mostra ela setSize(550, 450); setVisible(true);

    26

  • container.add(titulo); titulo.setVisible(false); titulo.setBounds(150, 10, 300, 17);

    container.add(titulo1); titulo1.setVisible(false); titulo1.setBounds(150, 10, 300, 17);

    container.add(titulo2); titulo2.setVisible(false); titulo2.setBounds(150, 10, 300, 17);

    container.add(nome01); nome01.setBounds(30, 60, 100, 15); nome01.setVisible(false); container.add(valor01); valor01.setVisible(false); valor01.setBounds(160, 59, 300, 17);

    container.add(nome02); nome02.setBounds(30, 90, 100, 15); nome02.setVisible(false); container.add(valor02); valor02.setVisible(false); valor02.setBounds(160, 89, 300, 17);

    container.add(nome03); nome03.setBounds(30, 120, 110, 15); nome03.setVisible(false); container.add(valor03); valor03.setVisible(false); valor03.setBounds(160, 119, 300, 17);

    container.add(nome04); nome04.setBounds(30, 150, 110, 15); nome04.setVisible(false); container.add(valor04); valor04.setVisible(false); valor04.setBounds(160, 149, 300, 17);

    container.add(nome05); nome05.setBounds(30, 180, 100, 15); nome05.setVisible(false); container.add(valor05); valor05.setVisible(false);

    27

  • valor05.setBounds(160, 179, 300, 17);

    container.add(nome06); nome06.setBounds(30, 210, 100, 15); nome06.setVisible(false); container.add(valor06); valor06.setVisible(false); valor06.setBounds(160, 209, 300, 17);

    container.add(toInserir); toInserir.setVisible(false); toInserir.setBounds(200, 310, 130, 30);

    container.add(toDeletar); toDeletar.setVisible(false); toDeletar.setBounds(200, 310, 130, 30);

    container.add(toBuscar); toBuscar.setVisible(false); toBuscar.setBounds(200, 310, 130, 30);

    }

    public void actionPerformed(ActionEvent e) {

    //Buscar itens

    if (e.getSource() == miBusca) { //Setar valor nulos valor01.setText(null); valor02.setText(null); valor03.setText(null); valor04.setText(null); valor05.setText(null); //Esconder caso seja false e mostrar caso seja true os botes. toInserir.setVisible(false); toDeletar.setVisible(false); toBuscar.setVisible(true); valor01.setVisible(true); nome01.setVisible(true); valor02.setVisible(false); nome02.setVisible(false); valor03.setVisible(false);

    28

  • nome03.setVisible(false); valor04.setVisible(false); nome04.setVisible(false); valor05.setVisible(false); nome05.setVisible(false); valor06.setVisible(false); nome06.setVisible(false); titulo.setVisible(false); titulo1.setVisible(false); titulo2.setVisible(true); } if ((e.getSource() == toBuscar) && ((valor01.getText()).equals(""))) { JOptionPane.showMessageDialog(null, "Favor preencher todos os campos!", "Erro", JOptionPane.PLAIN_MESSAGE); } else { if (e.getSource() == toBuscar) { String id; //id = new String[1]; id = valor01.getText(); try { ContatoDAO dao = new ContatoDAO(); dao.buscar(id); valor01.setText(null); } catch (Exception d) {

    }

    } }

    //Deletar um Item if (e.getSource() == miDeletar) { valor01.setText(null); valor02.setText(null); valor03.setText(null); valor04.setText(null); valor05.setText(null); toInserir.setVisible(false); toDeletar.setVisible(true); toBuscar.setVisible(false); valor01.setVisible(true); nome01.setVisible(true);

    29

  • valor02.setVisible(false); nome02.setVisible(false); valor03.setVisible(false); nome03.setVisible(false); valor04.setVisible(false); nome04.setVisible(false); valor05.setVisible(false); nome05.setVisible(false); valor06.setVisible(false); nome06.setVisible(false); titulo.setVisible(false); titulo1.setVisible(true); titulo2.setVisible(false); } if ((e.getSource() == toDeletar) && (((valor01.getText()).equals("")))) { JOptionPane.showMessageDialog(null, "Favor preencher todos os campos!", "Erro", JOptionPane.PLAIN_MESSAGE); } else { if (e.getSource() == toDeletar) { String del; del = valor01.getText(); try { ContatoDAO dao = new ContatoDAO(); dao.retirar(del); valor01.setText(null); } catch (Exception o) {

    }

    }

    }

    if (e.getSource() == miInserir) { valor01.setText(null); valor02.setText(null); valor03.setText(null); valor04.setText(null); valor05.setText(null); valor06.setText(null); toInserir.setVisible(true);

    30

  • toDeletar.setVisible(false); toBuscar.setVisible(false); valor01.setVisible(true); nome01.setVisible(true); valor02.setVisible(true); nome02.setVisible(true); valor03.setVisible(true); nome03.setVisible(true); valor04.setVisible(true); nome04.setVisible(true); valor05.setVisible(true); nome05.setVisible(true); valor06.setVisible(true); nome06.setVisible(true); titulo.setVisible(true); titulo1.setVisible(false); titulo2.setVisible(false); } if ((e.getSource() == toInserir) && (((valor01.getText()).equals("")) || ((valor02.getText()).equals("")) || ((valor03.getText()).equals("")) || ((valor04.getText()).equals("")) || ((valor05.getText()).equals("")) || ((valor06.getText()).equals("")))) { JOptionPane.showMessageDialog(null, "Favor preencher todos os campos!", "Erro", JOptionPane.PLAIN_MESSAGE); } else { if (e.getSource() == toInserir) { Contato contato = new Contato(); contato.setId(valor01.getText()); contato.setNome(valor02.getText()); contato.setEndereco(valor03.getText()); contato.setTelefone(valor04.getText()); contato.setBairro(valor05.getText()); contato.setEstado(valor06.getText()); try { ContatoDAO dao = new ContatoDAO(); dao.adiciona(contato); } catch (Exception f) {

    } valor01.setText(null); valor02.setText(null); valor03.setText(null); valor04.setText(null); valor05.setText(null); valor06.setText(null); }

    31

  • }

    }}

    32