Java JDBC和可更新的结果集

Java JDBC和可更新的结果集,java,jdbc,updates,resultset,Java,Jdbc,Updates,Resultset,我正在学习一点关于JDBC以及如何与数据库交互的知识。我了解了基本知识,但现在遇到了可更新结果集的问题。在这个练习中,我必须检查数据库中每种啤酒的库存,并将其添加到50 所以这段代码确实有效,但不是一直有效。我已经运行了好几次,大约有50%的时间股票实际上已经上涨了。为了检查这一点,我编写了另一个小while循环,它打印一个包含必要数据的表。你知道为什么它不能100%的工作吗 数据库中有1071条记录,我在得到结果后立即运行了这段代码。我应该在再次运行之前等待吗 package stockbie

我正在学习一点关于JDBC以及如何与数据库交互的知识。我了解了基本知识,但现在遇到了可更新结果集的问题。在这个练习中,我必须检查数据库中每种啤酒的库存,并将其添加到50

所以这段代码确实有效,但不是一直有效。我已经运行了好几次,大约有50%的时间股票实际上已经上涨了。为了检查这一点,我编写了另一个小while循环,它打印一个包含必要数据的表。你知道为什么它不能100%的工作吗

数据库中有1071条记录,我在得到结果后立即运行了这段代码。我应该在再次运行之前等待吗

package stockbier;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class bierenstock {

public static void main(String[] args) {

try (Connection con = DriverManager.getConnection(
            "jdbc:mysql://noelvaes.eu/StudentDB", "student", "student123");
    PreparedStatement stmt = con.prepareStatement
        ("select * from Beers", 
        ResultSet.TYPE_SCROLL_INSENSITIVE,
        ResultSet.CONCUR_UPDATABLE);) {

    ResultSet rs = stmt.executeQuery();
    while (rs.next()) {
            // edited int stock
        int stock = rs.getInt("Stock") + 50;
        rs.updateInt("Stock", stock);
        rs.updateRow();

    }

    rs.close();

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

尝试以下更改:

public static void main(String[] args) {

try (Connection con = DriverManager.getConnection(
        "jdbc:mysql://noelvaes.eu/StudentDB", "student", "student123");
PreparedStatement stmt = con.prepareStatement
    ("select * from Beers", 
    ResultSet.TYPE_SCROLL_SENSITIVE,
    ResultSet.CONCUR_UPDATABLE);) {

ResultSet rs = stmt.executeQuery();
while (rs.next()) {
    int stock = rs.getInt("Stock") + 50;
    rs.updateInt("Stock", stock);
    rs.updateRow();
}

} catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} finally {
    if (stmt != null) { stmt.close(); }
}    
}    
ResultSet对象的类型决定了它在两个方面的功能级别:光标的操作方式,以及ResultSet对象如何反映对基础数据源所做的并发更改

类型\u滚动\u不敏感

结果可以滚动显示;它的光标可以向前和向后移动 相对于当前位置向后移动,并且可以移动到 绝对位置。结果集对对所做的更改不敏感 基础数据源处于打开状态时。它包含以下行: 在执行查询时或作为 将检索行

键入滚动敏感的内容

结果可以滚动显示;它的光标可以向前和向后移动 相对于当前位置向后移动,并且可以移动到 绝对位置。结果集反映了对 结果集保持打开时的基础数据源


有关更多详细信息,请参阅。

您的表是否有主键

指定结果集是可更新的并不保证 您得到的结果集实际上是可更新的。不需要的司机 支持可更新的结果集将返回一个只读结果集。在里面 此外,要获得可更新的结果集,查询通常必须 将主键指定为所选列之一,它应该 仅从一个表中选择列


谢谢你对马吕斯的评论,但我已经有一段时间没有写那个代码了,我不可能再记得了。基本上,在完成这个练习之后,我还没有接触过JDBC!我现在正在做一个项目,我们只使用hibernate.Np。超级感谢你现在正在做一个项目!我正在读一本关于JDBC的书《Java数据库编程圣经》。它有例子,而且很简单。:)