jdbc trabalho
DESCRIPTION
jdbcTRANSCRIPT
-
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