【问题标题】:JDBC and updatable ResultSetJDBC 和可更新的 ResultSet
【发布时间】:2014-03-12 04:38:48
【问题描述】:

我正在学习一点关于 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();
    }
}

}

【问题讨论】:

    标签: java jdbc updates resultset


    【解决方案1】:

    尝试以下更改:

    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 对象反映。

    TYPE_SCROLL_INSENSITIVE

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

    TYPE_SCROLL_SENSITIVE

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

    更多详情请参考Updating ResultSet

    【讨论】:

      【解决方案2】:

      你的桌子有 PRIMARY KEY 吗?

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

      【讨论】:

      • 感谢您对 Marius 的评论,但我已经有一段时间没有编写该代码了,我可能已经记不清了。基本上我在完成这个练习后还没有接触过 JDBC!我现在正在做一个项目,我们只使用休眠。
      • Np。超级你现在正在做一个项目!我正在阅读一本关于 JDBC 的书“Java 数据库编程圣经”。它有例子而且很简单。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多