gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:17:21 25 4
gpt4 key购买 nike

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

{ 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com