如何使用数据库填充JTable中的数据?

我想显示一个JTable,它按原样显示DataBase表中的数据。

到目前为止,我已经使用了JTable来显示来自Object [] []的数据。

我知道显示数据的一种方法是首先将数据库表转换为Object [] []但是还有其他任何容易但更强大和灵活的方法。

我建议采取以下方法:

  • 创建一个Row类来表示从ResultSet读取的行。 这可能是一个围绕Object[]的简单包装器。
  • 创建List集合,并为此集合支持AbstractTableModel子类。
  • 使用SwingWorker通过读取后台线程上的基础ResultSet (即在doInBackground()方法中)来填充List 。 调用SwingWorkerpublish方法将Row s发布回Event Dispatch线程(例如,每100行)。
  • 当使用最新的Rows行调用SwingWorkerprocess方法时,将它们添加到ListTableEvent相应的TableEvent以使显示更新。
  • 此外,使用ResultSetMetaData确定TableModel定义中每列的Class 。 这将导致它们被正确渲染(如果您只是使用2D Object[][]数组则不会出现这种情况)。

这种方法的优点是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 rows; public ResultSetTableModel(ResultSetMetaData rsmd) { this.rsmd = rsmd; this.rows = new ArrayList(); } 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() { 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(); 

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

  1. 查询—>数据库数据—> RowSet
  2. RowSet < - > TableModel适配器< - > JTable

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

RowSet是ResultSet的子接口,在Java 1.4中添加。 所以RowSet 一个ResultSet。

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

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

RowSet教程

根据您已经完成的工作以及您愿意做的事情,我已经非常成功地使用Netbeans及其Beans Binding支持数据库驱动的应用程序。 将JTable绑定到数据库,它会自动构建JPA查询。

使用ResultSet填充jTable的最佳方法

先决条件

1)结果集“rs”填充了您需要的数据。 2)JTable“jTable1”在手3之前创建。)表头是在手前实现的

履行

  java.sql.ResultSet rs = datacn.executeSelectQuery(query); //Filling JTable with Result set // Removing Previous Data while (jTable1.getRowCount() > 0) { ((DefaultTableModel) jTable1.getModel()).removeRow(0); } //Creating Object []rowData for jTable's Table Model int columns = rs.getMetaData().getColumnCount(); while (rs.next()) { Object[] row = new Object[columns]; for (int i = 1; i <= columns; i++) { row[i - 1] = rs.getObject(i); // 1 } ((DefaultTableModel) jTable1.getModel()).insertRow(rs.getRow() - 1,row); } 

您必须创建自定义TableModel在那里您可以指定数据的来源和方式。

您必须首先完全理解JTable + TableModel的工作原理,然后按照之前发布的答案之一进行操作。

我知道这个问题很老但是对于任何遵循Adamski解决方案的人来说,在gui和SwingWorker线程之间共享ResultSetResultSetMetadata时应该小心。 在SQLite中使用这种方法时,我得到了一个不一致的内部状态exception。 解决方案是在执行SwingWorker之前将任何元数据加载到私有字段,并使用getter函数(getColumnName等)来返回字段。

我在JTable中为显示数据库表数据提供了一个小方法。 您只需要将数据库表的结果集作为参数传递。

 // rs is the ResultSet of the Database table public void displayData(ResultSet rs) { //jt Represents JTable //jf represents JFrame int i; int count; String a[]; String header[] = {"1","2","3","4","5"}; //Table Header Values, change, as your wish count = header.length; //First set the Table header for(i = 0; i < count; i++) { model.addColumn(header[i]); } jt.setModel(model); //Represents table Model jf.add(jt.getTableHeader(),BorderLayout.NORTH); a = new String[count]; // Adding Database table Data in the JTable try { while (rs.next()) { for(i = 0; i < count; i++) { a[i] = rs.getString(i+1); } model.addRow(a); //Adding the row in table model jt.setModel(model); // set the model in jtable } } catch (Exception e) { JOptionPane.showMessageDialog(null, "Exception : "+e, "Error", JOptionPane.ERROR_MESSAGE); } } 

// rs is the ResultSet of the Database table public void displayData(ResultSet rs) { //jt Represents JTable //jf represents JFrame int i; int count; String a[]; String header[] = {"1","2","3","4","5"}; //Table Header Values, change, as your wish count = header.length; //First set the Table header for(i = 0; i < count; i++) { model.addColumn(header[i]); } jt.setModel(model); //Represents table Model jf.add(jt.getTableHeader(),BorderLayout.NORTH); a = new String[count]; // Adding Database table Data in the JTable try { while (rs.next()) { for(i = 0; i < count; i++) { a[i] = rs.getString(i+1); } model.addRow(a); //Adding the row in table model jt.setModel(model); // set the model in jtable } } catch (Exception e) { JOptionPane.showMessageDialog(null, "Exception : "+e, "Error", JOptionPane.ERROR_MESSAGE); } }