Beruflich Dokumente
Kultur Dokumente
Bacharelado em Informtica
Antonio Yuri
Jailson do Amor Divino
Felipe Souza
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.
JDK
Conector JDBC (Ir mudar de acordo com o banco utilizado, no caso desse tutorial
ser o conector para o PostgreSql).
Instalao do PostgreSql:
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
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
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
11
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
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");
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
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();
}
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();
23
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
//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