Rambler's Top100IT • archiv

rus / eng | Логин | Комментарий к колонке | Печать | Почта | Клуб




Колонки


Разработка мобильного словаря с использованием JDBC. Часть 1

 
(Николай Зайкин)

Продолжая курс статей (1, 2), я решил расширить рассматриваемый учебный пример, подключить к нему современные Java технологии, не углубляясь тем не менее в дебри, чтобы начинающий Java-программист смог настроить приложение клиент-сервер на своем компьютере не прибегая к тяжеловесным (и зачастую небесплатным) программным продуктам (SQL Servers, Java Application Servers), и коснуться модной сегодня концепции MVC (Model - View - Controller). Как и предыдущие уроки, этот курс ориентирован на использование IDE VisualAge for Java компании IBM, хотя обычный текстовый редактор также будет использован не один раз.

1. Краткий обзор СУБД. Подготовка СУБД.

Сначала мы настроим SQL сервер на своей машине и перенесем словари в SQL базу данных вместо обычных plain-text файлов. Далее мы рассмотрим Java аналог CGI технологии - Servlets и JSP (Java Server Pages).

Зайдите на сайт www.mysql.com и скачайте дистрибутив СУБД-cервера MySQL для вашей платформы (Windows NT).

В нашем примере мы используем версию 3.23.38, но это не принципиально. Желательно, чтобы это был релиз 3.23.XX, так как версия 4.0 пока находится в альфа стадии.

Запустите setup.exe и инсталлируйте в каталог по умолчанию:

c:\mysql

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

  • "user" для имен пользователей
  • "db" для баз данных
  • "host" для компьютеров с которых получают доступ к базам данных.
Для Windows NT/Windows 2000 имя сервера mysqld-nt.exe

Вы должны установить MySQL сервер как сервис в вашей операционной системе:

c:\mysql\bin\mysqld-nt.exe --install

или
c:\mysql\bin\mysqld-max-nt.exe --install

после этого вы сможете стартовать и останавливать сервис командами
NET START mysql
NET STOP mysql

или из Control Panel -> Services.

Окно Services

По умолчанию суперпользователь root не имеет пароля. Войдите в клиентскую консоль SQL сервера, набрав команду:

C:\mysql\bin> mysql.exe -u root mysql

-u root сообщает, что мы логинимся под пользователем root.

mysql сообщает, что мы будем работать с базой данных mysql. Если мы не указываем имя базый данных, то перед началом работы надо будет обязательно задать ее имя при помощи:

mysql> USE <имя базы данных>;

Итак, мы получили доступ с SQL серверу. Посмотрим какие пользователи присутствуют сразу после установки системы:

mysql> SELECT User, Host, Password from user;

Начальные пользователи SQL сервера

Мы видим, что есть несколько потенциальных брешей в сервере:

  • суперпользователь root не имеет пароля, следовательно войти в сервер и производить изменения таблиц может любой человек.
  • в системе есть пользователь без имени и пароля, это означает, что простой запуск консоли без явного указания имени пользователя и пароля позволит успешно войти в сервер (правда, только с localhost, но и это тоже немало).
Для задания пароля пользователю root выполните следующие команду.
mysql> UPDATE user SET Password=
 PASSWORD('rootpassword') WHERE User='root';

(используется встроенная функция PASSWORD() для хэширования пароля).

Для удаления из системы пользователя без имени выполните следующую команду:

mysql> DELETE FROM user WHERE User='';

Чтобы заставить сервер перечитать административные таблицы (чтобы новый пароль пользователя root стал известен SQL серверу), выполните команду :

mysql> FLUSH PRIVILEGES;

Теперь новым паролем суперпользователя root будет rootpassword. Обратите внимание на символ ';' в конце SQL запросов. Если вы не наберете ';', сервер примет ваши действия за многострочный SQL запрос и предложит ввести продолжение на следующей строке. Вы сможете набрать ';' в следующей строке и нажать 'Enter'.

Взглянем на таблицу пользователей теперь:

mysql> SELECT User, Host, Password from user;

Модифицированная таблица пользователей SQL сервера

Вы можете заметить, что SQL сервер хранит пароли в зашифрованном виде. Алогритм шифрования позволяет выполнять только одностороннее шифрование, то есть пароль невозможно восстановить из его хэша.

Временно выйдем из консоли. Наберите:

mysql> quit

или
mysql> \q

Операционная система выйдет в командную строку.

Попробуйте снова:

C:\mysql\bin> mysql.exe -u root mysql

сервер не позволит залогиниться. Для того чтобы залогиниться, пользователю с паролем можно либо указать пароль в командной строке (это не секретно, любознательный человек может прочитать его набрав команду ps в UNIX), либо ввести по запросу (указав в коммандной строке ключ - p):

C:\mysql\bin> mysql.exe -u root -p mysql

на запрос введите 'rootpassword'.

Далее, нам надо

  1. создать базу данных для словарей
  2. зарегистрировать в служебных таблицах клиентского пользователя с правами, позволяющими только делать запросы к таблицам словарей, но не модифицировть их
  3. создать пустые таблицы для словарей.
Структура привелегий в MySQL такова:
Привилегия  Столбец            Контекст
------------------------------------------------------------
*select*    `Select_priv'      таблицы
*insert*    `Insert_priv'      таблицы
*update*    `Update_priv'      таблицы
*delete*    `Delete_priv'      таблицы
*index*     `Index_priv'       таблицы
*alter*     `Alter_priv'       таблицы
*create*    `Create_priv'      базы данных, таблицы или индексы
*drop*      `Drop_priv'        базы данных или таблицы
*grant*     `Grant_priv'       базы данных или таблицы
*references*`References_priv'  базы данных или таблицы
*reload*    `Reload_priv'      администрирование сервера
*shutdown*  `Shutdown_priv'    администрирование сервера
*process*   `Process_priv'     администрирование сервера
*file*      `File_priv'        доступ к файлам на сервере
Следовательно, чтобы дать пользователю право выполнять команду SELECT, надо занести в поле Select_priv таблицы user занечение 'Y' для данного польозователя.
mysql> CREATE DATABASE mdictdb;
mysql> INSERT INTO user SET Host='%',
  User='mdictuser',
  Password=PASSWORD('mdictpassword'),
  Select_priv='Y';
mysql> FLUSH PRIVILEGES;

в результате мы создадим базу данных для словарей, создадим специального пользователя 'mdictuser' с ограниченными привелегиями, который сможет подключаться к серверу СУБД с любого хоста.

Выведем на экран еще раз таблицу пользователей:

mysql> SELECT User, Host,
 Password, Select_priv FROM user;

Обновленная таблица пользователей SQL сервера

Сейчас нам надо создать таблицы для словарей и занести в эти таблицы слова из текстовых файлов.

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

  1. word
  2. translation
Мы используем текстовые поля для хранения данных в таблицах, в MySQL существуют следующие типы для текстовых столбцов:
Тип столбца                          Требуемое для хранения место
------------------------------------------------------------------------
`CHAR(M)'                            `M' байт, `1 <= M <= 255'
`VARCHAR(M)'                         `L'+1 байт, где `L <= M' и
                                     `1 <= M <= 255'
`TINYBLOB', `TINYTEXT'               `L'+1 байт, где `L' < 2^8
`BLOB', `TEXT'                       `L'+2 байт, где `L' < 2^16
`MEDIUMBLOB', `MEDIUMTEXT'           `L'+3 байт, где `L' < 2^24
`LONGBLOB', `LONGTEXT'               `L'+4 байт, где `L' < 2^32
`ENUM('value1','value2',...)'        1 или 2 байта, в зависимости от
                                     количества перечисляемых значений
                                     (65535 значений максимум)
`SET('value1','value2',...)'         1, 2, 3, 4 или 8 байт, в зависимости
                                     от числа членов множества (64
                                     членов максимум)

для поля word достаточно будет типа CHAR(M), где 1<=M<=255. А вот какой тип надо для поля translation: CHAR(M) или TEXT, мы сможем только узнать, написав небольшую программу на Java, которая проведет анализ размера перевода и выберет наибольший размер для полей translation будущих таблиц

Итак, запускаем любимую IDE VisualAge for Java и приступаем к работе...

TOC | Часть 2 >




Справка | Условия Copyright © 1999 — 2008, IT • archiv.
В начало | Логин | Комментарий к колонке | Поиск | Почта