关于对ResultSet 中next() 方法的描述及用法是啥啊

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于对ResultSet 中next() 方法的描述及用法是啥啊相关的知识,希望对你有一定的参考价值。

我在做Java练习题时遇到了下面的问题,希望有人能给我解释一边next()方法和ResultSet,谢谢

关于对ResultSet 及next(a) 方法的描述不正确的是
A、 ResultSet 对象将指向当前行的指针指向第一行。
B、 next() 方法使这个指针移向下一行
C、 第一次使用next() 方法将指针指向结果集的第二行
D、 next() 方法的返回值是一个boolean 值
E、 next() 方法返回true,则说明可以对该行进行处理
F、 next() 方法返回false,则说明不可以对该行进行处理

ResultSet是您访问数据库返回的数据表,也就是结果集合,一开始是处于第一行之前,即beforeFirst,第一次使用next()就将指针指向返回结果集的第一行。每使用一次next(),指针就指向下一行,这时候你就可以使用rs.getObject()或者getInt()或者getString()之类的方法返回该行的某一个字段的值,也就是getObject()方法里面的参数可以传递索引(索引由1开始),即如果你的数据库第一列的数据叫id,那你可以用getObject("id")或者getObject(1)得到你的rs目前指着的那一条数据的该列的值。当next()成功的时候其实会返回一个布尔值true,当指针指到最后一行的后面时候,即afterLast()就返回布尔值false。 所以第一次调用next()的时候应该是指向第一行数据。next()在指针指向第一行之前到最后一行之间的返回true的,也就是当你的指针已经指向到最后一行的数据集了,再用一次next()是返回true的,但此时再用一次next()就是false,因为执政已经到最后一行的后面了(也就是afterLast) 参考技术A ResultSet是您访问数据库返回的数据表,也就是结果集合,一开始是处于第一行前,beforeFirst,第一次使用next()就将指针指向返回结果集的第一行。因为用java.sql.Statement的executequery()方法查询的结果集永远不会返回null,可以用rs.next()方法来判断有没结果集,因为一个结果集最初将游标定位在第一行的前面。而不用rs==null,这样没有效果。
现在详细解说一下resultset的next()方法,每调用一次,游标后移一个,当resultset游动到最后一行,再调用next()方法会返回false,并且游标也到了最后一行的后面。
ResultSet 对象具有指向其当前数据行的指针。最初,指针被置于第一行之前。next 方法将指针移动到下一行;因为该方法在 ResultSet 对象中没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。默认的 ResultSet 对象不可更新,仅有一个向前移动的指针。因此,只能迭代它一次,并且只能按从第一行到最后一行的顺序进行。可以生成可滚动和/或可更新的 ResultSet 对象。

Mockito - 模拟ResultSet

这是我的测试方法以及测试代码。我测试的方法取决于runExecuteQueryStatement生成的结果集。如果resultSet为null且resultSet.next为false,则当resultSet.next返回某个内容时,它将返回0 else,然后它将返回1.这就是我模拟ResultSet,ResultSet.next()的原因。但我仍然得到0作为回报值。任何帮助都感激不尽。谢谢

Method Under Test

int result = 0;

    try {
        ResultSet resultSet = runExecuteQueryStatement(dbServerConn, "SELECT 1 AS cnt FROM pg_database WHERE datname ='" + dbName + "';");
        while (resultSet.next()) {
            result = resultSet.getInt("cnt");
        }
    }catch(Exception ex) {
        logger.error(ex.getMessage());
    }

    return result;

Dependent Method Code (runExecuteQueryStatement)

ResultSet resultSet = null;
    Connection conn = getConnection(dbServerConn);
    Statement stmt = conn.createStatement();
    resultSet = stmt.executeQuery(sqlStatement);

    return resultSet;

Test Code

PostgresDatabaseManager pgManagerMock = Mockito.mock(PostgresDatabaseManager.class);
    DbConnection dbConnectionMock = Mockito.mock(DbConnection.class);

    String sqlStatementMock = SOME_STRING;

    ResultSet resultSetMock = Mockito.mock(ResultSet.class);
    Mockito.when(resultSetMock.next()).thenReturn(TRUE).thenReturn(FALSE);
    Mockito.when(resultSetMock.getInt("cnt")).thenReturn(1);

    Mockito.when(pgManagerMock.runExecuteQueryStatement(dbConnectionMock, sqlStatementMock)).thenReturn(resultSetMock);

    Mockito.when(pgManagerMock.runExecuteQueryStatementWrapperForCheckDBExists(dbConnectionMock, sqlStatementMock)).thenCallRealMethod();

    int actualResult = pgManagerMock.runExecuteQueryStatementWrapperForCheckDBExists(dbConnectionMock, sqlStatementMock);

    int expectedResult = 1;

    Assert.assertEquals(expectedResult, actualResult);
答案

参数匹配是问题所在。依赖方法runExecuteQueryStatement有2个参数,其中一个是对象,另一个是字符串。可以模拟对象,其中字符串是硬编码的。但是在实现中,我传递了一个不同的字符串作为同一方法的参数,因此存根不起作用。我们应该通过Matchers.anyString()进行参数匹配,而不是在存根中对字符串值进行硬编码。当我们使用Matchers进行方法的参数匹配时。关于该方法的所有论据都应该是Matchers。因此,存根工作具有所有不同的参数值。

Mockito.when(pgManagerMock.runExecuteQueryStatement(Matchers.anyObject(), Matchers.anyString())).thenReturn(resultSetMock);

以上是关于关于对ResultSet 中next() 方法的描述及用法是啥啊的主要内容,如果未能解决你的问题,请参考以下文章

ResultSet next方法

关于resultset 的deleteRow方法报无效的游标位置的错误

iterator接口的hasnext方法、next方法和ResultSet结果集的next方法的区别

java.sql.SQLException: 关闭的 Resultset: next

JDBC ResultSet 方法 next() 需要 30 秒来获取 12000 行

jsp中rt.next()指的是啥?还有rs.next()与rt.next()有啥区别?一直不太清楚