Laboratório de Banco de Dados Ricardo Ribeiro Gudwin DCA-FEEC-UNICAMP (versão 1.0 - 10/09/2002) OBJETIVOS: Neste laboratório, estaremos estudando como acessar um banco de dados relacional SQL por meio do JDBC. Aprenderemos a fazer um acesso simples ao banco de dados, e em seguida construiremos uma aplicação em Java com interface gráfica, para fazer acessos de leitura, escrita e consulta ao banco de dados. EXERCÍCIO 1: Verificando o Banco de Dados Para este exercício, usaremos um banco de dados MySQL instalado na máquina servidora da rede do laboratório, e o software MySQL Control Center. 1 - Obtenha o endereço da máquina servidora e solicite ao professor que crie para você no servidor de banco de dados: - um banco de dados para seu uso - um login/password para o acesso ao banco 2 - Utilizando essas informações, utilize o software MyCC instalado em sua máquina para criar uma tabela de nome "cliente", com os seguintes campos: Identificador, Nome, Endereço, Cidade, CEP, Telefone 3 - Selecione o campo Identificador como "Primary Key" 4 - Introduza 10 linhas com informações no banco de dados 5 - Verifique se as informações foram inseridas corretamente, e se o banco de dados está apto a operar. Caso esteja tudo funcionando, vá para o próximo exercício. EXERCÍCIO 2: Conectando com o Banco de Dados Para este exercício, utilizaremos o programa exemplo apresentado na parte teórica do curso para fazer o acesso ao banco de dados criado no exercício 1. 1 - Analise o código a seguir (retirado das transparências do curso) e tente entendê-lo: public static void main(java.lang.String[] args) { try { int n, i = 0; StringBuffer dado; Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").newInstance(); Connection con = DriverManager.getConnection("jdbc:db2:sample","usrid","pwd"); Statement st = con.createStatement(); ResultSet rs = st.executeQuery("SELECT * FROM ORG"); ResultSetMetaData md = rs.getMetaData(); int colunas = md.getColumnCount(); while (rs.next()) { for (n=1; n<=colunas; n++) { dado = new StringBuffer(rs.getString(n)); System.out.print(dado); } System.out.print("\n"); i++; } System.out.println("\n"+i+" colunas selecionadas"); rs.close(); st.close(); con.close(); } catch (ClassNotFoundException e) {System.out.println(e);} catch (SQLException sqle) {System.out.println(sqle);} catch (InstantiationException ie) {System.out.println(ie.toString());} catch (IllegalAccessException iae) {System.out.println(iae.toString());} } 2 - Identifique quais as linhas que necessitam ser alteradas para o banco de dados em questão. Para isso, consulte o arquivo README do MySQL Connector/J 2.0.14. 3 - Crie no JBuilder um novo projeto para nosso programa de teste, e copie o código acima dentro da rotina main criada pelo JBuilder. 4 - Faça as alterações necessárias para adaptar o código ao banco de dados MySQL (lembrando que o exemplo acima é válido para a base de dados DB2, e não para o MySQL). 5 - Faça as adaptações necessárias para acessar a base de dados criada por você no exercício 1. 6 - Cadastre o arquivo mysql-connector-java-2.0.14-bin.jar como uma biblioteca interna do JBuilder (Tools -> Configure Library -> New), e depois cadastre a biblioteca no projeto (Project -> Project Properties -> Required Libraries). 7 - Compile e rode o programa, e verifique se ele acessa da maneira adequada a sua base de dados. EXERCÍCIO 3: Construindo uma aplicação Java com Interface Gráfica para acesso ao banco de dados Neste exercício, criaremos uma pequena interface gráfica para fazermos o acesso ao banco de dados, permitindo a inserção de novos registros, o apagamento de registros e a busca por informações em seu banco de dados. 1 - Inicie o JBuilder e crie uma nova aplicação: Clique em File -> New ... Selecione Application Altere o nome da aplicação para um nome de seu gosto (por exemplo BDAccess) Altere o diretório onde os arquivos serão armazenados Na tela dos detalhes da classe de aplicação, dê um nome conveniente para a classe principal: Algo como BDAccessMain Na tela dos detalhes da classe de frame, dê um nome conveniente para a classe da janela principal: Algo como BDAccessMainWindow Clique nas opções: Generate Menu Bar, Generate Toolbar, Generate Status Bar, Generate About Dialog e Center Frame on Screen e então em Finish. 2 - Compile e Teste o protótipo apertando F9. 3 - Prepare-se para alterar a estrutura do menu. Clique na aleta Design abaixo do código fonte, e selecione o componente jMenuBar1 na tela da esquerda. O menu deve então aparecer para edição na tela principal. 4 - Insira um novo menu Edit - Clique sobre o menu Help já existente sobre a barra de menus. Em seguida, clique com o botão da direita (ainda sobre Help), e selecione "Insert Menu". - Altere o nome do novo menu criado para Edit 5 - Crie os seguintes sub-menus (agora clicando com botão da direita sobre o sub-menu abaixo de Edit) - Insert New Record - Delete Record - Update Record - Query Record 6 - Nesse ponto, você pode de novo recompilar o programa e testá-lo. 7 - Vamos criar uma função de atendimento para cada uma das 4 opções do menu Edit. Inicialmente, na árvore da esquerda, acesse os Menu-Itens de jMenu1, trocando os nomes de jMenuItem1, jMenuItem2, jMenuItem3 e jMenuItem4 para insert, delete, update e query. Para cada uma das opções, clique sobre ela na árvore, vá para o painel da direita e clique no tag "Events" e selecione o evento "actionPerformed". Clique então no campo em branco a direita do evento, e deve aparecer um nome de método (e.g. "insert_actionPerformed"). Clique então <ENTER>, para que a rotina seja criada e associada ao menu. Repita isso para os 4 MenuItens. Para verificar se as funções estão funcionando, insira a linha: System.out.println("Insert"); (substituindo "Insert" por "Delete", "Update" e "Query" nas demais rotinas), e compile e teste o programa. Após um teste bem sucedido, retire as linhas inseridas. 8 - Vamos agora criar as janelas para o atendimento individual de cada opção. Inicialmente, vamos criar uma janela para o "Insert". Crie uma nova classe (File -> New Class), e chame-a de um nome apropriado (e.g. InsertWindow). Lembre-se de que essa classe deve herdar de JFrame, e portanto selecione "javax.swing.JFrame" no campo "Base Classe" do wizard de criação da classe. Observe que essa não será uma classe principal, e portanto você pode retirar o check da caixa "Generate Main Method". As demais caixas podem ficar marcadas. 9 - Vá agora para a tela de design da janela, e selecione o layout "null". Crie então com Labels e JTextFields mais ou menos a seguinte composição: 10 - Troque os nomes dos jTextFields para os nomes de seus labels (id, nome, endereco, cidade, cep e telefone), na árvore de controles do lado esquerdo. 11 - Troque os nomes dos botões para insert e cancel, e insira funções para o tratamento do evento actionPerformed nos dois botões. 12 - Vamos agora ligar esta janela ao menu "Insert New Register ... ". - Vá até o código da classe BDAccessMainWindow (ou com o nome que você deu a esta classe, e crie uma variável para guardar a informação do InsertWindow (ou o nome que você escolheu): InsertWindow iw; - Vá então ao código do método insert_actionPerformed (ou o nome que você deu ao método que serve o menu "Insert New Window") e acrescente as seguintes linhas: if (iw == null) iw = new InsertWindow(); Dimension dm = iw.getPreferredSize(); iw.setSize(dm); Point loc = getLocation(); iw.setLocation(loc.x+50,loc.y+50); iw.setTitle("Insert New Record ..."); iw.setVisible(true); Estas linhas irão então criar uma nova InsertWindow e mostrá-la quando o menu "Insert New Window" for pressionado. - Implemente o método relacionado ao botão Cancel, colocando a linha abaixo no método que trata o botão (e.g. cancel_actionPerformed): this.setVisible(false); - Compile e teste para ver se está funcionando. 13 - Vamos agora efetivamente começar o processo de inserção de dados na base de dados. Para isso, insira o seguinte código na rotina de tratamento do botão Insert, fazendo as devidas adaptações necessárias aos nomes das variáveis: StringBuffer my_id, my_nome, my_endereco, my_cidade, my_CEP, my_telefone; my_id = new StringBuffer(id.getText()); my_nome = new StringBuffer(nome.getText()); my_endereco = new StringBuffer(endereco.getText()); my_cidade = new StringBuffer(cidade.getText()); my_CEP = new StringBuffer(CEP.getText()); my_telefone = new StringBuffer(telefone.getText()); System.out.println(my_id+" "+my_nome+" "+my_endereco+" "+my_cidade+" "+my_CEP+" "+my_telefone); Este código coleta os dados dos TextFields, armazenando-os em Strings. 14 - Agora, para continuar o processo, copie a rotina de acesso ao banco de dados desenvolvida no exercício 2 na sequência do código de tratamento do botão Insert, acrescentando a linha: ResultSet rs_1 = st.executeQuery( "INSERT INTO cliente ( Id, Nome, Endereco, Cidade, CEP, Telefone ) VALUES( \"" + my_id +"\",\""+my_nome + +"\",\""+my_endereco + +"\",\""+my_cidade +"\",\""+my_CEP +"\",\""+my_telefone+"\");"); logo antes da linha semelhante a ResultSet rs = st.executeQuery("SELECT * FROM ORG"); O que estamos fazendo aqui é inserindo uma nova linha na base de dados, e logo em seguida lendo a base de dados para ver como ficou após a linha inserida. Compile e rode para ver como ficou. 15 - Repita os passos de 8 a 14 deste exercício, mas agora fazendo as adaptações necessárias para se fazer uma QUERY à base de dados, utilizando os valores preenchidos dos TextFields como índice de busca. 16 - Repita os passos de 8 a 14 deste exercício, mas agora fazendo as adaptações necessárias para se DELETAR uma linha da base de dados. 17 - Repita os passos de 8 a 14 deste exercício, mas agora fazendo as adaptações necessárias para se fazer um UPDATE de um registro da base de dados.