Невозможно создать ArrayList с ResultSet - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь создать ArrayList на основе ResultSet.Используя цикл 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 Ответ

4 голосов
/ 26 мая 2019

Вы возвращаете свой список слишком рано. Переместите return оператор в конец.

Перечитайте руководство по Oracle, Извлечение и изменение значений из наборов результатов .

Кроме того, закройте ваш набор результатов , когда закончите его использовать.

Мы можем сделать ваш возвращаемый список более общим 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 точкой с запятой. Вы можете обойтись без него, но, сделав это привычкой, вы сможете избежать проблем в долгосрочной перспективе.

...