DAO中的ResultSet问题

时间:2012-12-15 21:17:38

标签: java dao resultset

原谅我在正确解决这个问题时缺乏创造力。

嗨,我花了最后3个小时试图弄清楚这个问题,我想我已经弄明白了,但是它的解决方案仍然无法解决。我有这个非常简单的代码。

    Statement stmt = db.getStatement();
    ResultSet queryResult = stmt.executeQuery("SELECT * FROM users");

    while(queryResult.next()) {
        username = queryResult.getString("username");
        password = queryResult.getString("password");
        privilege = queryResult.getInt("privilege");

        queryResult = stmt.executeQuery("SELECT * FROM division");
        while(queryResult.next()) {}

        users.add(new User(username, password, privilege));
    }

现在,这段代码被愚蠢地说明我的代码中存在的问题。我显然没有包含任何内容的while循环。

我已经意识到每当我想从数据库中获取内容时,我只能在一个循环中使用结果集。如果我写一个“嵌套结果集循环”,我要么“操作...结果集关闭”,“找不到列'用户名'”,或者其他一些错误。

我在DAO代码中有很多这些嵌套的结果集循环,用于从数据库中获取所有内容。因为我在MySQL上并不那么强大,所以这是一个简单的解决方案(我非常很少有时间去做这个程序)...因为我曾经在PHP中做过类似的事。

我不是说这段代码是好的设计,但是为了时间的缘故,我真的目前并不关心良好的课堂设计。因此,无论设计选择多么糟糕,您都会想到任何解决方案。

另一个解决方案是将所有内容拆分为单循环,因为这样可以工作(非常简单)。但这意味着修改了很多代码,我宁愿将其作为备份计划。

2 个答案:

答案 0 :(得分:4)

您不能像这样交错结果集,请参阅API documentation

  

默认情况下,每个Statement对象只能打开一个ResultSet对象   同时。因此,如果读取一个ResultSet对象是   与另一个的读取交错,每个必须已经生成   通过不同的Statement对象。 Statement中的所有执行方法   如果是,接口隐式关闭一个statment的当前ResultSet对象   打开一个。

如果你为不同的查询创建单独的语句,我认为你会好的。我见过的通常做法是为每个查询都有一个单独的DAO方法,以使DAO方法尽可能简单和可重用。 (这意味着DAO不负责事务划分,但是更高级别的组件,如服务,控制着事务中的内容。)

答案 1 :(得分:0)

要解决您的问题 - 请勿将嵌套循环的值分配给同一ResultSet