如何用数据库在JTable中填充数据?

2022-09-02 11:52:28

我想显示一个JTable,它按原样显示来自数据库表的数据。

到目前为止,我一直使用JTable来显示来自对象[ ][ ]的数据。

我知道显示数据的一种方法是首先将数据库表转换为对象[ ][ ],但是还有其他简单但更强大,更灵活的方法吗?


答案 1

我建议采取以下方法:

  • 创建一个类来表示从 中读取的行。这可能是围绕 .RowResultSetObject[]
  • 创建一个集合,以及要由此集合支持的子类。List<Row>AbstractTableModel
  • 使用 a 通过从后台线程(即在方法内)上的基础读取来填充您的。调用 的方法将 s 发布回事件调度线程(例如,每 100 行)。SwingWorkerList<Row>ResultSetdoInBackground()SwingWorkerpublishRow
  • 当使用读取的最新行块调用 时,请将它们添加到您的并触发相应的 s 以使显示更新。SwingWorkerprocessList<Row>TableEvent
  • 此外,使用 来确定定义中每列的 。这将导致它们正确呈现(如果您只是使用2D数组,则不会出现这种情况)。ResultSetMetaDataClassTableModelObject[][]

此方法的优点是,在处理大型 s 时,UI 不会锁定,并且显示将随着结果的处理而增量更新。ResultSet

编辑

添加了以下示例代码:

/**
 * Simple wrapper around Object[] representing a row from the ResultSet.
 */
private class Row {
  private final Object[] values;

  public Row(Object[] values) {
    this.values = values;
  }

  public int getSize() {
    return values.length;
  }

  public Object getValue(int i) {
    return values[i];
  }
}

// TableModel implementation that will be populated by SwingWorker.
public class ResultSetTableModel extends AbstractTableModel {
  private final ResultSetMetaData rsmd;
  private final List<Row> rows;

  public ResultSetTableModel(ResultSetMetaData rsmd) {
    this.rsmd = rsmd;
    this.rows = new ArrayList<Row>();
  }

  public int getRowCount() {
    return rows.size();
  }

  public int getColumnCount() {
    return rsmd.getColumnCount();
  }

  public Object getValue(int row, int column) {
    return rows.get(row).getValue(column);
  }

  public String getColumnName(int col) {
    return rsmd.getColumnName(col - 1); // ResultSetMetaData columns indexed from 1, not 0.
  }

  public Class<?> getColumnClass(int col) {
    // TODO: Convert SQL type (int) returned by ResultSetMetaData.getType(col) to Java Class.
  }
}

// SwingWorker implementation
new SwingWorker<Void, Row>() {
  public Void doInBackground() {
    // TODO: Process ResultSet and create Rows.  Call publish() for every N rows created.
  }

  protected void process(Row... chunks) {
    // TODO: Add to ResultSetTableModel List and fire TableEvent.
  }
}.execute();

答案 2

在 JTable 中显示数据库数据的另一种强大而灵活的方法是将查询的结果数据加载到 CachedRowSet 中,然后使用 TableModel 适配器将其连接到 JTable

  1. 查询--->行集--->数据库数据
  2. 行集<-->表模型适配器<--> JTable

George Reese的这本书给出了他的类RowSetModel源代码,以将RowSet改编为TableModel。开箱即用地为我工作。我唯一的更改是该类的更好名称:RowSetTableModel

RowSet 是 ResultSet 的子接口,在 Java 1.4 中添加。因此,行集就是结果集。

CachedRowSet 实现为您完成工作,而不是像本页其他答案中所述创建 Row 类、Row 对象列表和 ResultSetMetaData。

Sun/Oracle 提供了 CachedRowSet 的参考实现。其他供应商或 JDBC 驱动程序也可能提供实现。

行集教程


推荐