Выполнение нескольких SQL-запросов в JDBC одной строкой

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для ускорения выполнения множества запросов в Java можно воспользоваться пакетной обработкой. В этом случае пригодятся методы addBatch() и executeBatch(). Ниже представлен пример использования PreparedStatement для вставки большого объема данных:

Java
Скопировать код
PreparedStatement ps = connection.prepareStatement("INSERT INTO myTable VALUES (?, ?)");

ps.setString(1, "Value1");
ps.setString(2, "Value2");
ps.addBatch();

ps.setString(1, "Value3");
ps.setString(2, "Value4");
ps.addBatch();

int[] results = ps.executeBatch();

Обратите внимание: пакетная обработка идеально подходит для DML-операций, таких как INSERT, UPDATE и DELETE. В случае же смешанных запросов в строке подключения стоит указать параметр allowMultiQueries=true. Для этих целей лучше использовать класс Statement:

Java
Скопировать код
Statement stmt = connection.createStatement();
String query = "SELECT * FROM myTable; INSERT INTO myTable VALUES (5, 'Value5');";
boolean hasResults = stmt.execute(query);

Не забудьте тщательно обработать полученные от запросов данные.

Кинга Идем в IT: пошаговый план для смены профессии

Перебор результатов с помощью циклов

Совместное использование execute()

Метод execute() – это незаменимый инструмент при работе с комбинированными запросами. Он способен обрабатывать как результаты выборки, так и сведения об обновлениях:

Java
Скопировать код
boolean isResultSet = stmt.execute(query);
while (true) {
    if (isResultSet) {
        ResultSet rs = stmt.getResultSet();
        // Обрабатываются результаты выборки
    } else {
        if (stmt.getUpdateCount() == -1) {
            break; // Окончание обработки результатов
        }
        // Обрабатывается количество обновлений
    }
    isResultSet = stmt.getMoreResults();
}

Получение множества ResultSet

Цепочка ResultSet'ов, которые возвращаются одной хранимой процедурой, требует специального подхода:

Java
Скопировать код
CallableStatement callableStatement = connection.prepareCall("{call sp_return_multiple_cursors()}");
boolean results = callableStatement.execute();
int resultSetCount = 0;

while (results) {
    ResultSet rs = callableStatement.getResultSet();

    while (rs.next()) {
        // Вытаскиваются данные из ResultSet
    }

    resultSetCount++;
    results = callableStatement.getMoreResults();
}

Примечание: перед использованием проверьте совместимость функционала подключения с вашей СУБД.

Можно попасть впросак, если...

Некорректно настроено подключение

Неправильно указанные параметры подключения к БД могут привести к выдаче некорректных запросов. В строке подключения нужно указать параметр allowMultiQueries=true:

plaintext
Скопировать код
jdbc:mysql://localhost:3306/mydb?allowMultiQueries=true

Пакетная обработка vs несколько форматов запросов

Пакетная обработка подходит для массовых DML-операций и улучшает производительность, однако не для смешивания разных типов запросов, например SELECT и INSERT. Использование DDL-запросов в пакетной обработке тоже не рекомендуется.

Несоблюдение целостности транзакций

При выполнении нескольких DML-операций рекомендуется работать с транзакциями:

Java
Скопировать код
connection.setAutoCommit(false);

try {
    // Выполнение нескольких запросов
    connection.commit();
} catch (SQLException sqle) {
    connection.rollback();  // Откат в случае ошибки
    // Обработка исключения
}

connection.setAutoCommit(true);

Визуализация

Можно привести пример приготовления ужина и выполнения SQL-запросов:

Markdown
Скопировать код
👨‍🍳: "Сегодня я приготовлю салат, суп и торт!"

Ключевую важность имеет синхронизация этапов, как при работе с приготовлением ужина, так и при выполнении SQL-запросов:

Markdown
Скопировать код
👩‍🍳👨‍🍳🍳: 
1. 🥗: Подготовка -> Смешивание -> Заправка
2. 🍲: Обжарка -> Варка -> Тушение
3. 🍰: Смешивание -> Выпечка -> Украшение

Точность кода и синтаксиса

Синтаксис: на внимательность лучше не рассчитывать

Нужно быть точным при записи SQL-запросов. Незначительная ошибка может привести к серьёзной проблеме.

Тестирование: на все сто смело полагаться!

Тщательное тестирование кода помощь избежать непредвиденных ошибок.

Транзакции и ResultSet

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

Полезные материалы

  1. Пакетная обработка в JDBC.
  2. Обсуждение выполнения нескольких запросов в Java.
  3. Руководство по работе с SQL-запросами через JDBC от Oracle.
  4. Заявление MySQL о подготовленных выражениях.
  5. Детальное руководство по работе с транзакциями в JDBC.