Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodichka_Po_Tp.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.44 Mб
Скачать

1.4 Посылка параметризированных и частовыполняемых sql-запросов

Интерфейс java.sql.Statement следует использовать, если запрос SQL является статичным. А для параметризованных запросов SQL или часто выполняемых запросов следует использовать интерфейс java.sql.PreparedStatement. В том случае, когда используется интерфейс PreparedStatement, имеется возможность выполнить предкомпиляцию операторов SQL и привязать план доступа к конкретной базе данных. Интерфейс PreparedStatement содержит методы установки значений параметров до выполнения. Это дает возможность многократно выполнять предварительно скомпилированные операторы SQL с разными значениями параметров, что может привести к существенному повышению производительности, в особенности при сложных запросах.

Чтобы проиллюстрировать указанные выше различные методы, допустим, что имеется приложение, используемое для отображения данных служащего (фамилию, имя, оклад) по номеру его социального страхования. Это можно осуществить с использованием интерфейса Statement или PreparedStatement. В приведенном ниже коде показано непосредственное выполнение операторов SQL с помощью интерфейса Statement:

// пусть txtSSN - это ссылка на поле ввода класса java.awt.TextField, который воспринимает

// номер социального страхования в качестве вводимых пользователем данных

String sqlQuery="select LAST, FIRST, SALARY from PAYROLL where SSN="+txtSSN.getText();

// текст запроса

java.sql.Statement stmt=conn.createStatement();

// создание запроса

java.sql.ResultSet rset=stmt.executeQuery(sqlQuery);

// выполнение запроса и получения результата запроса

// использование результата запроса - объекта rset

. . . . . . .

stmt.close();

// освобождение ресурсов запроса

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

// комментарии - аналогичные

String sqlQuery="select LAST, FIRST, SALARY from PAYROLL where SSN=?";

// текст запроса

java.sql.PreparedStatement pstmt=conn.prepareStatement(sqlQuery);

// создание запроса

pstmt.setLong(1,java.lang.Long.parseLong(txtSSN.getText()));

// установка параметра

java.sql.ResultSet rset=pstmt.executeQuery();

// выполнение запроса

// использование результата запроса - объекта rset

. . . . . . .

Интерфейс PreparedStatement позволяет повторно выполнять этот запрос с новым параметром любое число раз, создавая новый набор ResultSet:

pstmt.setLong(1,java.lang.Long.parseLong(txtSSN.getText()));

// установка параметра

java.sql.ResultSet rset=pstmt.executeQuery();

// выполнение запроса

// использование результата запроса - объекта rset

. . . . . . .

Когда запрос pstmt уже не нужен, его следует закрыть, освобождая связанные с ним ресурсы:

pstmt.close(); // освобождение ресурсов запроса

Метод setLong() является одним из методов интерфейса PreparedStatement, используемых для задания значений параметров. Каждый из этих методов воспринимает индекс параметров с отсчетом от единицы и значение параметра. Например, метод setString() воспринимает индекс параметров и класс java.lang.String.

К сожалению, не все драйверы поддерживают все типы данных интерфейса JDBC и не одинаково выполняют подготовленные операторы SQL. Некоторые драйверы могут задержать интерпретацию и установку параметров до тех пор, пока не начнется выполнение запроса. Это позволяет повысить производительность, однако может нарушить обработку исключений по причине задержки активизации некоторых исключений. Например, исключение SQLException может быть активизировано в том случае, если один из методов set() вызывается с типом данных, несовместимым с соответствующим столбцом базы данных. Если интерпретация и установка параметров задержаны, то это же исключение не будет активизировано до тех пор, пока не будет вызван метод executeQuery().

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]