无法使用ResultSet创建ArrayList

时间:2019-05-26 14:59:23

标签: java mysql arraylist resultset

我正在尝试基于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从所有行中获取信息。

更新:看来我无法通过过早返回列表来正确返回列表(如下面的答案所指出。)

1 个答案:

答案 0 :(得分:4)

您返回列表的时间过早。将您的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语句。如果没有它,您可能会逃脱,但是养成一个习惯,从长远来看可以防止问题。