Pobieranie danych z bazy do TableModel

0

Witam!
Tworzę aplikację z bazą danych derby. Mam w GUI kilka tabel, których model wygląda np. tak:


public class TabelaModel extends AbstractTableModel{
    public static final int a = 0;
    private static final String b = "";
    private static final int c = 2; 
    private static final int d = 3;
    private static final float e = 4;
    private static final float f = 4;

    @Override
    public int getRowCount() {
        return wiersze.length;
    }
    @Override
    public int getColumnCount() {
        return wiersze[0].length;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        return wiersze[rowIndex][columnIndex];
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex){
       return columnIndex == 1 || columnIndex == 2; 
    }

    @Override
    public String getColumnName(int column){
        return nazwyKolumn[column];
    }

    @Override
    public void setValueAt(Object ilosc, int rowIndex, int columnIndex){
        wiersze[rowIndex][columnIndex] = ilosc;
    }

    private String[] nazwyKolumn = {"CosA", "CosB", "CosC", "CosD", "CosE", "CosF"};
    private Object[][] wiersze = {{1, "", "", "", "", ""},
                                     {2, "", "", "", "", ""},
                                     {3, "", "", "", "", ""},
                                     {4, "", "", "", "'", ""},
                                     {5, "", "", "", "", ""},
                                     {6, "", "", "", "", ""},
                                     {7, "", "", "", "", ""},
                                     {8, "", "", "", "", ""},
                                     {9, "", "", "", "", ""},
                                     {10, "", "", "", "", ""},
                                     {11, "", "", "", "", ""},
                                     {12, "", "", "", "", ""},
                                     {13, "", "", "", "", ""},
                                     {14, "", "", "", "", ""},
                                     {15, "", "", "", "", ""},
                                     {16, "", "", "", "", ""},
        };    
}

Łączę się z bazą i pobieram rekordy w ten sposób:

        try{
            Class.forName("org.apache.derby.jdbc.ClientDriver");
            con = DriverManager.getConnection("jdbc:derby://localhost:1527/baza", "admin", "admin");
            ps = con.createStatement();
            rs = ps.executeQuery("select cena from Ceny where nazwa = 'przedmiotA'");
            while(rs.next()){
                System.out.println(rs.getFloat("cena"));
            }
        }catch(ClassNotFoundException e){
            System.out.println(e.getMessage());
        }catch(SQLException e){
            System.out.println(e.getMessage());
        }

Ale mam dwa problemy:
Po pierwsze jak najlepiej w tym modelu uzupełnić tabelę danymi z bazy czy tak jak to robię niżej?

Czy można jakoś inaczej pobierać te rekordy, czy zawsze musi być ten while:

            while(rs.next()){
                System.out.println(rs.getFloat("cena"));
            }

Wiem on jest bo zapytanie może zwrócić kilka rekordów ale gdy ja wiem, że moje dane są unikatowe w bazie i będzie zwracany tylko jeden?

0

Jeśli masz 110% pewności, że zawsze będzie jeden rekord, to pętla nie jest konieczna. Wystarczy samo

System.out.println(rs.getFloat("cena"));
0

Właśnie nie bo gdy usunę pętlę dostaję komunikat:

Niepoprawna operacja na bieżącej pozycji kursora.

0

A jak zrobić by np. ostatnia kolumna tabeli była definiowana w ten sposób, że każda jej komórka to iloczyn dwóch poprzednich w tym samym wierszu?
Bo w ten sposób nie można:

    private String[] nazwyKolumn = {"CosA", "CosB", "CosC", "CosD", "CosE", "CosF"};
    private Object[][] wiersze = {{1, "", "", "", "", cosD[0][3]*cosE[0][3]},
                                     {2, "", "", "", "", cosD[1][3]*cosE[1][3]},
        }; 

Wyrzuca mi:

first type: java.lang.Object
second type: java.lang.Object

0

Jak robisz selecta to możesz wyrażenia arytmetyczne na kolumnach wstawić jako "pole" np SELECT col1*col2 FROM table

0

Dwa inne rozwiązania:

  • inny typ modelu,
  • rzutowanie przed mnożeniem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0