如何从(SQLite)数据库加载的JTable中插入,更新和删除项目

我目前有2个类,一个显示GUI,一个是从数据库中获取项目。 我的代码如下:

此代码用于在GUI中显示JTable

public void table() { if(SOMR.tableCall() == true) { this.columnNames = SOMR.getCol(); this.data = SOMR.getData(); JTable table = new JTable(data, columnNames) { public Class getColumnClass(int column) { for (int row = 0; row < getRowCount(); row++) { Object o = getValueAt(row, column); if (o != null) { return o.getClass(); } } return Object.class; } }; JScrollPane scrollPane = new JScrollPane( table ); add( scrollPane, BorderLayout.CENTER ); } } 

这段代码是检索项目并将它们传递给上面的代码,以显示检索到JTable的项目

 public boolean table() { Connection connection = null; ResultSet resultSet = null; PreparedStatement preparedStatement = null; try { Class.forName("org.sqlite.JDBC"); connection = DriverManager.getConnection("jdbc:sqlite:db"); preparedStatement = connection.prepareStatement("SELECT item1, item2, item3 FROM menu WHERE can = ? AND id = ?"); preparedStatement.setInt(1, can); preparedStatement.setInt(2, id); resultSet = preparedStatement.executeQuery(); ResultSetMetaData md = resultSet.getMetaData(); columns = 3;//md.getColumnCount(); for(int i = 1; i<=columns; i++) { columnNames.addElement(md.getColumnName(i)); } while(resultSet.next()) { row = new Vector(columns); for (int i = 1; i<=columns; i++) { row.addElement(resultSet.getObject(i)); } data.addElement(row); } tablecall = true; return tablecall; } catch (Exception ex) { tablecall = false; ex.printStackTrace(); } finally { try { resultSet.close(); preparedStatement.close(); connection.close(); } catch (Exception ex) { ex.printStackTrace(); } } return tablecall; } 

我已经按照从表格数据库中显示JTable的方式,但我真的不知道如何从JTable插入,更新和删除行并在数据库中更新,然后刷新JTable以显示新更新数据库。

我想添加一个“添加项目”按钮,然后它将弹出一个框架/窗口,其中包含要输入的字段,然后在弹出框架中单击“添加”后,JTable和数据库将同时更新。

有人可以帮我吗? 我迷路了..非常感谢你!

我仍然不清楚你的要求,但让我们尽可能多地开始回答:

每个JTable对象都使用表模型对象来管理实际的表数据。 表模型对象必须实现TableModel接口。 但是,它自己的DefaultTableModel足以处理表数据交互。 查看它的java doc以获取更多详细信息。

但是,要检测由表model对象管理的数据的更改,需要使用addTableModelListener()函数将与JTable实例关联的model注册到TableModelListener接口的实现。 将通过事件TableModelEvent e通知侦听器,以使用以下方法检查数据行和更改类型的更改:

  • e.getFirstRow() :返回更改的第一行的索引,包括TableModelEvent.HEADER_ROW指定的表头。
  • e.getLastRow() :更改的最后一行
  • e.getType() :更改的单元格发生了什么:
    1. 如果插入了数据行: e.getType() == TableModelEvent.INSERT
    2. 如果删除了数据行: e.getType() == TableModelEvent.DELETE
    3. 如果数据行已更新e.getType() == TableModelEvent.UPDATE.

一个简短的例子:

 model.addTableModelListener(new TableModelListener() { @Override public void tableChanged(TableModelEvent e) { int rowFirstIndex = e.getFirstRow(); int rowLastIndex = e.getLastRow(); DefaultTableModel model = (DefaultTableModel) e.getSource(); if(e.getType()==TableModelEvent.UPDATE) { int updatedColIndex = e.getColumn(); String updateColmn = table.getColumnName(updatedColIndex); String updatedValue = (String) model.getValueAt(rowFirstIndex, updatedColIndex); System.out.println("column: "+updateColmn+" value: "+updatedValue); updateDB(updateColmn, updatedValue); } else if(e.getType()==TableModelEvent.INSERT) { for(int i= rowFirstIndex; i <= rowLastIndex ; i++) { Vector rowData = (Vector) model.getDataVector().get(i); MapdataMap = new HashMap<>(); for(int j=0; j < rowData.size() ; j++) dataMap.put(table.getColumnName(j), (String) rowData.get(j)); InsertToDB(dataMap); // now it contains columndName corresponding to row value } } } }); 

编辑(根据你的评论)I am getting [value1, value2, value3]. How do I then use this with my SQL statement? I am getting [value1, value2, value3]. How do I then use this with my SQL statement?

如果您有兴趣将行值映射到列名,就像构建SQL查询语法一样: vector包含具有维护column索引的行数据。 这就是row.get(i)具有列索引i的数据。 您可以使用table.getColumnName(i)来获取索引i处的列的名称,该列对应于索引i处的行向量值。

教程:

  1. 如何编写表模型监听器