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




Ознакомьтесь с JavaDoc для этих методов. getResultSet может возвращать значение null, но executeQuery никогда не возвращает значение null.
Есть и другие ограничения. Например, executeQuery нельзя вызвать на PreparedStatement или CallableStatement.
Спасибо, Иван. Есть ли разница с точки зрения производительности? Я просмотрел JavaDoc, но это не сильно помогло.
В общем, вам следует использовать 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
Спасибо, Марк. Если вы можете добавить какие-либо различия, связанные с производительностью (если есть), это будет очень полезно.
@PratikKumawat Вряд ли разница в производительности будет, но это будет зависеть от конкретной реализации драйвера, поэтому в целом нельзя ответить со 100% уверенностью. Просто сохраняйте простоту и используйте executeQuery(), если вам действительно не нужно делать что-то еще.
Спасибо, Марк. Но ваш код меня немного смутил. Отличаются ли заявление и stmt? Есть ли максимальное значение, которое возвращает getResultSet ()? Если нет, то почему вы использовали stmt.getMoreResults ();
@PratikKumawat Нет, это я неосознанно переключался между именами переменных в моем коде, я это исправил.
@PratikKumawat Это не имеет ничего общего с «максимальным значением» набора результатов (такого нет). Суть этой обработки в том, что может быть произвольное количество счетчиков обновлений и наборов результатов (в произвольном порядке). Если вы хотите обработать все эти результаты, это то, что вам нужно сделать. Самым распространенным известным мне примером являются хранимые процедуры SQL Server, которые могут производить несколько счетчиков обновлений и несколько наборов результатов из одного вызова хранимой процедуры. Например, SP, который выполняет выбор, обновление и другой выбор, создает набор результатов, счетчик обновлений и другой набор результатов.
@PratikKumawat - Связанный вопрос: Как вернуть все из хранимой процедуры с помощью JDBC
Возможный дубликат executeQuery () и getResultSet () при извлечении данных из вызываемого оператора