Académique Documents
Professionnel Documents
Culture Documents
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.
De um duplo clique em cima da base Criada MiniCurso => Schemas => Public => Tables Deixe a seguinte estrutura, como mostra figura abaixo:
seguinte:
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;
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.
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
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.
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.
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;
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() {
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
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
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.
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;
//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; } }
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;
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.
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.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
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
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...
Crie os campos que representaro os dados a serem persistidos, tente deixar a Tela com a seguinte aparncia.
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
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(); }
// 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>();
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
//Cdigo do mtodo ActionPerformed(); => Boto Gravar private void jbGravarActionPerformed(java.awt.event.ActionEvent evt) { gravarPessoa(); }
//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); }
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(); }
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
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