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 fabrizzio@inf.ufg.br professor.fabrizzio@gmail.com Instituto de Informática Universidade Federal de Goiás Aula 5 25 de maio de 2012 1/23
Bancos de Dados com Java Nesta aula finalizaremos a montagem do aplicativo visual com acesso a banco de dados. 2/23
Tabela - Exemplo I Tabela: cliente matricula nome idade sexo integer varchar(50) integer char(1) 3/23
Problema - Exemplo I 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 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. 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 pesquisar = new JButton("Pesquisar"); 2 content.add(pesquisar); 3 pesquisar.setbounds(210, 30, 110, 20); 7/23
Criando um botão para pesquisa II Adicionando o evento ao botão 1 pesquisar.addactionlistener(new ActionListener() { 2 public void actionperformed(actionevent evt){ 3 pesquisaractionperformed(evt); 4 } 5 }); Método pesquisaractionperformed 1 private void pesquisaractionperformed(actionevent evt){ 2 if (pesquisardados() == false) 3 JOptionPane.showMessageDialog(this, "Matrícula não encontrada"); 4 } 8/23
Criando um botão para pesquisa III Criando o método de pesquisa 1 private boolean pesquisardados(){ 2 if (matricula.gettext().length() == 0){ 3 numeromatricula = 0; 4 return false; 5 } 6 try { 7 PreparedStatement st = cn.preparestatement( 8 "select * from cliente where matricula =?" 9 ); 10 st.setint(1,integer.parseint(matricula.gettext())); 11 ResultSet rs = st.executequery(); 12 13 if (rs.next()) { 14 15 nome.settext(rs.getstring("nome")); 16 idade.settext(rs.getstring("idade")); 17 18 if (rs.getstring("sexo").equals("m")) 19 sexo.setselectedindex(0); 20 else 21 sexo.setselectedindex(1); 22 23 numeromatricula = rs.getint("matricula"); 24 nome.requestfocus(); 25 26 rs.close(); 9/23
Criando um botão para pesquisa IV 27 st.close(); 28 29 return true; 30 } else { 31 numeromatricula = 0; 32 rs.close(); 33 st.close(); 34 return false; 35 } 36 37 } catch (SQLException e) { 38 JOptionPane.showMessageDialog( 39 this, 40 "Erro ao pesquisar o registro." 41 ); 42 } 43 return false; 44 } 10/23
Pesquisando quando a caixa de texto perde o foco I Evento Focus Lost Imports necessários 1 import java.awt.event.focusadapter; 2 import java.awt.event.focusevent; Adicionando o evento à caixa de texto 1 matricula.addfocuslistener(new FocusAdapter() { 2 public void focuslost(focusevent evt) { 3 matriculafocuslost(evt); 4 } 5 }); 11/23
Pesquisando quando a caixa de texto perde o foco II Método matriculafocuslost 1 private void matriculafocuslost(focusevent evt){ 2 pesquisardados(); 3 } 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. 13/23
Dividindo as funções I Evento e função para excluir 1 private void excluiractionperformed(actionevent evt){ 2 excluircliente(); 3 } 14/23
Dividindo as funções II 1 private void excluircliente(){ 2 if (numeromatricula == 0){ 3 JOptionPane.showMessageDialog(this, "Pesquise uma matrícula antes de excluí-la."); 4 matricula.requestfocus(); 5 return; 6 } 7 try { 8 PreparedStatement st = cn.preparestatement("delete from cliente where matricula =?"); 9 st.setint(1,integer.parseint(matricula.gettext())); 10 st.execute(); 11 st.close(); 12 limparcampos(); 13 } catch (SQLException e) { 14 JOptionPane.showMessageDialog(this, "Erro ao inserir o registro."); 15 } 16 } 15/23
Dividindo as funções III Evento e função para salvar 1 private void salvaractionperformed(actionevent evt){ 2 inserircliente(); 3 } 16/23
Dividindo as funções IV 1 private void inserircliente(){ 2 try { 3 PreparedStatement st = cn.preparestatement( 4 "insert into cliente (matricula, nome, idade, sexo) values (?,?,?,?)"); 5 st.setint(1,integer.parseint(matricula.gettext())); 6 st.setstring(2, nome.gettext()); 7 st.setint(3, Integer.parseInt(idade.getText())); 8 if (sexo.getselectedindex() == 0) st.setstring(4, "M"); 9 else st.setstring(4, "F"); 10 st.execute(); 11 st.close(); 12 JOptionPane.showMessageDialog(this, "Cliente inserido com sucesso."); 13 limparcampos(); 14 } catch (SQLException e) { 15 JOptionPane.showMessageDialog(this, "Erro ao inserir o registro."); 16 }} 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. 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 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. 20/23
Implementando a função de alteração I 1 private void atualizarcliente(){ 2 try { 3 PreparedStatement st = cn.preparestatement( 4 "update cliente set nome =?, idade =?, sexo =? where matricula =?"); 5 st.setstring(1, nome.gettext()); 6 st.setint(2, Integer.parseInt(idade.getText())); 7 if (sexo.getselectedindex() == 0) st.setstring(3, "M"); 8 else st.setstring(3, "F"); 9 st.setint(4,integer.parseint(matricula.gettext())); 10 st.execute(); 11 st.close(); 12 JOptionPane.showMessageDialog(this, "Cliente alterado com sucesso."); 13 limparcampos(); 14 } catch (SQLException e) { 15 JOptionPane.showMessageDialog(this, "Erro ao atualizar o registro."); 16 }} 21/23
Implementando a função de alteração II Alterando o botão salvar 1 private void salvaractionperformed(actionevent evt){ 2 if (numeromatricula == 0) 3 inserircliente(); 4 else 5 atualizarcliente(); 6 } 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. 23/23