Upload
daniel-padilha
View
251
Download
3
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