使用Java更新单行数据库

时间:2016-11-06 09:46:32

标签: java sql swing sqlite

所以我有一个像这样的数据库

{MATERIAL NAME; QUANTITY}

我还有一个Java中的JTable,它从数据库(SQLite)上传信息。在编辑表格中的单元格时,它会以这种方式自动更新数据库:

//table listener
public void tableChanged(TableModelEvent e) {
    //gets row and column if the table is edited
    int row = e.getFirstRow();
    int column = e.getColumn();
    //change in sqlite
    if (column == 1) {
        int value = Integer.parseInt(table.getModel().getValueAt(row, column).toString());
        String materialId = table.getModel().getValueAt(row, column-1).toString();
        try (Connection c = DriverManager.getConnection("jdbc:sqlite:database.db"); Statement statement = c.createStatement()) {
            String sql = "UPDATE MATERIALS set QUANTITY = " + value + " where MATERIAL='" + materialId +"';";
            statement.executeUpdate(sql);
            statement.close();
            c.close();
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
    }
    else if (column == 0) {
        int value = Integer.parseInt(table.getModel().getValueAt(row, column+1).toString());
        String materialId = table.getModel().getValueAt(row, column).toString();
        try (Connection c = DriverManager.getConnection("jdbc:sqlite:database.db"); Statement statement = c.createStatement()) {
            String sql = "UPDATE MATERIALS set MATERIAL = " + materialId + " where MATERIAL='" + materialId +"';";
            statement.executeUpdate(sql);
            statement.close();
            c.close();
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
    }
}

数量更新时没关系。但是,一旦更新了材料名称,我就不知道如何在数据库中更新它。

String sql = "UPDATE MATERIALS set MATERIAL = " + materialId + " where MATERIAL='" + materialId +"';";

也许有办法保存该值的先前值?我不能使用可能重复的材料数量。

如果可能的话,我想避免在对象中添加ID。

2 个答案:

答案 0 :(得分:1)

本声明:

String sql = "UPDATE MATERIALS set MATERIAL = " + materialId + " where MATERIAL='" + materialId +"';"

有两(3)个问题。

  1. “旧”值和“新”值相同。你有一个合乎逻辑的问题。

  2. WHERE部分连接类似于字符串类型,但SET部分不是

  3. 连接是邪恶的。正确的方法是

    String sql = "UPDATE MATERIALS set MATERIAL = ? where MATERIAL= ?";
    PreparedStatement prepstmt = conn.prepareStatement(sql);
    prepstmt .setString(1, newMatewrial);
    prepstmt .setString(2, oldMaterial);
    prepstmt .executeUpdate();
    
  4. 必须在您的构思中解决逻辑问题。

    似乎主要问题在于基本上没有使用ID。关系数据库中的每一行都应该有稳定的主键(ID就像你说的那样)。名称不是主键,因为可以更改。

    部分应该使用ID而不是名称。

    编辑:在我看来,良好的JTable模型是解决问题的一种方法。

    也许自动默认表模型太差了。实现Row的类应该有一个列(ID),它可以(或不)是不可见的。

    我的英语不太流利,不能教SO关系数据库和Swing。

    第二个小代码片段不显示您的应用程序概念。 在谷歌上阅读自定义JTable模型

    非常基本的例子: http://www.java2s.com/Code/Java/Swing-JFC/TablewithacustomTableModel.htm

答案 1 :(得分:0)

好的,似乎我找到了问题的解决方案

JTable: Detect cell data change

但是,这需要在项目中实现另一个类并使用它。 SQL语句的答案仍然保持不变。