ExecuteQuery () против getResultSet () в Java

В чем разница между statement.executeQuery и statement.getResultSet(). Я считаю, что оба вернут ResultSet для оператора выбора, но есть ли какие-то конкретные критерии, когда мы должны использовать какие из них.

@EmreAcar Возможный дубликат отвечает на разницу между execute, executeUpdate и executeQuery. Меня больше интересует разница между executeQuery и getResultSet, поскольку оба возвращают одно и то же (набор результатов).

Pratik Kumawat 08.10.2018 12:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
2
4 531
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ознакомьтесь с JavaDoc для этих методов. getResultSet может возвращать значение null, но executeQuery никогда не возвращает значение null.

Есть и другие ограничения. Например, executeQuery нельзя вызвать на PreparedStatement или CallableStatement.

Спасибо, Иван. Есть ли разница с точки зрения производительности? Я просмотрел JavaDoc, но это не сильно помогло.

Pratik Kumawat 08.10.2018 12:37
Ответ принят как подходящий

В общем, вам следует использовать executeQuery, если вы знаете, что выполняете оператор выбора. Сам по себе метод getResultSet()не выполняет заявление.

getResultSet предназначен для использования в сочетании с execute. Методы execute предназначены для использования с неизвестными типами операторов или операторами, которые могут давать несколько результатов (то есть 0 или более счетчиков обновлений или наборов результатов).

Вкратце: обычно вы должны использовать executeQuery.

Простой пример, когда вы должны использовать execute, если код не знает, какой запрос он будет выполнять (обновление, запрос или что-то более сложное), например, при выполнении запросов, предоставленных пользователем.

Другой пример - хранимые процедуры SQL Server, которые могут возвращать несколько счетчиков обновлений и наборов результатов.

Общий способ обработки результата execute:

boolean isResultSet = statement.execute(sql);
while (true) {
    if (isResultSet) {
        try (ResultSet rs = statement.getResultSet()) {
            // do something with result set
        }
    } else {
        int updateCount = statement.getUpdateCount();
        if (updateCount == -1) {
            // -1 signals no more results
            break;
        }
        // do something with update count
    }
    // move to next result
    isResultSet = statement.getMoreResults();
}

Это гарантирует, что все результаты * будут обработаны.

*: This example ignores exception results for systems (like SQL Server) that allow multiple exceptions to be interleaved with result sets and update counts, see How to get *everything* back from a stored procedure using JDBC for a more thorough example

Спасибо, Марк. Если вы можете добавить какие-либо различия, связанные с производительностью (если есть), это будет очень полезно.

Pratik Kumawat 08.10.2018 12:48

@PratikKumawat Вряд ли разница в производительности будет, но это будет зависеть от конкретной реализации драйвера, поэтому в целом нельзя ответить со 100% уверенностью. Просто сохраняйте простоту и используйте executeQuery(), если вам действительно не нужно делать что-то еще.

Mark Rotteveel 08.10.2018 12:53

Спасибо, Марк. Но ваш код меня немного смутил. Отличаются ли заявление и stmt? Есть ли максимальное значение, которое возвращает getResultSet ()? Если нет, то почему вы использовали stmt.getMoreResults ();

Pratik Kumawat 08.10.2018 13:21

@PratikKumawat Нет, это я неосознанно переключался между именами переменных в моем коде, я это исправил.

Mark Rotteveel 08.10.2018 13:24

@PratikKumawat Это не имеет ничего общего с «максимальным значением» набора результатов (такого нет). Суть этой обработки в том, что может быть произвольное количество счетчиков обновлений и наборов результатов (в произвольном порядке). Если вы хотите обработать все эти результаты, это то, что вам нужно сделать. Самым распространенным известным мне примером являются хранимые процедуры SQL Server, которые могут производить несколько счетчиков обновлений и несколько наборов результатов из одного вызова хранимой процедуры. Например, SP, который выполняет выбор, обновление и другой выбор, создает набор результатов, счетчик обновлений и другой набор результатов.

Mark Rotteveel 08.10.2018 13:29

@PratikKumawat - Связанный вопрос: Как вернуть все из хранимой процедуры с помощью JDBC

Gord Thompson 08.10.2018 15:18

Другие вопросы по теме