【问题标题】:I use JDBC to update the data but it doesn't work我使用 JDBC 更新数据,但它不起作用
【发布时间】:2020-01-16 08:52:17
【问题描述】:

我尝试使用 JDBC 来插入和更新数据。插入函数运行良好,但更新函数并没有改变数据库中的任何内容。运行时也不例外。

我确定 RoomID 存在且正确。

这是我的插入功能,可以使用

private static Connection conn;
private PreparedStatement pres;

public void saveRoom(Room room) {
    String sql = "insert into ROOM(roomid, object) values(?,?)";
    try {
        pres = conn.prepareStatement(sql);
        pres.setObject(1, room.getRoomId());
        pres.setObject(2, roomToBlob(room));
        pres.addBatch();
        pres.executeBatch();
        conn.commit();
        if (pres != null) {
            pres.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

这是我的更新功能,这不起作用。也不例外,但数据没有变化。

private static Connection conn;
private PreparedStatement pres;

public void updateRoom(ArrayList<Room> RoomList) {
    String sql = "update ROOM set room.object= ? where room.roomid like ?";
    try {
        pres = conn.prepareStatement(sql);
        for (int i = 0; i < RoomList.size(); i++) {
            pres.setObject(1, roomToBlob(RoomList.get(i)));
            pres.setObject(2, RoomList.get(i).getRoomId());
            pres.addBatch();
        }
        pres.executeBatch();
        conn.commit();
        if (pres != null) {
            pres.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

我找到了问题并解决了它,但我仍然不知道为什么会这样。 我的解决办法是:

A 类有一个 Arraylist 列表 public void update(){database.updateRoom(list);}

B类: A a = 新 A(); 数据库.updateRoom(a.getList()); 这没有异常,但数据库中没有数据变化。

a.update();这很好用,数据更改正确。

为什么会这样?

【问题讨论】:

  • pres 在您测试它时不可能为空,那么为什么要测试它呢?为什么它是一个成员变量?这只是自找麻烦,因为有一个静态的Connection 变量。两者都应该是局部变量,在方法内部获取和释放。为什么要对单个 INSERT 语句进行批处理?
  • 我试过 = 但它不起作用。
  • 更新了多少行? INSERT 语句中roomID 的值是多少?和 UPDATE 语句? roomID 列是什么类型的?
  • 尝试使用where room.roomid = ? 而不是like
  • 7 个问题, 两天前提出的,你能想到的只是重申你原来不受支持的断言。

标签: java jdbc hsqldb


【解决方案1】:

按照 cmets 中的建议,您需要更改 UPDATE 语句:

String sql = "update ROOM set room.object= ? where room.roomid = ?";

LIKE value 表达式用于匹配部分字符串。例如,当您想要查找所有以字母 ma 开头的字符串(例如 matmanmap)时,您使用 LIKE 'ma%'

【讨论】:

  • 我试过=和like,但是两个都不行,我想可能是因为一些回滚问题。
  • @SihongMiao 我认为这是因为roomID 不一样。您需要回答这里提出的问题。
  • @SihongMiao 请更新并回答 user207421 提出的问题。如果您尝试使用表中没有的 roomID 值进行更新,则不会更改任何数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 2020-10-26
相关资源
最近更新 更多