Перейти к основному содержимому

Подготовленные операторы

Начиная с версии 1.5.0, Selena предоставляет подготовленные операторы для многократного выполнения SQL-операторов с одинаковой структурой, но разными переменными. Эта функция значительно повышает эффективность выполнения и предотвращает SQL-инъекции.

Описание

Подготовленные операторы работают следующим образом:

  1. Подготовка: Пользователи подготавливают SQL-оператор, где переменные представлены заполнителями ?. FE анализирует SQL-оператор и генерирует план выполнения.
  2. Выполнение: После объявления переменных пользователи передают эти переменные в оператор и выполняют его. Пользователи могут выполнять один и тот же оператор несколько раз с разными переменными.

Преимущества

  • Экономия накладных расходов на парсинг: В реальных бизнес-сценариях приложение часто выполняет оператор несколько раз с одинаковой структурой, но разными переменными. При поддержке подготовленных операторов Selena нужно анализировать оператор только один раз на этапе подготовки. Последующие выполнения того же оператора с разными переменными могут напрямую использовать предварительно сгенерированный результат анализа. Таким образом, производительность выполнения операторов значительно улучшается, особенно для сложных запросов.
  • Предотвращение атак SQL-инъекций: Разделяя оператор от переменных и передавая пользовательские данные как параметры, а не напрямую объединяя переменные в оператор, Selena может предотвратить выполнение злонамеренными пользователями вредоносного SQL-кода.

Использование

Подготовленные операторы действуют только в текущей сессии и не могут использоваться в других сессиях. После выхода из текущей сессии подготовленные операторы, созданные в этой сессии, автоматически удаляются.

Синтаксис

Выполнение подготовленного оператора состоит из следующих фаз:

  • PREPARE: Подготовка оператора, где переменные представлены заполнителями ?.
  • SET: Объявление переменных в операторе.
  • EXECUTE: Передача объявленных переменных в оператор и его выполнение.
  • DROP PREPARE или DEALLOCATE PREPARE: Удаление подготовленного оператора.

PREPARE

Синтаксис:

PREPARE <stmt_name> FROM <preparable_stmt>

Параметры:

  • stmt_name: имя, присваиваемое подготовленному оператору, которое впоследствии используется для выполнения или освобождения этого подготовленного оператора. Имя должно быть уникальным в рамках одной сессии.
  • preparable_stmt: SQL-оператор для подготовки, где заполнитель для переменных — это знак вопроса (?). В настоящее время поддерживается только оператор SELECT.

Пример:

Подготовка оператора SELECT с конкретными значениями, представленными заполнителями ?.

PREPARE select_by_id_stmt FROM 'SELECT * FROM users WHERE id = ?';

SET

Синтаксис:

SET @var_name = expr [, ...];

Параметры:

  • var_name: имя пользовательской переменной.
  • expr: пользовательская переменная.

Пример: Объявление переменных.

SET @id1 = 1, @id2 = 2;

Для получения дополнительной информации см. пользовательские переменные.

EXECUTE

Синтаксис:

EXECUTE <stmt_name> [USING @var_name [, @var_name] ...]

Параметры:

  • var_name: имя переменной, объявленной в операторе SET.
  • stmt_name: имя подготовленного оператора.

Пример:

Передача переменных в оператор SELECT и выполнение этого оператора.

EXECUTE select_by_id_stmt USING @id1;

DROP PREPARE или DEALLOCATE PREPARE

Синтаксис:

{DEALLOCATE | DROP} PREPARE <stmt_name>

Параметры:

  • stmt_name: Имя подготовленного оператора.

Пример:

Удаление подготовленного оператора.

DROP PREPARE select_by_id_stmt;

Примеры

Использование подготовленных операторов

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

Предполагая, что следующая база данных с именем demo и таблица с именем users уже созданы:

CREATE DATABASE IF NOT EXISTS demo;
USE demo;
CREATE TABLE users (
id BIGINT NOT NULL,
country STRING,
city STRING,
revenue BIGINT
)
PRIMARY KEY (id)
DISTRIBUTED BY HASH(id);
  1. Подготовка операторов для выполнения.

    PREPARE select_all_stmt FROM 'SELECT * FROM users';
    PREPARE select_by_id_stmt FROM 'SELECT * FROM users WHERE id = ?';
  2. Объявление переменных в этих операторах.

    SET @id1 = 1, @id2 = 2;
  3. Использование объявленных переменных для выполнения операторов.

    -- Запрос всех данных из таблицы.
    EXECUTE select_all_stmt;

    -- Запрос данных с ID 1 или 2 отдельно.
    EXECUTE select_by_id_stmt USING @id1;
    EXECUTE select_by_id_stmt USING @id2;

Использование подготовленных операторов в Java-приложении

Следующий пример демонстрирует, как Java-приложение может использовать JDBC-драйвер для вставки, удаления, обновления и запроса данных из таблицы Selena:

  1. При указании URL подключения к Selena в JDBC необходимо включить серверные подготовленные операторы:

    jdbc:mysql://<fe_ip>:<fe_query_port>/useServerPrepStmts=true
  2. Проект Selena на GitHub предоставляет пример Java-кода, который объясняет, как вставлять, удалять, обновлять и запрашивать данные из таблицы Selena через JDBC-драйвер.