【问题标题】:Cannot create ArrayList with ResultSet无法使用 ResultSet 创建 ArrayList
【发布时间】:2019-10-12 08:30:21
【问题描述】:

我正在尝试基于 ResultSet 创建一个 ArrayList。使用 while 循环遍历所有行,我只能获得第一行(使用 rs.next() 和 rs.first())以及最后一行(rs.last())。

public ArrayList retrieveFromDb(Statement myStmt){    

    try{
        ArrayList<String> inner = new ArrayList<>();
        String query = "SELECT * FROM product";
        ResultSet rs = myStmt.executeQuery(query);

        while(rs.next()){
            System.out.println(rs.getString("barcode"));
            inner.add(rs.getString("barcode"));
            System.out.println("done");

        return inner;
        }

    } catch (SQLException ex) {
        Logger.getLogger(Product.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}

我需要的是 ArrayList 从所有行中获取信息。

更新:看起来我未能正确返回列表,因为太早返回它(如下面的答案中指出的那样。)

【问题讨论】:

  • Resultset To List的可能重复
  • 您已将 return 内部语句放在 while 循环中。将 return 语句放在 while 循环之外并尝试。
  • 您好@FranciscoMateo,感谢您抽出宝贵时间阅读我的问题。不幸的是,可能的重复并没有帮助我。如果我错过了什么,请告诉我。
  • 可能的重复对我没有帮助。然后解释为什么会这样。

标签: java mysql arraylist resultset


【解决方案1】:

您返回列表太早了。将您的 return 语句移到末尾。

重读 Oracle 教程,Retrieving and Modifying Values from Result Sets

另外,close your result set 使用完毕后。

我们可以将您返回的列表设为更通用的List,而不是ArrayList,更具体的类型为String

public List< String > retrieveFromDb( Statement myStmt ){    
    ArrayList<String> list = new ArrayList<>() ;

    try{
        String query = "SELECT * FROM product ;" ;
        ResultSet rs = myStmt.executeQuery( query ) ;

        while( rs.next() ){  // Looping the rows of the result set: first row, second row, third, fourth, and so on.
            String barcode = rs.getString( "barcode" ) ;
            list.add( rs.getString( "barcode" ) );
        }

    } catch (SQLException ex) {
        Logger.getLogger(Product.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        if( Objects.nonNull( rs ) ) {
            rs.close() ;  // <--- Best to close your result set when done.
        }
    }

    return list ;
}

更好的是,使用try-with-resources 自动关闭您的结果集。

public List< String > retrieveFromDb( Statement myStmt ){    
    ArrayList<String> list = new ArrayList<>() ;
    String query = "SELECT * FROM product ;" ;

    try (
        ResultSet rs = myStmt.executeQuery( query ) ;
    )
    {
        while( rs.next() ){  // Looping the rows of the result set: first row, second row, third, fourth, and so on.
            String barcode = rs.getString( "barcode" ) ;
            list.add( rs.getString( "barcode" ) );
        }

    } catch (SQLException ex) {
        Logger.getLogger(Product.class.getName()).log(Level.SEVERE, null, ex);
    }

    return list ;
}

提示:我建议始终使用分号正确终止您的 SQL 语句。没有它你可能会侥幸逃脱,但从长远来看,养成习惯可以防止出现问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2021-11-12
    相关资源
    最近更新 更多