Sie sind auf Seite 1von 32

Universidade Catlica do Salvador

Bacharelado 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 JDBCODBC, 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.

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).

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.

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.

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

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

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).

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.0
2 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
(Nome,Bairro)");

dados

values

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<String> l = new ArrayList<String>();
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

Das könnte Ihnen auch gefallen