Вход/Регистрация
MySQL 5.0. Библиотека программиста
вернуться

Гольцман Виктор

Шрифт:

Итак, вы познакомились с простыми запросами, не имеющими подстановочных параметров. В следующем подразделе вы узнаете о SQL-командах, содержащих переменные величины.

Выполнение параметризованных SQL-команд

Для выполнения динамических SQL-команд, содержащих подстановочные параметры, предназначен класс PreparedStatement. Объект класса PreparedStatement создается с помощью метода

PreparedStatement prepareStatement(«<Шаблон SQL-команды>») throws SQLException

класса Connection. Места вставки подстановочных значений в шаблоне SQL-команды обозначаются символами \'?\'. Например, вызов метода

PreparedStatement insert =

dbh.prepareStatement(“INSERT INTO Customers

(name,phone,address) VALUES (?,?,?)”);

создает объект insert класса PreparedStatement, соответствующий параметризованной SQL-команде. Параметрами команды являются имя, телефон и адрес клиента, сохраняемые в базе данных. Для присвоения значений параметрам используются методы вида

void set<Тип данных>(<Порядковый номер параметра в шаблоне>,

<Значение параметра>)

throws SQLException

Например, если переменные name, phone и address содержат, соответственно, имя, телефон и адрес клиента, то подставить их значения в команду insert можно с помощью вызова методов

insert.setString(1,name);

insert.setString(2,phone);

insert.setString(3,address);

...

Примечание

Если подставляемые значения содержат спецсимволы, то методы set<Тип данных> автоматически экранируют их.

После того как нужные значения подставлены в SQL-команду, ее можно выполнить путем вызова метода

int executeUpdate throws SQLException

или

ResultSet executeQuery throws SQLException

класса PreparedStatement. Метод executeUpdate предназначен для выполнения команд, не предполагающих получение данных из базы (например, INSERT, UPDATE, DELETE) и возвращает количество строк, с которыми была выполнена операция. Метод executeQuery предназначен для выполнения запросов к базе данных и возвращает объект класса ResultSet, содержащий результирующий набор данных. О том, как извлечь конкретные значения из этого объекта, было рассказано в подразделе «Выполнение простых SQL-команд. Обработка результатов запроса». Рассмотрим пример сервлета, который выполняет параметризованную SQL-команду, а именно: сохраняет в базе сведения, введенные пользователем в веб-форме. Помимо функций JDBC, для создания такого сервлета нам потребуется метод

public java.util.Enumeration getParameterNames

класса HttpServletRequest. Напомним, что метод service получает в качестве параметра объект класса HttpServletRequest, который содержит все параметры HTTP-запроса к Java-серверу. Метод getParameterNames этого объекта возвращает список имен полей формы, заполненной пользователем. Если этот список пуст, значит, нужно отобразить форму ввода данных, а если нет – обработать введенные данные. Кроме того, мы будем использовать метод

public java.lang.String getParameter(«<Имя поля формы>»)

класса HttpServletRequest для получения значения, введенного пользователем в поле формы, и метод

public void setCharacterEncoding(<Кодировка>) throws java.io.UnsupportedEncodingException

класса HttpServletRequest для указания кодировки данных, полученных сервлетом.

Итак, создайте сервлет с исходным кодом, представленным в листинге 4.19.

Листинг 4.19. Ввод данных

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.sql.*;

public class Input extends HttpServlet {

public void service(HttpServletRequest request,

HttpServletResponse response) throws IOException, ServletException {

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

request.setCharacterEncoding(«CP1251»);

PrintWriter out = response.getWriter;

//Получаем список имен параметров формы

java.util.Enumeration params = request.getParameterNames;

//Если список имен параметров пуст, выводим форму

if(!params.hasMoreElements) {

out.println(«<html>»);

out.println(«<head>»);

out.println(«<title>Работа с MySQL</title>»);

out.println(«</head>»);

out.println(«<body>»);

out.println(“<h1>Пожалуйста, заполните следующие поля:</h1>”);

//Создаем форму для ввода данных

//Обрабатывать введенные данные будет этот же сервлет: /servlet/Input

out.println(«<form method=\\'post\\' action=\\'/servlet/Input\\'>»);

out.println(“<table>”);

//Создаем поле для ввода имени заказчика

out.println(“<tr><td>Ваше имя:</td>”);

out.println(«<td><input type=\'text\' name=\'CustomerName\'»);

out.println(« value=\'\'></td></tr>»);

//Создаем поле для ввода телефона заказчика

out.println(“<tr><td>Телефон:</td>”);

out.println(«<td><input type=\'text\' name=\'CustomerPhone\'»);

out.println(« value=\'(495)\'></td></tr>»);

//Создаем поле для ввода адреса заказчика

out.println(«<tr><td>Адрес:</td>»);

out.println(«<td><input type=\'text\' name=\'CustomerAddress\'»);

out.println(« value=\\'\\'></td></tr>»);

out.println(«</table>»);

out.println(«<br>»);

//Создаем кнопку для подтверждения данных

out.println(“<input type=\'submit\' value=\'Отправить\'>”);

out.println(«</form>»);

out.println(«</body>»);

out.println(“</html>”);

}

//Если список имен параметров непуст, сохраняем значения

else {

try {

//Подсоединяемся к базе данных

Connection dbh =

DriverManager.getConnection(«jdbc:mysql://localhost/SalesDept»

+»?user=username&password=userpassword&characterEncoding=cp1251»);

//Создаем объект для параметризованной SQL-команды

String insertTemplate =

«INSERT INTO Customers (name,phone,address)VALUES (?,?,?)»;

PreparedStatement insert = dbh.prepareStatement(insertTemplate);

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

insert.setString(1,request.getParameter(«CustomerName»));

insert.setString(2,request.getParameter(«CustomerPhone»));

insert.setString(3,request.getParameter(«CustomerAddress»));

//Выполняем запрос к базе данных

insert.executeUpdate;

//Обрабатываем исключение

} catch (SQLException ex) {

out.println(“Ошибка доступа к базе данных.”);

out.println(“Приносим свои извинения”);

return;

}

//Выводим итоговое сообщение

out.println(“<html>”);

out.println(«<head>»);

out.println(«<title>Работа с MySQL</title>»);

out.println(«</head>»);

out.println(«<body>»);

out.println(“<h3>Поздравляем! Регистрация завершена успешно</h3>”);

out.println(«</body>»);

out.println(«</html>»);

}

}

}

Запустив сервлет Input, вы увидите на странице веб-форму (рис. 4.37):

Рис. 4.37. Форма ввода данных

Введите в поля формы какие-либо значения и нажмите кнопку Отправить. Для обработки данных повторно вызовется сервлет Input. На этот раз сервлет получит непустой список параметров, поэтому выполнятся инструкции, следующие после ключевого слова else в листинге 4.19, а именно: создастся объект insert класса PreparedStatement, соответствующий SQL-команде INSERT. Далее с помощью методов setString в команду будут подставлены введенные вами имя, телефон и адрес, а затем для передачи команды на сервер MySQL вызовется метод executeUpdate. При успешном выполнении всех этих действий вы увидите на странице соответствующее сообщение (рис. 4.38).

Рис. 4.38. Результат сохранения данных

Итак, вы научились сохранять в базе пользовательские данные с помощью параметризованной SQL-команды.

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

Обработка ошибок

Изучая функции JDBC, вы узнали, что в случае возникновения ошибки все эти функции генерируют исключение SQLException. С помощью методов класса SQLException вы можете получить более подробные сведения об ошибке взаимодействия с базой данных. В частности, метод

  • Читать дальше
  • 1
  • ...
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: