Você está na página 1de 29

Persistncia de Objetos no SGBD PostgreSQL, Utilizando as APIs: JDBC, JDK, Swing e Design Patteners DAO.

Robson Ado Fagundes


http://robsonfagundes.blogspot.com/

Mini curso Desenvolvimento de aplicao Desktop, com Persistncia em Banco de Dados com o Uso da Linguagem de programao Java especificao J2SE. Tecnologias e Ferramentas Envolvidas: J2SE, APIs: JDBC, JDK e Swing; IDE NetBeans 6.1; SGBD PosgresSQL 8.2; Design Patterns DAO;

Vamos Iniciar a Aplicao: 1 Passo: Vamos Criar nossa base de dados, abra o PgAdmin III e crie uma base de dados chamada de: MiniCurso

Clique com boto direito do mouse sobre Databases e clique em New Database de o nome para ela de MiniCurso; e depois clique em OK.

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 1

De um duplo clique em cima da base Criada MiniCurso => Schemas => Public => Tables Deixe a seguinte estrutura, como mostra figura abaixo:

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 2

Clique no boto SQL:

Agora vamos criar nossa tabela no banco de dados o script SQL o

seguinte:

Cole o Cdigo SQL dentro do pgAdmin Query e clique no boto

Se a mensagem retornar SUCCESSFULLY nossa tabela no banco foi criado corretamente

Criado o Banco partiremos para segundo passo;

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 3

2 Passo: Inicie o NetBeans 6.1 crie um novo Java Application ou (Aplicao Java).

No nome do projeto coloque exemploJDBC; e desmarque a opo: Criar Classe Main depois em finalizar para criar nosso projeto;

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 4

3 Passo: Clique em Pacotes de Cdigo - Fonte e Crie um pacote chamado beans

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 5

Clique no pacote beans e crie a Classe Java chamada de Pessoa;

A classe Pessoa.java representara o nosso modelo, ou seja, nossa tabela do banco de dados. Ela devera ter atributos que representam as colunas da nossa tabela do banco de dados; Note que elas possuem o mesmo nome.

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 6

4 Passo: Criar os atributos da classe Pessoa.java que representaram as colunas da tabela pessoa, Os nomes das colunas devem ser iguais nos atributos do bean Pessoa.java

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 7

Agora devemos criar os mtodos Construtores da Classe, Seters e Geters do nosso bean; Clique com boto direito do mouse e clique em Inserir Cdigo e clique em Construtor no selecione nada e clique em gerar.

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 8

Agora Clique novamente com boto direito do mouse e clique em Inserir Cdigo e clique em Construtor e selecione todas as opes e clique em gerar.

Pronto nossa Classe j possui seus atributos e os mtodos construtores da classe sem parmetros e com parmetros.

Ainda Faltam os mtodos Seters e Geters;

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 9

Agora devemos criar os mtodos Seters e Geters do nosso bean; Clique com boto direito do mouse sobre os atributos da classe e selecione a opo: Refatorar => Encapsular campos...

Marque todas as opes e clique em Refatorar; Pronto j possumos nossa classe que representara os dados da tabela Pessoa Criada no nosso banco de dados. Voc deve ter a seguinte estrutura;

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 10

6 Passo: Pronto agora j temos o modelo de dados da nossa aplicao. Agora devemos criar uma conexo com o banco de dados. Criaremos um pacote chamado conexo e uma classe tambm chamada de Conexo.java; no src da aplicao. Os comentrios acima das linhas, explicam melhor o que cada linha da classe faz.

Copie e cole o cdigo abaixo na sua classe Conexo.java Os comentrios acima das linhas, explicam melhor o que cada linha da classe faz.

package conexao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class Conexao { // atributos private static Connection conexao = null; //esta a varivel fonte recebe o mesmo nome da base de dados //criada no postgresql private String fonte = "MiniCurso"; //Conexao Para a Base de Dados do PostgresSQL utilizando JDBC private Conexao() {

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 11

try { //Driver para fazer conexao com um Banco postgresql Class.forName("org.postgresql.Driver"); //comando para fazer conexao via JDBC com um banco postgresql //sendo informado o servidor e sua porta, no caso localhost na porta 5432 // + o nome da base de dados, o usuario e a senha. conexao = DriverManager.getConnection("jdbc:postgresql://127.0.0.1:5432/" + fonte, "usuario do banco", "senha do banco"); } catch (ClassNotFoundException e) { e.printStackTrace(); System.out.println("Ocorreu um erro de class no encontrada!!!"); } catch (SQLException e) { e.printStackTrace(); System.out.println("Ocorreu um erro na conexao com o banco de dados!!!"); } } public static Connection getInstance() { if (conexao == null) { new Conexao(); } return conexao; } }

Agora vamos adicionar para a biblioteca da nossa aplicao o Driver de conexo com o banco: postgresql-8.2-XXX.jdbcXXX.jar

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 12

Clique em Projetos => Bibliotecas => Adicionar JAR/pasta....

E especifique o caminho do seu Driver de conexo: postgresql-8.2-XXX.jdbcXXX.jar

Faa os imports e Compile a Classe Apertando a tecla F5 ou clicando com boto direito do mouse sobre o projeto, Clique em Limpar e Construir

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 13

Faa os imports e Compile a Classe garanta que no haja erros !!! 7 Passo: Agora vamos criar a classe Dao, Responsvel pela Persistncia dos dados no Banco. Data Access Object: Dao um modelo para persistir dados em aplicaes de banco de dados relacional. DAO (Data Access Object) um padro para persistncia de dados que permite separar regras de negcio das regras de acesso a banco de dados. Numa aplicao que utilize a arquitetura MVC, todas as funcionalidades de bancos de dados, tais como obter as conexes, mapear objetos Java para tipos de dados SQL ou executar comandos SQL, devem ser feitas por classes de DAO.

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 14

Seguindo... Criaremos um pacote chamado dao e uma classe tambm chamada de DaoPessoa.java Copie e cole o cdigo abaixo na sua classe DaoPessoa.java

package dao; import import import import import import import beans.Pessoa; conexao.Conexao; java.sql.PreparedStatement; java.sql.ResultSet; java.sql.SQLException; java.util.ArrayList; java.util.List;

/** * * @author rafsantos */ public class DaoPessoa { public DaoPessoa() { }

//GRAVAR //==================================== public boolean grava(Pessoa pessoa) { try { PreparedStatement comandoSQL; comandoSQL = Conexao.getInstance().prepareStatement("insert into Pessoa (id, nome, email, telefone) values(?,?,?,?)"); comandoSQL.setLong(1, pessoa.getId()); comandoSQL.setString(2, pessoa.getNome()); comandoSQL.setString(3, pessoa.getEmail()); comandoSQL.setString(4, pessoa.getTelefone()); comandoSQL.execute(); Conexao.getInstance().commit(); return true; } catch (SQLException e) { e.printStackTrace(); } return false; } //ALTERAR //==================================== public boolean atualiza(Pessoa pessoa) { try { PreparedStatement comandoSQL; comandoSQL = Conexao.getInstance().prepareStatement("update Pessoa set nome = ? where id = ? "); comandoSQL.setString(1, pessoa.getNome()); comandoSQL.setString(2, pessoa.getEmail()); comandoSQL.setString(3, pessoa.getTelefone()); comandoSQL.execute(); Conexao.getInstance().commit(); } catch (SQLException e) {
Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 15

e.printStackTrace(); } return false; } //DELETAR //===================================== public boolean deleta(Pessoa pessoa) { try { PreparedStatement comandoSQL; comandoSQL = Conexao.getInstance().prepareStatement("delete from Pessoa where id = ?"); comandoSQL.setLong(1, pessoa.getId()); comandoSQL.execute(); Conexao.getInstance().commit(); } catch (SQLException e) { e.printStackTrace(); } return false; }

//LISTAR TODOS //===================================== public List lista() { try { PreparedStatement comandoSQL; comandoSQL = Conexao.getInstance().prepareStatement("select * from Pessoa"); ResultSet rs = comandoSQL.executeQuery(); List arlPessoas = new ArrayList(); while (rs.next()) { Pessoa pess = new Pessoa(); pess.setId(rs.getLong("id")); pess.setNome(rs.getString("nome")); pess.setEmail(rs.getString("email")); pess.setTelefone(rs.getString("telefone")); arlPessoas.add(pess); } return arlPessoas; // conexao.commit(); } catch (SQLException e) { e.printStackTrace(); } return null; } //CONSULTA ESPECIFICA POR CAMPOS //===================================== public Pessoa consulta(int pk) { try { PreparedStatement comandoSQL; comandoSQL = Conexao.getInstance().prepareStatement("select * from
Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 16

Pessoa where id=?"); comandoSQL.setInt(1, pk); ResultSet rs = comandoSQL.executeQuery(); if (rs.next()) { Pessoa pess = new Pessoa(); pess.setId(rs.getLong("id")); pess.setNome(rs.getString("nome")); pess.setEmail(rs.getString("email")); pess.setTelefone(rs.getString("telefone")); return pess; } } catch (SQLException e) { e.printStackTrace(); } return null; } }

Faa os imports e Compile a Classe garanta que no haja erros !!!

Para que vocs entenderem o funcionamento da Classe Dao DaoPessoa.java Criada acima, farei o comentrio do que cada linha do cdigo explicando o que cada linha faz no nosso programa ok. Comentrios do Cdigo: Mtodo Gravar(); //GRAVAR Cria o mtodo do tipo boleean que retorna true se a operao for realizada com sucesso; e false se der algum erro de persistncia no banco; Ele recebe o Bean no caso o Pessoa passado como parmetro pela tela quando clicamos no boto gravar de nossa tela. O Bean Pessoa contem os dados digitados no JTEXTFIELD, passados a ele atravs dos Seters e Geters;

public boolean grava(Pessoa pessoa) {


// cria um try, catch para retornar o true ou false

try {
// crio uma instancia da Classe PreparedStatement chamada de comandoSQL, A classe PreparedStatement reponsavel pela Query com a base de dados

PreparedStatement comandoSQL;
// a instancia de comandoSQL ira receber uma instancia da classe conexo passando o cdigo SQL no caso o INSERT, observe que os campos dever ser iguais as tabelas do banco. Os VALUES sero passados nas linhas abaixo por isso os ????. A quantidade de ?, deve ser igual ao numero de campos da tabela.

comandoSQL = Conexao.getInstance().prepareStatement("insert into Pessoa (id, nome, email, telefone) values(?,?,?,?)");


// pega o valor do id do bean pessoa atravs do getId() e seto no comandoSQL com o

tipo Long; o numero 1 significa que eh o primeiro campo da nossa tabela comandoSQL.setInt(1, pessoa.getId());
Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 17

// pega o valor do Nome do bean pessoa atravs do getNome() e seto no comandoSQL com o tipo String; o numero 2 significa que o segundo campo da nossa tabela, os tipos Long, String, Date, esto definidos no nosso Beans o que o comandoSQL no sabe que tipo que eh por isso definimos ele atravs do setString(2, pessoa.getNome());

comandoSQL.setString(2, pessoa.getNome());
// o comentrio de cima de aplica a todas as linhas abaixo por serem todos Strings a nica diferena so os nmeros dois campos das tabelas;

comandoSQL.setString(3, pessoa.getEmail()); comandoSQL.setString(4, pessoa.getTelefone());


// serve para qualquer tipo de comando SQL. Ele retorna true ou false dependendo se existe ou no um ResultSet ele ira executar nossos comando SQL;

comandoSQL.execute();

// Faz todas as mudanas SQL e libera todos os fechamentos da base de dados prendidos atualmente por este objeto da conexo

Conexao.getInstance().commit();
// se no ocorrer nenhum erro ele retornara True e nossos dados contidos no beans sero, armazenados no Banco;

return true;
// o catch tem q retornar uma SQLException para podermos identificar possveis erros nos nossos cdigos java ou SQL acima escritos

} catch (SQLException e) {
// o e. printStackTrace ira imprimir o erro se houver

e.printStackTrace(); }
// se houver o erro ele ira retornar false;

return false;
// fim do mtodo Gravar

Comentrios do Cdigo: Mtodo Alterar(); ALTERAR


// O Altera tem os mesmo comentrios do mtodo acima com exceo da linha que contem o cdigo SQL que no ser mais um INSERT e sim um UPDATE, observe que o que ir mudar somente o nome do mtodo e o cdigo SQL contido na linha:

comandoSQL = conexao.getInstance().prepareStatement("update Pessoa set nome = ? where id = ?);


no resto da estrutura do mtodo ser igual os comentrios do mtodo Gravar();

Comentrios do Cdigo: Mtodo Deletar();


DELETAR // O deletar tem os mesmo comentrios do mtodo acima com exceo da linha que contem o cdigo SQL que no ser mais um INSERT e sim um DELETE, observe que o que ira mudar somente o nome do mtodo e o cdigo SQL contido na linha:

comandoSQL = Conexao.getInstance().prepareStatement("delete from Pessoa


Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 18

where id = ?");
observe que agora passamos somente o campo Id (que a nossa chave primaria da tabela pessoas) s precisamos passar o ID porque o prprio banco apagar os demais campos relacionados a esse Id atravs do comando SQL.

public boolean deleta(Pessoa pessoa) { try { PreparedStatement comandoSQL; comandoSQL = Conexao.getInstance().prepareStatement("delete from Pessoa where id = ?");
//passamos apenas o campo ID

comandoSQL.setInt(1, pessoa.getId()); comandoSQL.execute(); Conexao.getInstance().commit(); } catch (SQLException e) { e.printStackTrace(); } return false; }

8 Passo: Agora vamos criar a Tela, Responsvel pela captura dos dados informados pelo usurio. Criaremos uma classe do tipo gui (Graphical User Interface), ou seja, Interface Grfica do Usurio utilizando a classe JFrame da API Swing. Swing uma API Java para interfaces grficas. Ela compatvel com a API AWT, mas trabalha de uma maneira totalmente diferente. A API Swing procura renderizar\desenhar por contra prpria todos os componentes, ao invs de delegar essa tarefa ao sistema operacional, como a maioria das outras APIs de interface grfica trabalham. Por ser uma API de mais alto nvel, ou seja, mais abstrao, menor aproximao das APIs do sistema operacional, ela tem bem menos performance que outras APIs grficas e consome mais memria RAM em geral. Porm, ela bem mais completa, e os programas que usam Swing tm uma aparncia muito parecida, independente do Sistema Operacional utilizado. Seguindo... Criaremos um pacote chamado gui e dentro dele um Formulrio JFrame, Chamado de TelaPessoa.java Clique com boto direito do mouse sobre o pacote gui, Novo => Formulario JFrame...

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 19

Crie os campos que representaro os dados a serem persistidos, tente deixar a Tela com a seguinte aparncia.

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 20

Os Componentes da API Swing utilizados neste projeto so : JBotton : 4 Botes JPanel : 4 Painis com Bordas e Titulo JTabbedPane : Com 2 JPanel que so as Abas: JTextField : 4 representam nossos dados a serem persistidos Cdigo Nome Email Telefone JTable : Abrigara todos as pessoas cadastradas Lista de Pessoas

Gravar Alterar Excluir Listar

Fundo Aes Dados da Pessoa Lista de Pessoas

Aba Cadastro Aba Consulta

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 21

Tente deixar a Tela com a seguinte aparncia:

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 22

Agora vamos escrever o mtodo que ira popular nossa tabela com os dados do banco; Dentro do cdigo fonte no Inicio da Classe TelaPessoa.java dentro do mtodo construtor aps o mtodo InitComponents(); crie a chamada para o mtodo listarPessoas(); que ainda vamos criar dentro do cdigo junto com os mtodos, gravar, alterar, excluir e listar; Cdigo do mtodo TelaPessoas (); = Mtodo Construtor da Classe copie e cole dentro da sua classe TelaPessoas.

public TelaPessoas() { // inicia os componentes initComponents(); // dispose da MP TelaPessoas.this.dispose(); // preenche a tabela com os dados Do BD com o dao listarPessoas(); }

Atributos que deveram, ser declarados no escopo global da classe TelaPessoas.java

// instancia um novo objeto da classe Pessoa.java Pessoa pessoa = new Pessoa(); // instancia um novo objeto da classe DaoPessoa.java DaoPessoa daoP = new DaoPessoa(); // variavel da tabela modelo Pessoa private DefaultTableModel tabelaModeloPessoa; //Array List da tabela que ira popular a tabela List<Pessoa> arlTabela = new ArrayList<Pessoa>();

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 23

No evento ActionPerformed do Boto Gravar crie a chamada para o mtodo gravar que escreveremos ainda dentro da classe TelaPessoa; clique com boto direito do mouse sobre o boto em seguida em Eventos => Action = > actionPerformad

E cole o seguinte cdigo:

//Cdigo do mtodo ActionPerformed(); => Boto Gravar private void jbGravarActionPerformed(java.awt.event.ActionEvent evt) { gravarPessoa(); }

Na parte do mtodo main Crie o mtodo gravar

//Cdigo do mtodo gravarPessoa(); private void gravarPessoa() { pessoa.setId(new Integer(jtfId.getText())); pessoa.setNome(jtfNome.getText()); pessoa.setEmail(jtfEmail.getText()); pessoa.setTelefone(jtfTelefone.getText()); daoP.grava(pessoa); }

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 24

Repetir a ao para os demais mtodos ou seja o mesmo devera ser feito para os botes Alterar e Excluir e Listar, segue os cdigos fonte abaixo:

//Cdigo do mtodo ActionPerformed(); => Boto Alterar private void jbAlterarActionPerformed(java.awt.event.ActionEvent evt) { AlterarPessoa(); }

//Cdigo do mtodo alterarPessoa(); private void alterarPessoa() { pessoa.setId(new Integer(jtfId.getText())); pessoa.setNome(jtfNome.getText()); pessoa.setEmail(jtfEmail.getText()); pessoa.setTelefone(jtfTelefone.getText()); daoP.atualiza(pessoa); }

//Cdigo do mtodo ActionPerformed (); => Boto Excluir private void jbExcluirActionPerformed(java.awt.event.ActionEvent evt) { ExcluirPessoa(); }

//Cdigo do mtodo excluirPessoa();

private void deletarPessoa() { pessoa.setId(new Integer(jtfId.getText())); daoP.deleta(pessoa); }

Faa os imports e Compile a Classe garanta que no haja erros!!! Pronto com isso j podemos Realizar as operaes de CRUD (Create, Update Delete); Mais ainda falta o Listar para que possamos visualizar em tempo de execuo da aplicao, os dados persistidos ou apagados do Banco. No Inicio da Classe TelaPessoa.java dentro do mtodo construtor aps o mtodo InitComponents(); nos fizemos a chamada para o mtodo listarPessoas(); Este mtodo ser executado quando a nossa tela for construda portanto antes de o usurio visualizar a tela os dados existentes no banco de dados sero listados na tabela.

//Cdigo do mtodo listarPessoas(); public void preencherTabela() { try { arlTabela.removeAll(arlTabela); arlTabela = daoP.lista(); for (int i = 0; i < arlTabela.size(); i++) { Pessoa pess = (Pessoa) arlTabela.get(i);
Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 25

Vector linha = new Vector(); linha.add(pess.getId()); linha.add(pess.getNome()); linha.add(pess.getEmail()); linha.add(pess.getTelefone()); tabelaModeloPessoa.addRow(linha); } } catch (Exception ex) { ex.printStackTrace(); System.out.println("iiiiii deu erro na Tebela.........."); } }

Pronto com isso, podemos testar a aplicao; 9 Passo: Clique em Projetos => Executar

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 26

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 27

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 28

Concluso: Esse tutorial fornece apenas uma simples introduo sobre o assunto, Os Exemplos aqui mostrados fazem uso de pouqussimos recursos oferecidos por estas APIS. Lembre-se que com o estudo aprofundado sobre elas ser possvel desenvolver sistemas com: O envio de instrues SQL para qualquer banco de dados relacional; Possibilitar o uso de bancos de dados j instalados; Usar a API de baixo nvel como base para API de alto nvel, Usar recursos grficos para apresentao e manipulao de dados. Robson Ado Fagundes (http://robsonfagundes.blogspot.com) Analista de Sistemas Pleno e Docente das Disciplinas de Engenharia de Software II e Multimdia e Desenvolvimento Web do Curso de Sistemas de Informao da Faculdade Iguau Capanema - PR

Robson Ado Fagundes - http://robsonfagundes.blogspot.com/ - Pgina 29