java - 在 Java 中更新单行数据库

标签 java sql swing sqlite

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

{ Material 名称;数量}

我还有一个 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();
        }
    }
}

数量更新后就可以了。但是,一旦更新了 Material 名称,我不知道应该如何在数据库中更新它。

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

也许有办法保存该值的先前值?我不能使用 Material 的数量,因为它们可能会重复。

如果可能的话,我希望避免向对象添加 ID。

最佳答案

此声明:

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

有两(三)个问题。

  1. “旧”值和"new"值相同。你有一个逻辑问题。

  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();
    

逻辑问题必须在你的构思中得到解决。

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

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

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

也许automagic默认的表模型太差了。实现 Row 的类应该多一个可以(或不)不可见的列(ID)。

我的英语不太流利,无法在 SO 帖子中教授关系数据库和 Swing。

第二个小代码片段没有显示您的应用程序概念。 在 google 中阅读有关自定义 JTable 模型的内容。

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

关于java - 在 Java 中更新单行数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40447951/

相关文章:

java - 按照 MVC 模式在 Java 中实现 JFileChooser

java - 如何防止 Postman 调用 Rest WebService?

java - 查找数组中的最高值,但是如果最高值在数组中存在两个或多个位置怎么办?

sql - 如何选择所有具有以特定数字开头的 bigint 字段的记录?

java - 如何在 Java 中将每个标签与其文本字段旁边对齐?

java - Swing : Action Performed creating a new window.

java - 制作无限可滚动的 ImageView

java - try catch可以用来做代码优化吗?

SQL分析函数第一个值超过max(另一个属性)

sql - 如何评估保存在 SQL Server 中 nvarchar 变量中的数学表达式