Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Запись в файл 2 страница




Приведем сначала листинг исходного текста сервлета, а затем рассмотрим его более подробно (мы не станем детально описывать теги HTML, которые сервлет вставляет в генерируемую страницу, – обратитесь самостоятельно к документации по этому языку).

/*------------- Пример 1. Файл example.java -------------*/

package examples; // пакет для сервлета-примера

// способы вызова клиентом класса example.example через строку адреса окна браузера

// http://avanta.vvsu.ru/servlets/examples.example?name=Имя&group=Группа

// http://avanta.vvsu.ru/servlets/examples.example?name=Имя

// http://avanta.vvsu.ru/servlets/examples.example?group=Группа

// http://avanta.vvsu.ru/servlets/examples.example

// предполагается, что сервлет находится в директории сервлетов на WWW-сервере avanta.vvsu.ru

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

// класс example пакета examples

public class example extends HttpServlet // класс example пакета examples

{

public void doGet (HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException

{

// получение значения параметра имени, передаваемое через параметры

String NAME=request.getParameter("name");

if(NAME==null) NAME="Имя не задано"; // параметр отсутствует в списке

else

{

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

NAME=new String(NAME.getBytes(),"windows-1251");

}

// получение значения параметра группы, передаваемое через параметры

String GROUP=request.getParameter("group");

if(GROUP==null) GROUP="Группа не задана"; // параметр отсутствует в списке

else

{

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

GROUP=new String(GROUP.getBytes(),"windows-1251");

}

// передача типа генерируемого сервлетом содержимого

response.setContentType("text/html; charset=windows-1251");

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

Writer out=new BufferedWriter(new

OutputStreamWriter(response.getOutputStream(),"Cp1251")); // начало формирования результата в формате html-файла

out.write("<HTML>\n"); // html-тег начала файла

out.write("<HEAD><TITLE>Пример сервлета</TITLE></HEAD>\n"); // html-тег заголовка файла

out.write("<body>\n"); // html-тег начала содержимого

// формирование содержимого

out.write("<p>\n"); // html-тег начала абзаца

out.write("<font size=\"+1\" color=\"Black\">Введено имя: </font>\n"); // вывод простого текста некоторым шрифтом

out.write("<font size=\"+1\" color=\"Red\">"+NAME+"</font>\n"); // вывод простого текста некоторым шрифтом

out.write("</p>\n"); // html-тег завершения абзаца

out.write("<p>\n"); // html-тег начала абзаца

out.write("<font size=\"+1\" color=\"Black\">Введена группа: </font>\n"); // вывод простого текста некоторым шрифтом

out.write("<font size=\"+1\" color=\"Red\">"+GROUP+"</font>\n"); // вывод простого текста некоторым шрифтом

out.write("</p>\n"); // html-тег завершения абзаца

// завершение формирования результата

out.write("</body>\n"); // html-тег завершения содержимого

out.write("</html>\n"); // html-тег завершения файла

// закрытие поток вывода

out.flush(); out.close();

return;

}

}

/*-----------------------------------------------------------------------------------------*/

Начнем с того, что опишем класс сервлета, наследующий HttpServlet, и импортируем необходимые классы. После чего займемся методом doGet – главной частью сервлета:

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class example extends HttpServlet

{

public void doGet (HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException

{

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

String NAME=request.getParameter("name");

if(NAME==null) NAME="Имя не задано";

else {

NAME=new String(NAME.getBytes(),"windows-1251");

}

String GROUP=request.getParameter("group");

if(GROUP==null) GROUP="Группа не задана";

else

{

GROUP=new String(GROUP.getBytes(),"windows-1251");

}

После чего методом setContentType серверу сообщается, что возвращаемые данные – страница HTML (MIME-тип «text/html»). Если этого не сделать, то сервер решит, что вы посылаете обычный текст:

response.setContentType("text/html; charset=windows-1251");

Методом getWriter сервлет получает доступ к потоку вывода, через который серверу посылается результат:

Writer out=new BufferedWriter(new

OutputStreamWriter(response.getOutputStream(),"Cp1251"));

Далее генерируем детали стандартного заголовка Web-страницы. Генерируемое содержание Web-страницы отправляется клиенту при помощи выходного потока и его метода write:

out.write("<HTML>\n");

out.write("<HEAD><TITLE>

Пример сервлета </TITLE></HEAD>\n");

Затем сервлет выводит основную часть содержимого Web-страницы. В нашем случае просто происходит генерация двух абзацев текста, в которых выводятся значения полученных сервлетом параметров:

out.write("<p>\n");

out.write("<font size=\"+1\" color=\"Black\">Введено имя: </font>\n");

out.write("<font size=\"+1\" color=\"Red\">"+NAME+"</font>\n");

out.write("</p>\n");

out.write("<p>\n");

out.write("<font size=\"+1\" color=\"Black\">Введена группа: </font>\n");

out.write("<font size=\"+1\" color=\"Red\">"+GROUP+"</font>\n");

out.write("</p>\n");

Завершается вывод генерацией стандартного окончания HTML-страницы:

out.write("</body>\n");

out.write("</html>\n");

Перед завершением метода следует отправить содержимое потока вывода клиенту и закрыть этот поток:

out.flush(); out.close();

return;

}

}

Отлаживать подобного рода сервлеты не просто, а очень просто. Необходимо скопировать class-файл это сервлета в подкаталог example каталога сервлетов Web-сервера, затем строке адреса окна браузера на клиентском месте набрать URL сервлета (например, http://avanta.vvsu.ru/servlets/examples.example?name=Иванов&group=Гр.-123)и нажать Enter — и все ваши ошибки сразу же становятся видны.

5. Сервлет, обрабатывающий запросы на основе методов CET и POST

Приведем пример сервлета example_form (пример 2), запрос на который можно делать не только методом GET при помощи универсального запроса ресурса по его универсальному адресу URL, но и методом POST, с помощью которого на сервер передаются данные, введенные пользователем в поля интерактивных Web-страниц. В этом сервлете при запросе его методом GET (через ссылку на его URL) - генерируется некая форма, данные из которой затем методом POST отправляются на Web-сервер для обработки этим же сервлетом:

Приведем только листинг исходного текста сервлета, он достаточно ясен для понимания и без подробного объяснения:

 

 

/*------------- Пример 2. Файл example_form.java -------------*/

package examples; // пакет для сервлета-примера

// способ вызова клиентом класса example.example_form через строку адреса окна браузера (методом GET)

// http://avanta.vvsu.ru/servlets/examples.example_form

// способ вызова Web-сервером класса example.example_form для обработки данных интерактивной формы, передаваемых методом POST

// http://avanta.vvsu.ru/servlets/examples.example_form?name=Имя&pwd=Пароль&pwd1=ПодтверждениеПароля

// предполагается, что сервлет находится в директории сервлетов на WWW-сервере avanta.vvsu.ru

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class example_form extends HttpServlet

{

// -------------------------------------------------------------------------------------------------------

public void doGet (HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException

{

// передача типа генерируемого сервлетом содержимого

response.setContentType("text/html; charset=windows-1251");

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

Writer out=new BufferedWriter(new OutputStreamWriter(response.getOutputStream(),"Cp1251")); // начало формирования результата в формате html-файла

out.write("<HTML><HEAD><TITLE>Пример сервлета</TITLE></HEAD><body>\n");

// формирование содержимого - формы ввода

out.write("<p><font size=\"+1\" color=\"Red\">Регистрация</font></p>\n");

out.write("<form action=\"http://avanta.vvsu.ru/servlets/examples.example_form\" method=\"POST\">\n");

out.write("<table>\n");

out.write("<tr><td>Фамилия:</td><td><input type=\"Text\" name=\"name\"></td></tr>\n");

out.write("<tr><td>Пароль:</td><td><input type=\"Password\" name=\"pwd\"></td></tr>\n");

out.write("<tr><td>Подтверждение пароля:</td><td><input type=\"Password\" name=\"pwd1\"></td></tr>\n");

out.write("</table>\n");

out.write("<input type=\"Submit\" value=\"Отправить данные\">&nbsp;&nbsp;\n");

out.write("<input type=\"Reset\" value=\"Очистить поля\"><p>\n");

out.write("</form>\n");

// завершение формирования результата и закрытие потока

out.write("</body></html>\n");

out.flush(); out.close();

return;

}

// -------------------------------------------------------------------------------------------------------

public void doPost (HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException

{

// получение значения параметра имени, передаваемое через параметры

String NAME=request.getParameter("name");

if(NAME!=null) NAME=new String((NAME.trim()).getBytes(),"windows-1251");

// получение значения параметра пароля, передаваемое через параметры

String PWD=request.getParameter("pwd");

if(PWD!=null) PWD=new String((PWD.trim()).getBytes(),"windows-1251");

// получение значения параметра подтвержденияпароля, передаваемое через параметры

String PWD1=request.getParameter("pwd1");

if(PWD1!=null) PWD1=new String((PWD1.trim()).getBytes(),"windows-1251");

// передача типа генерируемого сервлетом содержимого

response.setContentType("text/html; charset=windows-1251");

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

Writer out=new BufferedWriter(new OutputStreamWriter(response.getOutputStream(),"Cp1251")); // начало формирования результата в формате html-файла

out.write("<HTML><HEAD><TITLE>Пример сервлета</TITLE></HEAD><body>\n");

// формирование содержимого

if(NAME==null||NAME.equals(""))

out.write("<p>Ошибка! Не введено имя... </p><p><a href=\"http://avanta.vvsu.ru/servlets/examples.example_form\">Назад, в заполнение формы</a></p>\n");

else if(PWD==null||PWD.equals(""))

out.write("<p>Ошибка! Не введен пароль... </p><p><a href=\"http://avanta.vvsu.ru/servlets/examples.example_form\">Назад, в заполнение формы</a></p>\n");

else if(PWD1==null||PWD1.equals(""))

out.write("<p>Ошибка! Не введено подтверждение пароля... </p><p><a href=\"http://avanta.vvsu.ru/servlets/examples.example_form\">Назад, в заполнение формы</a></p>\n");

else if(!PWD1.equals(PWD))

out.write("<p>Ошибка! Подтверждение пароля не совпадает с паролем... </p><p><a href=\"http://avanta.vvsu.ru/servlets/examples.example_form\">Назад, в заполнение формы</a></p>\n");

{

// здесь можно сделать какие-либо действия по регистрации пользователя,

// например, сохранение информации о нем в базе данных

//........

// выдача результатов регистрации

out.write("<p><font size=\"+1\" color=\"Red\">Уважаемый "+NAME+", информация о Вас успешно сохранена на сервере.</font></p>\n"); }

// завершение формирования результата и закрытие потока

out.write("</body></html>\n");

out.flush(); out.close();

return;

}

}

/*-------------------------------------------------------------*/

 

6. Сервлет MyselfInfo

Теперь Вам предлагается выполнить самостоятельную практическую работу - создать и проверить сервлет, который выдает клиенту некоторую информацию о Вас. Постарайтесь, чтобы внешний вид генерируемой страницы был достаточно привлекателен для посетителей этой Вашей "домашней странички".

Задания к лабораторной работе

Задание 1. Проверить и объяснить работу сервлетов example и example_form, рассматриваемых в данной главе в качестве примеров и отмеченных курсивом.

Задание 2. Создать сервлет MyselfInfo и объяснить его работу.

Задание 3. Дать ответы на контрольные вопросы.

Контрольные вопросы

1. Что такое сервлеты?

2. Что самое необходимо сделать в первую очередь для создания приложение-сервлета?

3. Какова последовательность работы сервлета? Какие методы какого интерфейса при этом вызываются сервером?

4. Почему метод service сервлета должен быть синхронизирован для работы в многопоточных средах?

5. Какой класс JSDK отвечает за обработку HTTP-запросов?

6. Какие функции выполняет метод service класса HttpServlet? Что должен сделать разработчик для того, чтобы сервлет специальным образом реагировал на HTTP-запрос?

7. При помощи объектов какого класса сервлету передается запрос от клиента? Какую информацию можно узнать с помощью этого класса?

8. С помощью объектов какого класса сервлет пересылает генерируемые им данные клиенту?

 

ЛАБОРАТОРНАЯ РАБОТА № 11

РАБОТА С БАЗАМИ ДАННЫХ, ИСПОЛЬЗОВАНИЕ ИНТЕРФЕЙСА JDBC(2 ЧАСА)

МЕТОДИЧЕСКИЕ УКАЗАНИЯ К ЛАБОРАТОРНОЙ РАБОТЕ

Интерфейс связности баз данных Java JDBC (Java Database Connectivity) представляет

собой прикладной программный интерфейс, реализованный в виде ряда классов и интерфейсов языка Java. Его назначение состоит в том, чтобы предоставить апплетам и приложениям (в частности, сервлетам) возможность взаимодействия с машинами реляционных баз данных независимо от платформы.

Для тех программистов, которые занимались разработкой приложений открытого интерфейса связности баз данных ODBC (Open Database Connectivity), API-интерфейс JDBC может показаться знакомым. Интерфейс JDBC во многих отношениях напоминает ряд объектно-ориентированных оболочек ODBC. Это подобие является не случайным, а неизбежным, поскольку оба интерфейса, ODBC и JDBC, основаны на стандартах X/Open SQL Call Level Interface и ANSI SQL-92 (SQL - Structured Query Language - язык структурированных запросов).

Хотя в основе интерфейсов ODBC и JDBC лежат указанные выше общепринятые стандарты, у них имеются существенные отличия. Так, API-интерфейс ODBC реализован на языке С, тогда как интерфейс JDBC реализован на языке Java. API-интерфейс на основе языка Java дает интерфейсу JDBC существенное преимущество объектно-ориентированного характера. Кроме того, API-интерфейс на основе языка Java обладает преимуществом большей переносимости, поскольку код Java интерпретируется виртуальной машиной во время выполнения, а код С должен быть скомпилирован для конкретной платформы. С другой стороны, большинство собственных интерфейсов систем управления реляционными базами данных RDBMS (Relation Database Management System) создано на основе языка Си в значительной степени опирается на использование указателей, которые отсутствуют в языке Java. В результате многие драйверы JDBC опираются на библиотеки для конкретных платформ, которые служат в качестве моста между реализациями на языке Java и собственной библиотекой конкретной RDBMS.

Для интерфейса JDBC отнюдь не обязательно наличие JDBC-совместимых драйверов. Сопряжение интерфейсов ODBC и JDBC является составной частью пакета разработки программ JDBC SDK компании JavaSoft и позволяет приложениям получать доступ к драйверам ODBC через API-интерфейс JDBC. Это сопряжение фактически служит в качестве драйвера JDBC, преобразуя вызовы интерфейса JDBC в соответствующие вызовы интерфейса ODBC и передавая их для обработки диспетчеру драйверов ODBC. Что же касается интерфейса ODBC, то для него указанное сопряжение является лишь очередным клиентским приложением.

1. Написание апплетов, сервлетов и приложений JDBC

Этот раздел посвящен рассмотрению пакета java.sql, отдельные части которого опираются на классы из пакета JDK. Представленные здесь сведения и примеры основаны на версии 1.1.х пакета JDK и версии 1.2х API-интерфейса Java.

Последующие разделы предназначены для демонстрации использования конкретных классов и интерфейсов JDBC. Обработка исключений в примерах, представленных в этих разделах, опущена, поскольку обработка исключений в интерфейсе JDBC описана отдельно. А пока предполагается, что каждый фрагмент кода включен в блок try.

1.1 Соединение с базой данных

Прежде чем появится возможность установить соединение с RDBMS, необходимо загрузить соответствующий драйвер JDBC. Этот драйвер можно загрузить явным образом с помощью методаforName() класса java.lang.Class. Чтобы загрузить драйвер, передайте этому методу полностью определенное составное имя класса. Например, если используется драйвер Oracle, то загрузить его можно с помощью следующего оператора (при этом пакет классов oracle должен быть установлен на компьютере в директории, доступной виртуальной машине Java для поиска классов):

Class.forName("oracle.jdbc.driver.OracleDriver"); // загрузка драйвера

Есть и другой способ загрузки драйвера. В нем вместо метода Class.forName() используется метод registerDriver() класса DriverManager:

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); // загрузка драйвера

Загруженный тем или иным способом драйвер драйвер становится доступным для диспетчера драйверов, который используется для установления соединения. Соединение его устанавливается методом getConnection(). У метода getConnection() класса DriveManager имеются три формы, причем каждая форма возвращает интерфейс Connection (реализованный драйвером) и воспринимает URL (универсальный локатор ресурсов) в качестве первого аргумента формы:

jdbc:subprotocol:subname

Об использовании имени драйвера, URL и конкретной формы методаgetConnection() см. документацию на соответствующий драйвер. Для большинства драйверов JDBC требуются дополнительные свойства соединения, предназначенные для определения конкретного экземпляра базы данных, к которому осуществляется доступ, обеспечения опознавания, установки параметров сеанса и т.д. Например, в большинстве драйверов Oracle требуется наличие строки подключения SQL*Net, имени пользователя и пароля. Приведем пример установки соединения с базой данных:

java.sql.Connection conn =DriverManager.getConnection

("jdbc:oracle:thin:@uran:1521:ORCL","scott","tiger");

// установка соединения

После установки соединения при помощи объекта conn класса Connection апплет, сервлет или приложение может обращаться к базе данных для выполнения того или иного запроса. После того, как соединение больше не требуется, его можно закрыть методом close() класса Connection:

conn.close(); // закрытие соединения

1.2 Применение интерфейса DatabaseMetaData

Интерфейсjava.sql.DatabaseMetaData имеет неоценимое значение для тех приложений, которые должны поддерживать несколько машин баз данных или несколько версий одной и той же RDBMS. Его можно использовать для определения имени и версии драйвера, конкретной RDBMS и ее версии, поддерживаемой грамматики SQL, уровня выделения транзакций, уровней процедурной поддержки и т.д. Интерфейс DatabaseMetaData возвращается из метода getMetaData() интерфейса Connection. В приведенном ниже фрагменте кода показан один из возможных вариантов использования этого интерфейса:

java.sql.DatabaseMetadata md=conn.getMetadata(); // получение информации о соединении

String driverName=md.getDriverName();

String driverVer=md.getDriverVersion();

String dbmsName=md.getDatabaseProductName();

String dbmsVer=md.getDatabaseProductVersion();

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

Этот вопрос может показаться незначительным, однако влияние различий в грамматике SQL и реализациях драйверов может оказаться существенным, если оно не будет учтено при разработке приложения. Если бы это было не так, тогда многие методы интерфейса DatabaseMetaData оказались бы просто не нужны.

1.3 Посылка статичных SQL-запросов

Перед тем как выполнить SQL-запрос, необходимо создать его создать. Объект запроса класса java.sql.Statement получается посредством вызова, например, метода createStatement() для экземпляра соединения. Затем после создания текста запроса егоследует передать базе данных, где он разбирается, оптимизируется и выполняется. Для посылки запроса используется один из методов интерфейса Statement:

ResultSet executeQuery(String sql);

int executeUpdate(String sql);

boolean execute(String sql);

Метод, выбираемый для посылки запроса базе данных, зависит от типа запроса и типа возвращаемого значения. Если запрос возвращает в виде результата некую таблицу строк данных, то необходимо использовать executeQuery(). В этом случае запрос - это чаще всего статический SQL-запрос SELECT. Текст запроса просто передается как строчный аргумент. Этот метод возвращает объект набора результатов java.sql.ResultSet в виде таблицы.

Если запрос не возвращает ничего (это не то же самое, что возвращение нуля строк) или возвращает целочисленное значение, как в случае с SQL-операторами INSERT, UPDATE или DELETE, нужно использовать executeUpdate(). Вызов возвращает целочисленное значение или нуль для инструкций, не возвращающих ничего.

Когда SQL-запрос возвращает более чем один результат, необходимо использовать execute() для выполнения этого запроса.

Приведем пример создания и выполнения запроса:

Statement stmt=conn.createStatement();

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

// создание текста запроса (выдать результат в виде таблицы, в столбцах которой помещены

// а) фамилии, б) имена, в) оклады всех людей, информация о которых хранится в таблице PAYROLL)

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

ResultSet rset=stmt.executeQuery(sqlQuery);

// выполнение запроса и получения результата запроса - таблицы выбранных строк

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

.......

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

Интерфейс ResultSet, входящий в состав интерфейса JDBC, как подразумевает его наименование, специально предназначен для выборки результатов (см. пункт о выборке результатов).

Приведем еще один пример создания и выполнения запроса. Этот запрос изменяет таблицу базы данных (обновляет данные) и, поэтому, требует фиксации изменений методом commit() для объекта соединения:

Statement stmt=conn.createStatement();

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

String sqlQuery="update PAYROLL set SALARY=SALARY*1.1 where SALARY < 1000";

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

int=stmt.executeUpdate(sqlQuery);

// выполнение запроса и получения результата запроса - число строк, в которых произведено обновление

// использование результата запроса - целого числа

.......

conn.commit();

// фиксация изменений

stmt.close();

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

Заметим, что если не требуется зафиксировать сделанные изменения, а, наоборот, необходимо отменить результаты выполнения запроса, следует воспользоваться следующим вызовом:

conn.rollback();

// отмена фиксации результатов выполнения запроса

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

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




Поделиться с друзьями:


Дата добавления: 2014-11-20; Просмотров: 438; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.156 сек.