簡體   English   中英

Java中的JTable的JDBC TableModel?

[英]JDBC TableModel for a JTable in Java?

我想將數據庫表顯示為JTable。 我以前從未使用過JTable,所以我在JTable和TableModel上進行了谷歌搜索。

通過谷歌搜索,我可以編寫自己的自定義TableModel來顯示存儲在

Object[][] data;

現在,我想將數據庫表數據顯示到JTable中。 我也進行了搜索,雖然對此有所了解,但對於在AbstractTableModel的實現類中應該去哪里仍然感到困惑。

以下是自定義TableModel的代碼。

public abstract class AbstractPOLDATTableModel extends AbstractTableModel {
protected boolean DEBUG = false;
private String[] columnNames;
private Object[][] data;

protected AbstractPOLDATTableModel(String[] columnNames, Object[][] data) {
    this.columnNames = columnNames;
    this.data = data;
}

public int getColumnCount() {
    return columnNames.length;
}

public int getRowCount() {
    return data.length;
}

@Override
public String getColumnName(int col) {
    return columnNames[col];
}

public Object getValueAt(int row, int col) {
    return data[row][col];
}

@Override
public Class getColumnClass(int c) {
    return getValueAt(0, c).getClass();
}

@Override
public boolean isCellEditable(int row, int col) {
    if (col < 2) {
        return false;
    } else {
        return true;
    }
}

@Override
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();
    }
}

private void printDebugData() {
    int numRows = getRowCount();
    int numCols = getColumnCount();

    for (int i=0; i < numRows; i++) {
        System.out.print("    row " + i + ":");
        for (int j=0; j < numCols; j++) {
            System.out.print("  " + data[i][j]);
        }
        System.out.println();
    }
    System.out.println("--------------------------");
}
}

現在,如何更改上面的代碼,以便我的JTable可以具有以下功能:

  1. 它顯示了來自數據庫的數據
  2. 用戶可以直接編輯表,當他單擊“保存”按鈕時,更改將反映在數據庫數據中
  3. 用戶可以直接插入數據。
  4. 用戶可以直接刪除數據。

我假設您已經根據Adamski在上一個問題中提出的建議實施了1。 同樣,如Sanoj所建議,更改為使用某種列表來存儲數據。

  1. 要支持2-4,必須確保從數據庫中提取的數據僅來自一個表,並且不包含任何派生數據(例如,聚合,column1 + column2)。 如果要讓用戶篩選行,則需要跟蹤where子句。

  2. 在每一行中,存儲代表用戶使用GUI進行的更新的另一行(我們將其稱為updatedRow)。 一旦對該行進行了任何更新,就需要用包含更新數據的新行填充該字段。 單擊“保存”后,您將使用非null的updatedRow對所有行運行更新查詢,並使用updatedRow中的數據與原始行中的數據不匹配來更新數據庫(如果用戶將數據更改回原來的方式,則不要更新原來是)。 您可能還具有另一個“撤消更新”按鈕,該按鈕將使用具有非null UpdatedRow的所有行的原始數據填充表。

    我強烈建議您存儲額外的元數據,在這些元數據上構成主鍵的字段並防止其被更改,因為對此類列的更新可能會很昂貴(因為它們可能已被索引並且可能附加了一些RI約束)。 應該通過使此類列不可編輯來在GUI中反映出來。 更新中的where子句將僅使用這些字段,而不使用所有字段(您仍然需要用戶在1中設置的其他過濾器)。

  3. 我建議分兩個步驟進行。 用戶通過單擊向表添加一行的按鈕開始。 輸入數據后,用戶單擊另一個按鈕以插入數據庫中(或者您可以將此功能與“保存”按鈕中的更新結合在一起)。 如果主鍵列不是某些自動生成的ID,則需要允許新插入的行的主鍵字段可編輯。

    為了區分數據庫中已有哪些行和哪些行沒有,我建議存儲一個新插入的行的列表。

    如果讓用戶僅選擇要在表中顯示的某些列,則需要確定如何處理未顯示的列(例如,讓數據庫設置默認值,並使用自動生成的ID進行填充)。

  4. 最好通過在每個行上都有一個復選框來實現此目的,然后單擊“刪除”按鈕,它將調用SQL以使用1中的過濾器和2中提到的主鍵元數據刪除每個選中的行,然后將其刪除從桌子上。

一般注意事項:

  • 相同的setValueAt方法將用於更新的行和插入的行,但是您需要不同的行為。 您想為更新設置“ updatedRow”,而不是在編輯要插入的行時設置。

  • 您將如何處理錯誤,例如無法滿足約束或輸入無效(例如,數字字段中的“ abcde”)?

  • SQL注入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM