Что такое CallableStatement в JDBC?

«Что такое CallableStatement в JDBC?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

CallableStatement — это интерфейс в JDBC API, предназначенный для выполнения хранимых процедур и функций, вызываемых из базы данных. Он наследует от PreparedStatement и поддерживает параметры типов IN (входные), OUT (выходные) и INOUT (входо-выходные).

Пример вызова хранимой процедуры с OUT-параметром:

// Предположим, есть процедура: CREATE PROCEDURE get_employee_name(IN emp_id INT, OUT emp_name VARCHAR(100))
String sql = "{call get_employee_name(?, ?)}"; // Синтаксис вызова процедуры

try (Connection conn = dataSource.getConnection();
     CallableStatement stmt = conn.prepareCall(sql)) {

    // Установка IN-параметра
    stmt.setInt(1, 123);

    // Регистрация OUT-параметра (указание его типа)
    stmt.registerOutParameter(2, Types.VARCHAR);

    // Выполнение процедуры
    stmt.execute();

    // Получение значения OUT-параметра после выполнения
    String employeeName = stmt.getString(2);
    System.out.println("Employee name: " + employeeName);

} catch (SQLException e) {
    e.printStackTrace();
}

Основные особенности и преимущества:

  • Производительность: Хранимые процедуры часто выполняются быстрее, так как компилируются и кэшируются на стороне СУБД.
  • Бизнес-логика на стороне БД: Позволяет инкапсулировать сложную логику работы с данными внутри базы.
  • Безопасность: Может помочь предотвратить SQL-инъекции и предоставить более строгий контроль доступа.
  • Работа с REF CURSOR: Поддерживает возврат результирующих наборов через курсоры.
  • Множественные результаты: Может возвращать несколько результирующих наборов (используется stmt.getMoreResults()).