А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я
0-9 A B C D I F G H IJ K L M N O P Q R S TU V WX Y Z #


Чтение книги "MySQL 5.0. Библиотека программиста" (страница 24)

   Подключение к базе данных

   В данном разделе мы рассмотрим простой сервлет, который подключается к базе данных и выводит диагностическое сообщение. Чтобы создать такой сервлет, необходимо импортировать пакеты java.sql.*.
   Соединение с базой данных описывается объектом класса Connection. Для создания такого объекта предназначен метод

   public static Connection getConnection(“jdbc:mysql://<Имя
   хоста>[:<Имя порта>]/<Имя базы данных>[<Параметры>]”)
   throws SQLException

   класса DriverManager. Параметры соединения задаются в формате

   ?<Имя параметра>=<Значение>&<Имя параметра>=<Значение>…

   Важнейшими параметрами соединения являются user (имя пользователя), password (пароль) и characterEncoding (кодировка).
   Если при подключении к базе данных произошла ошибка, метод getConnection() сгенерирует исключение SQLException, о котором подробно будет рассказано в подразделе «Обработка ошибок».
   Например, вызов метода

   Connection dbh =
   DriverManager.getConnection(«jdbc:mysql://localhost/SalesDept»
   + «?user=username»
   + «&password=userpassword»
   + «&characterEncoding=cp1251»);

   осуществляет подключение к серверу MySQL, работающему на локальном компьютере, используя имя пользователя username и пароль userpassword, устанавливает для взаимодействия с сервером кодировку CP-1251 и выбирает базу данных SalesDept (Отдел продаж) в качестве текущей. Созданному соединению соответствует объект dbh класса Connection.
...
   Совет
   В целях защиты от несанкционированного доступа рекомендуется подключаться к базе данных не от имени пользователя root, а от имени специально созданного пользователя с минимально необходимыми правами доступа. О регистрации пользователей и настройке прав читайте в главе 4.
   Создайте теперь сервлет Connect с исходным кодом, представленным в листинге 4.17.
Листинг 4.17. Подключение к базе данных
   import java.io.*;
   import javax.servlet.*;
   import javax.servlet.http.*;
   import java.sql.*;
   public class Connect extends HttpServlet {
   public void service(HttpServletRequest request,
   HttpServletResponse response) throws IOException, ServletException {
   response.setContentType(“text/html;charset=windows-1251”);
   PrintWriter out = response.getWriter();
   try {
   //Подсоединяемся к базе данных
   Connection dbh =
   DriverManager.getConnection(«jdbc:mysql://localhost/SalesDept»
   +»?user=username&password=userpassword&characterEncoding=cp1251»);
   //Обрабатываем испключение
   } catch (SQLException ex) {
   out.println(“Ошибка доступа к базе данных. Приносим свои извинения”);
   return;
   }
   out.println(«Подключение выполнено успешно»);
   }
   }

   После размещения и регистрации сервлета в контейнере наберем его адрес в адресной строке браузера. При успешном подключении к базе данных на вебстранице появится соответствующее сообщение (рис. 4.35).
   Рис. 4.35. Результат подключения к базе данных

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

   Выполнение простых SQL-команд. Обработка результатов запроса

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

   Statement createStatement() throws SQLException

   класса Connection.
   Например, вызов метода

   Statement query = dbh.createStatement();

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

   int executeUpdate(«<Текст команды>») throws SQLException

   класса Statement. Метод executeUpdate() возвращает количество строк, с которыми была выполнена операция.
   Для выполнения SQL-запроса используется метод

   ResultSet executeQuery(«<Текст запроса>») throws SQLException

   класса Statement. Метод executeQuery() возвращает объект класса ResultSet, содержащий набор полученных запросом данных. Важным элементом результирующего набора является курсор – указатель на текущую строку.
   Для извлечения данных из результирующего набора нам потребуются следующие методы класса ResultSet.
   • boolean next() throws SQLException
   Переводит курсор на следующую строку. При первом вызове устанавливает курсор на первую строку. Если строки результирующего набора исчерпаны, возвращает значение FALSE.
   • Методы вида get^rn данных>(<Имя или номер столбца>) возвращают значение, находящееся в текущей строке в указанном столбце. В зависимости от типа данных столбца вы можете использовать следующие функции:
   • для числовых столбцов:

   boolean getBoolean(<Имя или номер столбца>)
   throws SQLException
   int getInt(<Имя или номер столбца>)
   throws SQLException
   long getLong(<Имя или номер столбца>)
   throws SQLException
   float getFloat(<Имя или номер столбца>)
   throws SQLException
   double getDouble(<Имя или номер столбца>)
   throws SQLException
   BigDecimal getBigDecimal(<Имя или номер столбца>)
   throws SQLException

   • для столбцов с типом даты и/или времени:

   Date getDate(<Имя или номер столбца>)
   throws SQLException
   Timestamp getTimestamp(<Имя или номер столбца>)
   throws SQLException
   Time getTime(<Имя или номер столбца>)
   throws SQLException

   • для символьных типов данных:

   String getString(<Имя или номер столбца>)
   throws SQLException
   byte[] getBytes(<Имя или номер столбца>)
   throws SQLException

   Рассмотрим сервлет, который выполняет простой запрос для получения данных из таблицы Products (Товары) и выводит сведения о товарах на веб-странице (листинг 4.18).
Листинг 4.18. Получение информации и отображение ее на странице
   import java.io.*;
   import javax.servlet.*;
   import javax.servlet.http.*;
   import java.sql.*;
   public class Output extends HttpServlet {
   public void service(HttpServletRequest request,
   HttpServletResponse response) throws IOException, ServletException {
   response.setContentType(«text/html;charset=windows-1251»);
   PrintWriter out = response.getWriter();
   //Создаем строку для вывода результата запроса
   String pagecontent = «»;
   try {
   //Подсоединяемся к базе данных
   Connection dbh =
   DriverManager.getConnection(«jdbc:mysql://localhost/SalesDept»
   +»?user=username&password=userpassword&characterEncoding=cp1251»);
   //Создаем объект для SQL-команд
   Statement query = dbh.createStatement();
   //Выполняем запрос к базе данных
   ResultSet qresult = query.executeQuery(«SELECT * FROM Products»);
   //Для каждой строки в результирующем наборе выводим значения столбцов
   //description (наименование), details (описание) и price (цена)
   while (qresult.next()) {
   pagecontent +=
   «<tr><td>» + qresult.getString(«description») + «</td>» +
   «<td>» + qresult.getString(«details») + «</td>» +
   «<td>» + qresult.getBigDecimal(«price») + «</td></tr>n»;
   }
   //Обрабатываем исключение
   } catch (SQLException ex) {
   out.println(“Ошибка доступа к базе данных. Приносим свои извинения”);
   return;
   }
   //Выводим полученные данные
   out.println(«<html>»);
   out.println(«<head>»);
   out.println(«<title>Работа с MySQL</title>»);
   out.println(«</head>»);
   out.println(«<body>»);
   out.println(“<!– Выводим заголовок списка товаров –>”);
   out.println(“<h1>Список товаров</h1>”);
   out.println(«<table>»);
   out.println(«<tr>»);
   out.println(«<th>Наименование</th>»);
   out.println(«<th>Описание</th>»);
   out.println(«<th>Цена</th>»);
   out.println(«</tr>»);
   out.println(pagecontent);
   out.println(«</table>»);
   out.println(«</body>»);
   out.println(“</html>”);
   }
   }

   В этом примере вначале выполняется подключение к базе данных, далее создается объект query класса Statement, затем метод executeQuery() этого объекта выполняет запрос к базе данных. Результат запроса записывается в объект qresult класса ResultSet. Затем последовательно рассматриваются строки объекта qresult и выводятся значения столбцов description, details и price.
   В результате запуска сервлета Output вы увидите на веб-странице список товаров (рис. 4.36).
   Рис. 4.36. Вывод информации на странице

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

   while (qresult.next()) {
   pagecontent +=
   «<tr><td>» + qresult.getString(2) + «</td>» +
   «<td>» + qresult.getString(3) + «</td>» +
   «<td>» + qresult.getBigDecimal(4) + «</td></tr>n»;
   }

   Итак, вы познакомились с простыми запросами, не имеющими подстановочных параметров. В следующем подразделе вы узнаете о 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-команды.
   До этого момента во всех наших сервлетах обработка возможных ошибок при взаимодействии с базой данных сводилась к выводу на экран сообщения об ошибке. В следующем подразделе вы узнаете, какие еще действия можно выполнить при перехвате исключения.
Чтение онлайн



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 [24] 25 26 27 28 29 30 31

Навигация по сайту


Читательские рекомендации

Информация