Как проверить, ссорится ли набор результатов или больше?

Как проверить, ссорится ли набор результатов или больше с JDBC?

23
задан bluish 18 November 2011 в 09:12
поделиться

4 ответа

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");
boolean isMoreThanOneRow = rs.first() && rs.next();

Вы не спрашивали об этом, но он может вам понадобиться:

boolean isEmpty = ! rs.first();

Обычно нам не нужен счетчик строк, потому что мы используем цикл WHILE для итерации по набору результатов вместо цикла FOR:

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");
while (rs.next()) {
    // retrieve and print the values for the current row
    int i = rs.getInt("a");
    String s = rs.getString("b");
    float f = rs.getFloat("c");
    System.out.println("ROW = " + i + " " + s + " " + f);
}

Однако в некоторых случаях вам может потребоваться окно результатов, и вам нужно заранее подсчитать количество записей, чтобы отобразить пользователю что-то вроде Строки с 1 по 10 из 100 . Вы можете выполнить отдельный запрос с помощью SELECT COUNT (*) сначала, чтобы получить количество записей, но обратите внимание, что это количество является только приблизительным, поскольку строки могут быть добавлены или удалены между временем, необходимым для выполнения два запроса.

Пример из ResultSet Overview

29
ответ дан 29 November 2019 в 02:48
поделиться

Мое простое предложение: выберите первую строку результатов, а затем попробуйте получить следующую. Если попытка успешна, у вас будет более одной строки.

Если имеется более одной строки, и вы хотите обработать эти данные, вам нужно либо кэшировать данные из первой строки, либо использовать прокручиваемый набор результатов, чтобы вы могли вернуться к началу, прежде чем переходить к полученные результаты.

Вы также можете напрямую запросить эту информацию в SQL, выполнив SELECT COUNT (*) в остальной части вашего запроса; результат будет 0, 1 или более в зависимости от того, сколько строк вернет остальная часть запроса. Это довольно легко реализовать, но включает два запроса к БД, если вы захотите прочитать и обработать фактический запрос следующим.

0
ответ дан 29 November 2019 в 02:48
поделиться

Есть много вариантов, и, поскольку вы не предоставляете больше контекста, остается только догадываться. Мои ответы отсортированы по возрастанию сложности и производительности.

  1. Просто запустите select count (1) FROM ... и получите ответ. Вам придется выполнить другой запрос, который фактически выбирает и возвращает данные.
  2. Итерируйте с помощью rs.next () и считайте, пока не будете довольны. Затем, если вам все еще нужны фактические данные, повторно запустите тот же запрос.
  3. Если ваш драйвер поддерживает обратную итерацию, выполните пару раз rs.next () , а затем вернитесь назад с помощью rs.previous () .
1
ответ дан 29 November 2019 в 02:48
поделиться

Для этого вам не нужен JDBC. Нормальной идиомой является сбор всех результатов в коллекцию и использование методов коллекции, таких как List#size().

List<Item> items = itemDAO.list();

if (items.isEmpty()) {
    // It is empty!
if (items.size() == 1) {
    // It has only one row!
} else {
    // It has more than one row!
}

где метод list() выглядит примерно так:

public List<Item> list() throws SQLException {
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;
    List<Item> items = new ArrayList<Item>();

    try {
        connection = database.getConnection();
        statement = connection.createStatement();
        resultSet = statement.executeQuery(SQL_LIST);
        while (resultSet.next()) {
            Item item = new Item();
            item.setId(resultSet.getLong("id"));
            item.setName(resultSet.getString("name"));
            // ...
            items.add(item);
        }
    } finally {
        if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
        if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
        if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
    }

    return items;
}
1
ответ дан 29 November 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: