[RESOLVIDO] jTable com manipulação de dados. Alguma ajuda?

Ola novamente galera, estou com um problema que ta me matando e eu não consigo resolver, já tentei de tudo ou quase tudo… É o seguinte

Tenho uma lista e uma tabela, a lista contém o nome das disciplinas escolhidas pelo aluno e a tabela tem colunas de janeiro a dezembro. Quero exibir nessa tabela a quantidade de faltas que o aluno teve em determinado mês na linha da disciplina escolhida por ele.

o meu DAO está assim, porém ele retornar todas as faltas do aluno.

public List read(String id){

    Connection con = ConnectionFactory.getConnection();
    PreparedStatement stmt = null;
    ResultSet rs = null;
    
    List<Faltas> faltas_l = new ArrayList<>();
    
    try {
        stmt = (PreparedStatement) con.prepareStatement("SELECT * FROM faltas f INNER JOIN alunos a ON f.id_al = a.id_matri WHERE a.id_matri = ?");
        stmt.setString(1, id);
        
        rs = stmt.executeQuery();
        
        while(rs.next()){
            
            Faltas faltas = new Faltas();
            faltas.setId(rs.getInt("id"));
            faltas.setMes(rs.getInt("mes"));
            faltas.setId_disc(rs.getInt("id_disc"));
            
            faltas_l.add(faltas);
        }
        
    } catch (SQLException ex) {
        Logger.getLogger(FaltasDAO.class.getName()).log(Level.SEVERE, null, ex);
    }finally{
        ConnectionFactory.closeConnection((com.mysql.jdbc.Connection) con, stmt);
    }
    
    return faltas_l;
}

Você só faz o inner join para comparar ou usa algum atributo de aluno? Pelo que vi, não usa nada de aluno, logo, pode fazer um select direto:

SELECT * FROM faltas f WHERE f.id_al = ?;

Que dará no mesmo.

Quanto a questão de faltas por disciplina, é um tanto complicado, embora você tenha 2 opções:

  • Fazer tantos selects quanto forem as disciplinas
  • Select no banco já trazer a quantidade de faltas agrupadas por disciplina.
  • Fazer select e trazer os dados brutos e processar no java.

O primeiro cenário é o mais simples, mas, não muito performático. Ok, com 3 disciplinas e 40 alunos, mas, e se forem 10 disciplinas e 500 alunos?
O segundo é o cenário mais interessante. Porém, você precisa ter um bom conhecimento em SQL.
O terceiro é o mais fácil, porém, o mais custoso em termos de processamento, pois, você precisa iterar sobre todos os dados repetidas vezes, para calcular quantas faltas possui em cada disciplina.

Boaaa amigo, então, eu fiz da seguinte forma dê uma olhada pra mim e vê em qual das 3 opções ele se encaixa fazendo um grande favor.

Na Classe Principal ficou dessa forma:
qtd_disc() percorre a jList e retorna quantos itens possui, assim o sistema saberá quantas vezes vai ter que executar o for para avançar os id’s da lista em list_id.get(i);

public void readTable(String id){

    DefaultTableModel modeloTable = (DefaultTableModel) jTable1.getModel();
    FaltasDAO fdao = new FaltasDAO();
    
    qtd_disci();
    Integer i = 0;
    
    
    for(i = 0; i < j; i++){
        id_d = list_id.get(i);
        
    //Busca faltas do aluno com o ID desejado
    
        for(Faltas f: fdao.read(id, id_d)){
            
            System.out.println("ID Disci Lista: "+id_d+" Mes: "+f.getMes()+" ID Disci Falta:"+f.getId_disc()+" ID Aluno:"+f.getId_al());
           Integer mes = f.getMes();
            if(mes == 1){
                jan++;
            }if(mes == 2){
                fev++;
            }if(mes == 3){
                mar++;
            }if(mes == 4){
                abr++;
            }if(mes == 5){
                mai++;
            }if(mes == 6){
                jun++;
            }if(mes == 7){
                jul++;
            }if(mes == 8){
                ago++;
            }if(mes == 9){
                set++;
            }if(mes == 10){
                out++;
            }if(mes == 11){
                nov++;
            }if(mes == 12){
                dez++;
            }
        }
        modeloTable.addRow(new Object[]{
                    jan,
                    fev,
                    mar,
                    abr,
                    mai,
                    jun,
                    jul,
                    ago,
                    set,
                    out,
                    nov,
                    dez
                       }); 
    zera();
    }

}

A Função zera(); zera todas as variáveis(jan,fev,mar…) ao fim de cada ciclo do for evitando assim que o sistema duplique dados

O meu DAO read() ficou da seguinte forma:

public List read(String id, Integer id_d){

    Connection con = ConnectionFactory.getConnection();
    PreparedStatement stmt = null;
    ResultSet rs = null;
    
    List<Faltas> faltas_l = new ArrayList<>();
    
    try {
        stmt = (PreparedStatement) con.prepareStatement("SELECT * FROM faltas f WHERE f.id_al = ? AND f.id_disc = ?");
        stmt.setString(1, id);
        stmt.setInt(2, id_d);
        
        rs = stmt.executeQuery();
        
        while(rs.next()){
            
            Faltas faltas = new Faltas();
            faltas.setId(rs.getInt("id"));
            faltas.setMes(rs.getInt("mes"));
            faltas.setId_disc(rs.getInt("id_disc"));
            faltas.setId_al(rs.getString("id_al"));
            
            faltas_l.add(faltas);
        }
        
    } catch (SQLException ex) {
        Logger.getLogger(FaltasDAO.class.getName()).log(Level.SEVERE, null, ex);
    }finally{
        ConnectionFactory.closeConnection((com.mysql.jdbc.Connection) con, stmt);
    }
    
    return faltas_l;
}

Está funcionando perfeitamente, depois de muito trabalho, fica o código caso alguém tenha o mesmo problema. Abraçosssss