Duvida inserir Dados de um banco em uma jtable

Por fim adaptei minha tabela a uma TableModel, estou melhorando e quero melhorar, e também uso uma classe DAO, não quero mais usar DefaultTableModel é horrível

Bom vamos lá eu quero inserir os dados do meu banco de dados na jtable bom não sei como é mas como peguei um exemplo na net do TableModel adaptei a minha necessidade então para inserir eu fiz assim, não sei se
estou no caminho certo:

    public void PreencherTabela(){

     List<Produto> lista = new ArrayList<Produto>();
       int x = 0;
         while (x < lista.size()) {
                     
        lista.add(getDespesa());
        lista.add(new Produto(getDespesa(),70);
        lista.add(new Produto(getDespesa(),70);
        
                x++;
            }

    }

Está cheio de erro gostaria de saber como inserir

Não sei como está fazendo, só esse não dá pra entender.

Quando criu meu proprio table model, chamo assim:

	
	public void iniTable(){
                CidadeDAO cidade = new CidadeDAO();
		List<Cidade> lista = cidade.executeSQl();
		CidadeTableModel model = new CidadeTableModel(lista);
		jtTabela.setModel(model);
	}

Senão entendeu, posta teu model, que fica mais facil.
Ou o codigo todo do que estiver fazendo.

Boa sorte.

Bom abaixo segui o que eu fiz mas nao deu certo

 List<Produto> lista = daoProduto.buscarTodos();
                ProdutoTableModel model = new ProdutoTableModel(lista);//aqui fica grifado a lista ou seja está dando erro.
                tblBanco.setModel(model);

Meu codigo da Table Model: Produto

public class Produto {

    private String despesa;
    private String estabelecimento;
    private String datadespesa;
    private String valordespesa;
    private String formapagamento;
    private String datacheque;
    private String numerocheque;

    public Produto() {
    }

    public Produto(String despesa,String estabelecimento,String datadespesa,String valordespesa,String formapagamento,String datacheque,String numerocheque) {
        this.despesa = despesa;
        this.estabelecimento = estabelecimento;
        this.datadespesa = datadespesa;
        this.valordespesa = valordespesa;
        this.formapagamento = formapagamento;
        this.datacheque = datacheque;
        this.numerocheque = numerocheque;
    }

    //Gets

    public String getDespesa() {
        return despesa;

}
     public String getEstabelecimento() {
        return estabelecimento;

}
      public String getDataDespesa() {
        return datadespesa;

}
       public String getValorDespesa() {
        return valordespesa;

}
        public String getFormaPagamento() {
        return formapagamento;

}
         public String getDataCheque() {
        return datacheque;

}
          public String getNumeroCheque() {
        return numerocheque;

}
      //Sets

      public void setDespesa(String despesa) {
        this.despesa = despesa;
    }
       public void setEstabelecimento(String estabelecimento) {
        this.estabelecimento = estabelecimento;
    }
        public void setDataDespesa(String datadespesa) {
        this.datadespesa = datadespesa;
    }
         public void setValorDespesa(String valordespesa) {
        this.valordespesa = valordespesa;
    }
          public void setFormaPagamento(String formapagamento) {
        this.formapagamento = formapagamento;
    }
           public void setDataCheque(String datacheque) {
        this.datacheque = datacheque;
    }
            public void setNumeroCheque(String numerocheque) {
        this.numerocheque = numerocheque;
    }

}

Codigo Table Model:ProdutoTableModel


import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.swing.table.AbstractTableModel;

public class ProdutoTableModel extends AbstractTableModel {

    //constantes que vão representar as colunas
    //(só para facilitar o entendimento do código)
    private final int COL_Despesa = 0;
    private final int COL_Estabelecimento = 1;
    private final int COL_DataDespesa = 2;
    private final int COL_ValorDespesa = 3;
    private final int COL_FormaPagamento = 4;
    private final int COL_DataCheque = 5;
    private final int COL_NumeroCheque = 6;

    //lista dos produtos que serão exibidos
    private List<Produto> produtos;

    public ProdutoTableModel() {
        produtos = new ArrayList();
    }

    public ProdutoTableModel(List<Produto> lista) {
        this();
        produtos.addAll(lista);
    }

    public int getRowCount() {
        //cada produto na lista será uma linha
        return produtos.size();
    }

    public int getColumnCount() {
        //vamos exibir só Nome e Quantidade, então são 2 colunas
        return 2;
    }

    @Override
    public String getColumnName(int column) {
        //qual o nome da coluna
        if (column == COL_Despesa) {
            return "Despesa";
        } else if (column == COL_Estabelecimento) {
            return "Estabelecimento";
        }
          else if (column == COL_DataDespesa) {
            return "Data da Despesa";
        }
          else if (column == COL_ValorDespesa) {
            return "Valor da Despesa";
        }
          else if (column == COL_FormaPagamento) {
            return "Forma de Pagamento";
        }
          else if (column == COL_DataCheque) {
            return "Data do Cheque";
        }
          else if (column == COL_NumeroCheque) {
            return "Numero do Cheque";
        }
        return "";
    }

    @Override
    public Class getColumnClass(int columnIndex) {
        //retorna a classe que representa a coluna
        if (columnIndex == COL_Despesa) {
            return String.class;
        } else if (columnIndex == COL_Estabelecimento) {
            return String.class;
        }
          else if (columnIndex == COL_DataDespesa) {
            return String.class;
        }
          else if (columnIndex == COL_ValorDespesa) {
            return String.class;
        }
          else if (columnIndex == COL_FormaPagamento) {
            return String.class;
        }
          else if (columnIndex == COL_DataCheque) {
            return String.class;
        }
          else if (columnIndex == COL_NumeroCheque) {
            return String.class;
        }
        return String.class;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        //pega o produto da linha
        Produto p = produtos.get(rowIndex);

        //verifica qual valor deve ser retornado
        if (columnIndex == COL_Despesa) {
            return p.getDespesa();
        } else if (columnIndex == COL_Estabelecimento) {
            return p.getEstabelecimento();
        }
          else if (columnIndex == COL_DataDespesa) {
            return p.getDataDespesa();
        }
          else if (columnIndex == COL_ValorDespesa) {
            return p.getValorDespesa();
        }
          else if (columnIndex == COL_FormaPagamento) {
            return p.getFormaPagamento();
        }
          else if (columnIndex == COL_DataCheque) {
            return p.getDataCheque();
        }
          else if (columnIndex == COL_NumeroCheque) {
            return p.getNumeroCheque();
        }
        return "";
    }
        @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        //no nosso caso todas vão ser editáveis, entao retorna true pra todas
        return true;
    }

   @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        //pega o produto da linha
        Produto p = produtos.get(rowIndex);

        //verifica qual valor vai ser alterado
        if (columnIndex == COL_Despesa) {
            p.setDespesa(aValue.toString());
        } else if (columnIndex == COL_Estabelecimento) {
            p.setEstabelecimento(aValue.toString());
        }
          else if (columnIndex == COL_DataDespesa) {
            p.setDataDespesa(aValue.toString());
        }
          else if (columnIndex == COL_ValorDespesa) {
            p.setValorDespesa(aValue.toString());
        }
          else if (columnIndex == COL_FormaPagamento) {
            p.setFormaPagamento(aValue.toString());
        }
          else if (columnIndex == COL_DataCheque) {
            p.setDataCheque(aValue.toString());
        }
          else if (columnIndex == COL_NumeroCheque) {
            p.setNumeroCheque(aValue.toString());
        }
        //avisa que os dados mudaram
        fireTableDataChanged();
    }

    //-----------------------------------------------------
    //Métodos personalizados
    //-----------------------------------------------------
    public void inserir(Produto p) {
        produtos.add(p);

        fireTableDataChanged();
    }

    public void excluir(String pos) {
        produtos.remove(pos);

        fireTableDataChanged();
    }

    public void excluir(Produto p) {
        produtos.remove(p);

        fireTableDataChanged();
    }

    public void ordenarPorValor() {
        //ordena pelo nome
        Collections.sort(produtos, new Comparator<Produto>() {

            public int compare(Produto o1, Produto o2) {
                return o1.getValorDespesa().compareTo(o2.getValorDespesa());
            }
        });
        //avisa que a tabela foi alterada
        fireTableDataChanged();
    }
    

    public void misturar() {
        //mistura a lista
        Collections.shuffle(produtos);

        //avisa que a tabela foi alterada
        fireTableDataChanged();
    }

    public Produto getCliente(int pos) {
        if (pos >= produtos.size()) {
            return null;
        }

        return produtos.get(pos);
    }
}

Gostaria de saber aonde esta este erro, e se estou no caminho certo com Table Model, e como faço para inserir meu banco de dados no jtable atraves do tablemodel.