Especialização em web com interfaces ricas Acessando Bancos de Dados com Java Versão Gráfica (Continuação) Prof. Fabrízzio Alphonsus A. M. N. Soares [email protected] [email protected] Instituto de Informática Universidade Federal de Goiás Aula 5 25 de maio de 2012 Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 1/23 Bancos de Dados com Java Nesta aula finalizaremos a montagem do aplicativo visual com acesso a banco de dados. Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 2/23 Tabela - Exemplo I Tabela: cliente matricula nome idade sexo integer varchar(50) integer char(1) Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 3/23 Problema - Exemplo I Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 4/23 Pesquisando os clientes I Existem várias abordagens para se efetuar a consulta dos clientes. Abaixo seguem alguns exemplos: 1 Criar um botão de pesquisa que utiliza os dados do campo matrícula 2 Criar um botão de pesquisa que abre uma nova janela para realizar a pesquisa dos clientes 3 Pesquisar automaticamente assim que o usuário tira o foco do campo matrícula Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 5/23 Pesquisando os clientes II Nesta aula iremos realizar as abordagens 1 e 3. Porém, embora vamos nesta aula fazer esses dois modos. Não é interessante fornecer ambos ao usuário. É fundamental fornecer só um. Muitas opções para a mesma coisa tendem a confundir o usuário. Ambas as formas tem vantagens. Escolha aquela que se enquadre na sua necessidade ou padrão. Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 6/23 Criando um botão para pesquisa I Botão declarado no corpo do formulário: 1 private JButton pesquisar; Inicialização do botão: 1 2 3 pesquisar = new JButton("Pesquisar"); content.add(pesquisar); pesquisar.setBounds(210, 30, 110, 20); Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 7/23 Criando um botão para pesquisa II Adicionando o evento ao botão 1 2 3 4 5 pesquisar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt){ pesquisarActionPerformed(evt); } }); Método pesquisarActionPerformed 1 2 3 4 private void pesquisarActionPerformed(ActionEvent evt){ if (pesquisarDados() == false) JOptionPane.showMessageDialog(this, "Matrícula não encontrada"); } Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 8/23 Criando um botão para pesquisa III Criando o método de pesquisa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 private boolean pesquisarDados(){ if (matricula.getText().length() == 0){ numeroMatricula = 0; return false; } try { PreparedStatement st = cn.prepareStatement( "select * from cliente where matricula = ?" ); st.setInt(1,Integer.parseInt(matricula.getText())); ResultSet rs = st.executeQuery(); if (rs.next()) { nome.setText(rs.getString("nome")); idade.setText(rs.getString("idade")); if (rs.getString("sexo").equals("M")) sexo.setSelectedIndex(0); else sexo.setSelectedIndex(1); numeroMatricula = rs.getInt("matricula"); nome.requestFocus(); rs.close(); Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 9/23 Criando um botão para pesquisa IV 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 st.close(); return true; } else { numeroMatricula = 0; rs.close(); st.close(); return false; } } catch (SQLException e) { JOptionPane.showMessageDialog( this, "Erro ao pesquisar o registro." ); } return false; } Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 10/23 Pesquisando quando a caixa de texto perde o foco I Evento Focus Lost Imports necessários 1 2 import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; Adicionando o evento à caixa de texto 1 2 3 4 5 matricula.addFocusListener(new FocusAdapter() { public void focusLost(FocusEvent evt) { matriculaFocusLost(evt); } }); Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 11/23 Pesquisando quando a caixa de texto perde o foco II Método matriculaFocusLost 1 2 3 private void matriculaFocusLost(FocusEvent evt){ pesquisarDados(); } Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 12/23 Organizando o código É recomendável se separar o código sempre em funções que reflitam sua finalidade. Lembre-se: Funções devem fazer apenas uma coisa e muito bem feita! Assim, funções que fazem uma única coisa geralmente são pequenas. Se sua função está grande, provavelmente ela faz mais de uma coisa. Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 13/23 Dividindo as funções I Evento e função para excluir 1 2 3 private void excluirActionPerformed(ActionEvent evt){ excluirCliente(); } Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 14/23 Dividindo as funções II 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 private void excluirCliente(){ if (numeroMatricula == 0){ JOptionPane.showMessageDialog(this, "Pesquise uma matrícula antes de excluí-la."); matricula.requestFocus(); return; } try { PreparedStatement st = cn.prepareStatement("delete from cliente where matricula = ?"); st.setInt(1,Integer.parseInt(matricula.getText())); st.execute(); st.close(); limparCampos(); } catch (SQLException e) { JOptionPane.showMessageDialog(this, "Erro ao inserir o registro."); } } Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 15/23 Dividindo as funções III Evento e função para salvar 1 2 3 private void salvarActionPerformed(ActionEvent evt){ inserirCliente(); } Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 16/23 Dividindo as funções IV 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 private void inserirCliente(){ try { PreparedStatement st = cn.prepareStatement( "insert into cliente (matricula, nome, idade, sexo) values (?, ?, ?, ?)"); st.setInt(1,Integer.parseInt(matricula.getText())); st.setString(2, nome.getText()); st.setInt(3, Integer.parseInt(idade.getText())); if (sexo.getSelectedIndex() == 0) st.setString(4, "M"); else st.setString(4, "F"); st.execute(); st.close(); JOptionPane.showMessageDialog(this, "Cliente inserido com sucesso."); limparCampos(); } catch (SQLException e) { JOptionPane.showMessageDialog(this, "Erro ao inserir o registro."); }} Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 17/23 Alterando o cliente I Uma tarefa importante é atualizar os dados do cliente. Para realizar tal tarefa, é conveniente que os dados do cliente já tenham sido lidos, afinal, eles vão ser alterados. Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 18/23 Alterando o cliente II Assim, é preciso então ter um controle se os dados já foram consultados para serem alterados. Uma forma de fazer isto é criar uma variável que irá conter valores que definirão estados. Por exemplo: Novo Carregado Isto pode ser feito com uma variável do tipo boolean Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 19/23 Alterando o cliente III A abordagem adotada aqui será utilizar uma variável int para conter a matrícula pesquisada. E os estados poderão ser os seguintes: Se o cliente não foi pesquisado, foi pesquisado e não foi encontrado, ou foi clicado no botão novo a variavel numeroMatricula conterá o valor ZERO; Se o cliente foi pesquisado e encontrado a variável numeroMatricula conterá o valor do campo matrícula. Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 20/23 Implementando a função de alteração I 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 private void atualizarCliente(){ try { PreparedStatement st = cn.prepareStatement( "update cliente set nome = ?, idade = ?, sexo = ? where matricula = ?"); st.setString(1, nome.getText()); st.setInt(2, Integer.parseInt(idade.getText())); if (sexo.getSelectedIndex() == 0) st.setString(3, "M"); else st.setString(3, "F"); st.setInt(4,Integer.parseInt(matricula.getText())); st.execute(); st.close(); JOptionPane.showMessageDialog(this, "Cliente alterado com sucesso."); limparCampos(); } catch (SQLException e) { JOptionPane.showMessageDialog(this, "Erro ao atualizar o registro."); }} Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 21/23 Implementando a função de alteração II Alterando o botão salvar 1 2 3 4 5 6 private void salvarActionPerformed(ActionEvent evt){ if (numeroMatricula == 0) inserirCliente(); else atualizarCliente(); } Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 22/23 Implementando a função de alteração III É importante lembrar que se a variável numeroMatricula é utilizada para validar as situações em que o registro será salvo é importante mante-la bem atualizada. Assim, ela deverá ser modificada para acompanhar os estados da aplicação. Se foi clicado no botão novo, na pesquisa não foi encontrado um registro, ou o registro foi excluído. Deve se atribuir ZERO à variável. Se for pesquisado e encontrado, ou o registro for alterados o um registro deve-se atribuir o número da matrícula em uso. Prof. Fabrízzio Alphonsus A. M. N. Soares | Acessando Bancos de Dados com Java - Versão Gráfica (Continuação) 23/23