Robson Adão Fagundes - http://robsonfagundes.blogspot.com/ - Página 1 Persistência de Objetos no SGBD PostgreSQL, Utilizando as APIs: JDBC, JDK, Swing e Design Patteners DAO. Robson Adão Fagundes http://robsonfagundes.blogspot.com/ Mini curso Desenvolvimento de aplicação Desktop, com Persistência em Banco de Dados com o Uso da Linguagem de programação Java especificação 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 Aplicação: 1º Passo: Vamos Criar nossa base de dados, abra o PgAdmin III e crie uma base de dados chamada de: MiniCurso Clique com botão direito do mouse sobre Databases e clique em New Database de o nome para ela de MiniCurso; e depois clique em OK.
29
Embed
Persistência de Objetos no SGBD PostgresSQL Utilizando as APIs JDBC JDK Swing e Design Patteners DAO
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Pronto agora já temos o modelo de dados da nossa aplicação. Agora devemos criar uma conexão com
o banco de dados. Criaremos um pacote chamado conexão e uma classe também chamada de
Conexão.java; no src da aplicação.
Os comentários acima das linhas, explicam melhor o que cada linha da classe faz.
Copie e cole o código abaixo na sua classe Conexão.java
Os comentários 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 variável fonte recebe o mesmo nome d a base de dados //criada no postgresql private String fonte = "MiniCurso"; //Conexao Para a Base de Dados do PostgresSQL u tilizando JDBC private Conexao() {
try { //Driver para fazer conexao com um Banc o postgresql Class.forName("org.postgresql.Driver"); //comando para fazer conexao via JDBC c om um banco postgresql //sendo informado o servidor e sua port a, no caso localhost na porta 5432 // + o nome da base de dados, o usuario e a senha. conexao = DriverManager.getConnection("jdbc:postgre sql://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 não 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 aplicação o Driver de conexão com o banco:
Faça os imports e Compile a Classe garanta que não haja erros !!!
Para que vocês entenderem o funcionamento da Classe Dao “DaoPessoa.java” Criada acima, farei o
comentário do que cada linha do código explicando o que cada linha faz no nosso programa ok.
Comentários do Código: Método Gravar(); //GRAVAR Cria o método do tipo boleean que retorna true se a operação for realizada com sucesso; e false se der algum erro de persistência no banco; Ele recebe o Bean no caso o Pessoa passado como parâmetro pela tela quando clicamos no botão gravar de nossa tela. O Bean Pessoa contem os dados digitados no JTEXTFIELD, passados a ele através 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 conexão passando o código SQL no caso o INSERT, observe que os campos dever ser iguais as tabelas do banco. Os VALUES serão 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 através 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());
// pega o valor do Nome do bean pessoa através 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 , estão definidos no nosso Beans o que o comandoSQL
não sabe que tipo que eh por isso definimos ele através do setString(2, pessoa.getNome()); comandoSQL.setString(2, pessoa.getNome()); // o comentário de cima de aplica a todas as linhas abaixo por serem todos Strings a única diferença são os números 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 não um ResultSet ele ira executar nossos comando SQL; comandoSQL.execute(); // Faz todas as mudanças SQL e libera todos os fechamentos da base de dados prendidos atualmente por este objeto da conexão Conexao.getInstance().commit(); // se não ocorrer nenhum erro ele retornara True e nossos dados contidos no beans serão, armazenados no Banco; return true; // o catch tem q retornar uma SQLException para podermos identificar possíveis erros nos nossos códigos 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 método Gravar } Comentários do Código: Método Alterar(); ALTERAR // O Altera tem os mesmo comentários do método acima com exceção da linha que contem o código SQL que não será mais um INSERT e sim um UPDATE, observe que o que irá mudar é somente o nome do método e o código SQL contido na linha: comandoSQL = conexao.getInstance().prepareStatement ("update Pessoa set nome = ? where id = ?”); no resto da estrutura do método será igual os comentários do método Gravar();
Comentários do Código: Método Deletar(); DELETAR // O deletar tem os mesmo comentários do método acima com exceção da linha que contem o código SQL que não será mais um INSERT e sim um DELETE, observe que o que ira mudar é somente o nome do método e o código SQL contido na linha: comandoSQL = Conexao.getInstance().prepareStatement ("delete from Pessoa
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 próprio banco apagar os demais campos relacionados a esse Id através do comando SQL. public boolean deleta(Pessoa pessoa) { try { PreparedStatement comandoSQL; comandoSQL = Conexao.getInstance().prep areStatement("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, Responsável pela captura dos dados informados pelo usuário.
Criaremos uma classe do tipo gui (Graphical User Interface), ou seja, Interface Gráfica do Usuário
utilizando a classe JFrame da API Swing.
Swing é uma API Java para interfaces gráficas. Ela é compatível com a API AWT, mas trabalha de
uma maneira totalmente diferente. A API Swing procura renderizar\desenhar por contra própria todos
os componentes, ao invés de delegar essa tarefa ao sistema operacional, como a maioria das outras
APIs de interface gráfica trabalham.
Por ser uma API de mais alto nível, ou seja, mais abstração, menor aproximação das APIs do sistema
operacional, ela tem bem menos performance que outras APIs gráficas e consome mais memória RAM
em geral. Porém, ela é bem mais completa, e os programas que usam Swing têm uma aparência
muito parecida, independente do Sistema Operacional utilizado.
Seguindo... Criaremos um pacote chamado gui e dentro dele um Formulário JFrame, Chamado de
TelaPessoa.java
Clique com botão direito do mouse sobre o pacote gui, Novo => Formulario JFrame...
Agora vamos escrever o método que ira popular nossa tabela com os dados do banco;
Dentro do código fonte no Inicio da Classe TelaPessoa.java dentro do método construtor após o
método InitComponents(); crie a chamada para o método listarPessoas(); que ainda vamos criar
dentro do código junto com os métodos, gravar, alterar, excluir e listar;
Código do método TelaPessoas (); = “Método 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>( );