A Primeira parte dessa matria cobriu a parte de insero de dados, logo, a segunda parte destina-se a funo de listar os dados armazenados, exibindo em uma tabela ( JTable ). Agora vamos construir uma janela que exiba uma tabela, segue um exemplo logo abaixo: Mecanismo para manipular os dados na tabela. Para adicionar uma linha na tabela acima, deve-se fornecer as informaoes na seguinte condio: novaLinha = [nome", telefone", rg", cpf"] Ou seja, um registro armazenado em um vetor. Vamos ento criar um registro ficticio:
java.util.Vector registro1 = new java.util.Vector<String>(); registro1.add("Ivan"); registro1.add("tel"); registro1.add("rg"); registro1.add("cpf"); A forma de manipular as informaoes na tabela atravs do DataModel, cada tabela tem um modelo, onde os dados so adicionadas ou removidas. Deve-se obter o modelo da tabela criada da seguinte forma: DefaultTableModel dtm = (DefaultTableModel) jTable1.getModel();
Para inserir os dados basta invocar o mtodo addRow() e passar como parmetro o vetor do registro. dtm.addRow(registro1); Temos o seguinte resultado: Para que seja possivel exibir na tabela as informaoes armazenadas no banco de dados, preciso primeiramente realizar uma consulta a base, selecionando todos os registros adicionados anteriormente. Para isso utiliza-se um java.sql.ResultSet. O ResultSet responsavel em selecionar registros em um consulta ao bando de dados. Com ele podemos obter os dados inseridos em uma tabela MySql. A listagem abaixo demonstra como utiliza-lo. //Faz Conexo String query = "SELECT * FROM Cliente ;
while(rs.next()){ String nome = rs.getString("nome"); String telefone = rs.getString("telefone"); String rg = rs.getString("rg"); String cpf = rs.getString("cpf"); } //Fecha Conexo *Obs.: Caso a coluna seja do tipo integer, deve-se utilizar: rs.getInt(nomeColuna) Mais detalhes: Cria o ResulSet, responsavel em fazer a leitura dos registros armazenados no banco. O ResultSet executa a instruo SQL que a String query representa.
java.sql.ResultSet rs = stmt.executeQuery(query); Atribui a variavel nome o valor da coluna nome, proveniente da leitura do registro. String nome = rs.getString("nome"); Lao de repetio que faz a leitura de todos os registros selecionados pela instruo SQL. Em outras palavras, enquanto houver registros, execute o codigo abaixo. while(rs.next()){} Na listagem anterior, realizava-se a leitura de todos os registros armazenados no banco, atravs do codigo while(rs.next()), mas deve-se armazenar esses registros lidos de uma forma mais adequada que a apresentada. Proponho armazenar os registros da seguinte maneira: Construir um vetor para armazenar cada registro, adicionar em um outro vetor que contenha todos os outros registros, ou seja, um vetor de vetores ou matriz. nome telefone rg cpf Vamos modificar o codigo para que a listagem trabalhe com essa nova estrutura de armazenamento. Vector dados = new Vector<Vector>() while(rs.next()){ //criar um vetor para cada registro lido Vector registroAtual = new Vector<String>() //ler o registro do banco de dados String nome = rs.getString("nome"); String telefone = rs.getString("telefone"); String rg = rs.getString("rg"); String cpf = rs.getString("cpf"); //armazenas as informacoes no vetor do registro registroAtual.add(nome); registroAtual.add(telefone); registroAtual.add(rg); registroAtual.add(cpf); //adicionar o vetor de registro ao vetor principal dados.add(registroAtual) } O codigo acima realiza uma consulta no banco de dados, obtm todos os registros armazenados no tabela Cliente, e armazena as informaoes na forma de uma matrix. Agora resta apenas inserir na 3Table, para que os dados sejam exibidos, para isso vamos manipular a matriz da seguinte forma: DefaultTableModel dtm = (DefaultTableModel) jTable1.getModel();
for( int i = 0; i < dados.size(); i++){ dtm.addRow( dados.get(i) ); } O codigo acima adiciona na 3Table todos os vetores presentes no vetor de dados, que representa a matriz. Para finalizar, vamos inserir todo o codigo em um mtodo para ser chamado na com a construo da janela: public void carregarTabela() { java.util.Vector<Vector> dados = new java.util.Vector<Vector>(); //fazer a conexao com o mysql java.sql.Connection con; try { Class.forName("org.gjt.mm.mysql.Driver"); con = java.sql.DriverManager.getConnection( "jdbc:mysql://localhost:3306/bd_aulas", "aula", "123"); } catch (Exception e) { e.printStackTrace(); throw new java.lang.RuntimeException("erro ao conectar"); } String query = "SELECT * FROM Cliente"; try { java.sql.Statement stmt = con.createStatement(); java.sql.ResultSet rs = stmt.executeQuery(query); while ( rs.next() ) { java.util.Vector registroAtual = new java.util.Vector(); String nome = rs.getString("nome"); String telefone = rs.getString("telefone"); String rg = rs.getString("rg"); String cpf = rs.getString("cpf"); registroAtual.add(nome); registroAtual.add(telefone); registroAtual.add(rg); registroAtual.add(cpf); dados.add(registroAtual); } } catch (java.sql.SQLException e) { throw new java.lang.RuntimeException("erro na selecao"); } //Fechando a Conexo: try { con.close(); } catch (Exception e) { e.printStackTrace(); throw new java.lang.RuntimeException("erro fechar"); } DefaultTableModel dtm = (DefaultTableModel) jTable1.getModel(); for (int i = 0; i < dados.size(); i++) { dtm.addRow(dados.get(i)); } } Consideraes: Foi apresentado o componente JTable, usado para exibir registros armazenados no banco de dados. Toda JTable possui um modelo, que responsavel pela atualizao de seus registros. Qualquer alterao na tabela deve ser manipulado atravs do modelo. O Vetor a estrutura utilizada para representar o formato do registro a ser inserido na JTable. O ResultSet foi demonstrado, juntamente com a funo de leitura dos dados campos da tabela do banco de dados. ResulSet responsavel por realizar uma consulta SQL. Manipula-se as informaoes por meio de matrizes, pois facilita a representao das informaoes obtidas do banco de dados. Ainda temos os mesmos problemas apresentados na parte 1 desse material. Ivan Salvadori Escrito em Junho de 2010