Passando resultados de um resultset à um List

Olá amigos do GUJ.

Eu comecei a me aventurar na codificação Java a bem pouco e tempo, e como todo iniciante, dúvidas me afligem.

Eu estou tentando desenvolver um programinha desktop, para ser utilizado na empresa onde eu trabalho, afim de “automatizar” um pouco os processos ( entenda: parar de usar planilha do excel ).

Esse aplicativo, precisa buscar uma certa informação do banco de dados, e retornar esses valores em uma JTable.

Incialmente eu consegui fazer esse processo, usando o DefultTableModel, mas estou tentando migrar para uma TableModel personalizada.

Minha dificuldade neste caso, é que eu não consigo mais passar o resultado da consulta sql ao JTable.

class MyTableModel extends AbstractTableModel 
    {
    	private String[] columnNames = {"First Name",
                                        "Last Name",
                                        "Sport",
                                        "# of Years",
                                        "Vegetarian"};
        
        
        private Object[][] data = 
        	
        	{
        
        {"Kathy", "Smith",
         "Snowboarding", new Integer(5), new Boolean(false)},
        {"John", "Doe",
         "Rowing", new Integer(3), new Boolean(true)},
        {"Sue", "Black",
         "Knitting", new Integer(2), new Boolean(false)},
        {"Jane", "White",
         "Speed reading", new Integer(20), new Boolean(true)},
        {"Joe", "Brown",
         "Pool", new Integer(10), new Boolean(false)}
        };
 
        public int getColumnCount() 
        {
            return columnNames.length;
        }
 
        public int getRowCount() 
        {
            return data.length;
        }
 
        public String getColumnName(int col) 
        {
            return columnNames[col];
        }
 
        public Object getValueAt(int row, int col) 
        {
            return data[row][col];
        }
 

        public Class getColumnClass(int c) 
        {
            return getValueAt(0, c).getClass();
        }
 
   
        public boolean isCellEditable(int row, int col) 
        {
     
            if (col < 2) 
            {
                return false;
            } 
            
            else 
            {
                return true;
            }
        }
 
       
        public void setValueAt(Object value, int row, int col) 
        {
            if (DEBUG) 
            {
                System.out.println("Setting value at " + row + "," + col
                                   + " to " + value
                                   + " (an instance of "
                                   + value.getClass() + ")");
            }
 
            data[row][col] = value;
            fireTableCellUpdated(row, col);
 
            if (DEBUG) 
            {
                System.out.println("New value of data:");
                printDebugData();
            }
        }

Eu estou usando aqui como exemplo, a TableModel do tutorial da Oracle.

http://docs.oracle.com/javase/tutorial/uiswing/components/table.html

A conexão com o banco é feita nesta parte:

        Connection con = null;
    	Statement st = null;
    	ResultSet rs = null;
    	
    	String url = "jdbc:oracle:thin:@127.0.0.1:1521"; // endereço do banco
    	String db = "banco"; // nome do banco
    	String driver = "oracle.jdbc.driver.OracleDriver"; // driver usado
    	String user = "user"; // usurário
    	String pass = "senha"; // senha
 
        JTable table = new JTable(new MyTableModel());
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(true);
 
        JScrollPane scrollPane = new JScrollPane(table);
 
        add(scrollPane);
        
        try
        {
        	Class.forName(driver);
    		con = DriverManager.getConnection(url + db, user, pass);
    		con.setAutoCommit(false);// Disables auto-commit.

    		st = con.createStatement();
    		
    		// select passada ao banco
    		String sql = "select s.seqsetor,p.seqquestao,s.seqsetor||'.'||p.seqquestao seq, " +
    				"p.questao, p.pont_max, " +
    				"p.processo, p.subprocesso, p.balizador  from map_dadosri p, " +
    				"map_setorri s where p.tipo_ri = s.tipo_ri " +
    				"and p.seqsetor = s.seqsetor order by 1,2";
    		rs = st.executeQuery(sql);
    	ArrayList<Object> listaLinhas = new ArrayList<>();
    	while ( rs.next() )
    	{
    		ArrayList<Object> linha= new ArrayList<>();
    		linha.add(rs.getString("seqsetor"));
    		linha.add(rs.getString("seqquestao"));
    		linha.add(rs.getString("seq"));
    		linha.add(rs.getString("questao"));
    		linha.add(rs.getString("pont_max"));
    		linha.add(rs.getString("processo"));
    		linha.add(rs.getString("subprocesso"));
    		linha.add(rs.getString("balizador"));
    		
    		listaLinhas.add(linha.toArray());
    	}// fim do while
    	Object[] data = listaLinhas.toArray();  
          // fim procedimento para obter os dados
          } 
          catch(SQLException ex)
          {
               JOptionPane.showMessageDialog(null, "SQLException: " + ex.getMessage());
               JOptionPane.showMessageDialog(null, "SQLState: " + ex.getSQLState());
               JOptionPane.showMessageDialog(null, "VendorError: " + ex.getErrorCode());
          }
          catch(Exception e)
          {
        	  JOptionPane.showMessageDialog(null,"Problemas ao tentar conectar com o banco de dados");	
        }// fim Desenv

Como eu faço para pegar o nome nome das colunas no lugar de columnName e as informações da consulta no lugar de data?

Obrigado antecipadamente.

Ola, seu metodo de listar está estranho, a sua linha é uma lista de strings.
Pelo que me parece estas usando uma lista no que deveria ser seu objeto.
segue um exemplo de list:

 while (rs.next()) {
                Fatura fatura = new Fatura();
                fatura.setCliente(new Cliente());
                fatura.getCliente().setEmailContato(rs.getString(1));
                fatura.getCliente().setNome(rs.getString(2));
                fatura.getCliente().setEmailEmpresa(rs.getString(3));
                fatura.getCliente().setCgc(rs.getString(4));
                fatura.getCliente().setCodigo(rs.getInt(5));
                fatura.setVencimento(rs.getDate(7));
                fatura.setCarteira(rs.getString(8));
                fatura.setNfs(rs.getInt(9));
                fatura.setData(rs.getDate(10));
                fatura.setRazao(rs.getString(11));
                fatura.setValor(rs.getDouble(12));
                faturas.add(fatura);
            }

Obrigado pela resposta R$chieck :slight_smile:

Bom, realmente eu concordo, o meu primeiro código esta bastante confuso, eu “juntei” várias partes diferentes e tentei criar um unica coisa e , bem, não deu certo.

Portanto, eu resolvi refazer as coisas.

Eu refiz a minha TableModel ( Com base em um artigo aqui mesmo do forum ).

Desta forma, eu pretendo armazenar as informações do banco de dados em ArrayList e um Array de String.

	private ArrayList<String[]> linhas =  null;
	private String[] colunas = null;
        private boolean [] colsEdicao;

o colsEdicao é para indicar que a coluna pode ou não ser editada.

tendo isto em vista, a parte de conexão é praticamente a mesma.

                Connection con = null;
		Statement st = null;
		ResultSet rs = null;

		String url = "jdbc:oracle:thin:@127.0.1:1521:"; // endereço do banco
		String db = "banco"; // nome do banco
		String driver = "oracle.jdbc.driver.OracleDriver"; // driver usado
		String user = "user"; // usurário
		String pass = "senha"; // senha

		try 
		{
			Class.forName(driver);
			con = DriverManager.getConnection(url + db, user, pass);
			con.setAutoCommit(false);// Disables auto-commit.

			st = con.createStatement();
			
			// select passada ao banco
			String sql = "select p.nroempresa, p.nomereduzido from max_empresa p where p.status = 'A'";
			rs = st.executeQuery(sql);
			
			// imprime o título das colunas
			//System.out.println("nroempresa \tnomereduzido");
			
			// imprime os resultados
			while (rs.next()) 
			{
				
				
			}// fim do while
			rs.close();
			st.close();
			con.close();
		}// fim do try 

		catch (Exception e) 
		{
			System.out.println(e);
		}//fim do catch

Bom, o que eu não estou conseguindo, é dentro do while, passar as informações recebidas do banco de dado às variáveis da minha TableModel.

Desculpa novamente se pareceu confuso, como mencionei anteriormente, sou iniciante no java ( e em programação geral ). :oops:

caso Ajude, o TableModel inteira é essa aqui:

import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.AbstractTableModel;

public class MyJTable extends AbstractTableModel
{
	private ArrayList<String[]> linhas =  null;
	private String[] colunas = null;
	private boolean [] colsEdicao; 
	
	public String[] getColunas()
	{
		return colunas;
	}// fim do método getColunas
	
	public ArrayList<String[]> getLinhas()
	{
		return linhas;
	}// fim do método getLinhas
	
	public void setColunas ( String [] string )
	{
		colunas =  string;
	}// fim do método setColunas
	
	public void setLinhas ( ArrayList<String[]> list )
	{
		linhas = list;
	}// fim do método setLinhas

	@Override
	public int getColumnCount() 
	{
		return getColunas().length;
	}

	@Override
	public int getRowCount() 
	{
		return getLinhas().size();
	}

	@Override
	public Object getValueAt(int rowIndex, int columnIndex) 
	{
		String [] linha = ( String [] )getLinhas().get(rowIndex);
		return linha[columnIndex];
	}
	
	public MyJTable (ArrayList<String[]> dados, String [] colunas,boolean [] edicao)
	{
		setLinhas(dados);
		setColunas(colunas);
		colsEdicao = edicao;
	}// fim do construtor
	
	public JTable createJTable()
	{
		ArrayList<String[]> dados = new ArrayList<String[]>();
		String [] colunas =  new String[] {};
		// linha adicionada apos a criação das colunas  
		boolean [] edicao = {false, true};  
		
		MyJTable modelo = new MyJTable(dados, colunas, colsEdicao);
		JTable jtable = new JTable(modelo);
		jtable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		
		return jtable;
	}// fim do método createJTable
	
	public boolean isCellEditable(int row, int col)
	{
		return colsEdicao[col];
	}// fim do método isCellEditable; 
	
	public void setValueAt(Object value, int row, int col)
	{
		// Obtem a linha que é uma String[]
		String [] linha = (String [])getLinhas().get(row);
		// Altera o conteúdo no indice da coluna passada
		linha[col] = ( String )value;
		// dispara o evento de celula alterada
		fireTableCellUpdated(row, col);	
	}// fim do método  setValueAt
	
	public void addRow( String [] dadosLinha )
	{
		getLinhas().add(dadosLinha);
		// Informa a jtable de que houve linhas incluidas no modelo  
		// COmo adicionamos no final, pegamos o tamanho total do modelo  
		// menos 1 para obter a linha incluida.
		int linha = getLinhas().size()-1;
		fireTableRowsInserted(linha, linha);
		return;
	}// fim do método AddRow
	
	public void removeRow(int row)
	{
		getLinhas().remove(0);
		// informa a jtable que houve dados deletados passando a   
		// linha reovida
		fireTableRowsDeleted(row, row);
	}// fim do métodp removeRow
	
	/** 
	* Remove a linha pelo valor da coluna informada 
	* @param val 
	* @param col 
	* @return 
	*/  
	
	public boolean removeRow( String val, int col )
	{
		//obtem o interator
		Iterator i = getLinhas().iterator();  
		int linha = 0;
		// Faz um looping em cima das linha
		while ( i.hasNext() )
		{
			// Obtem as colunas da linha atual 
			String[] linhaCorrente = ( String [] )i.next();
			linha++;
			// compara o conteudo String da linha atual na coluna desejada  
			// com o valor informado
			if ( linhaCorrente[col].equals(val) )
			{
				getLinhas().remove(linha);
				// informa a jtable que houve dados deletados passando a   
				// linha removida
				fireTableRowsDeleted(linha, linha);
				return true;
			}// fim do if
		}// fim do while
		return false;
	}// fim do método removeRow
	
	// Implementação do getColumnName  
	   
	/** 
	* Retorna o nome da coluna. 
	* @see javax.swing.table.TableModel#getColumnName(int) 
	*/
	public String getColumnName( int col )
	{
		return getColunas()[col];
	}// fim do método getColumnName
	
}// fim da classe MyJTable