Разработка мобильного словаря с использованием JDBC. Часть 3
(Николай Зайкин)
3. Создание таблиц словарей. Установление соединения с БД из Java
программы.
Как уже обсуждалось ранее, все таблицы словарей будут иметь по
два поля:
word
translation
Причем поле word имеет тип CHAR(255), а поле
translation имеет тип TEXT.
Для ускорения работы поиска в таблицу надо добавить индекс по полю
word.
Этот индекс будет ускорять запросы типа:
SELECT * FROM xxx WHERE word='yyy';
или типа:
SELECT * FROM xxx WHERE word LIKE 'yyy%';
но будет бесполезен при следующих запросах:
SELECT * FROM xxx WHERE word LIKE '%yyy%';
Это очевидно.
Обратите внимание, что вы используете не "=" или "!=" когда
применяете SQL шаблоны, а операторы сравнения "LIKE" или "NOT
LIKE".
Всего мы имеем 8 словарей, 7 англо-русских и 1 русско-английский.
Подсоединяемся с клиентской консоли к SQL серверу как пользователь root и начинаем
создавать таблицы словарей...
C:\> mysql.exe -u root -p mdictdb
mysql> CREATE TABLE abbrev (
-> word CHAR(255) NOT NULL,
-> translation TEXT NOT NULL,
-> INDEX word_index (word),
-> );
Чтобы каждый раз не набирать SQL-запрос вручную, можно подготовить файл сценария в
текстовом редакторе и потом запустить его на выполнение с консоли.
Подготовьте в текстовом редакторе файл (назовите его, например,
create.sql) со следующим содержимым:
USE mdictdb;
CREATE TABLE abbrev (
word CHAR(255) NOT NULL,
translation TEXT NOT NULL,
INDEX word_index (word)
);
CREATE TABLE computer (
word CHAR(255) NOT NULL,
translation TEXT NOT NULL,
INDEX word_index (word)
);
CREATE TABLE economy (
word CHAR(255) NOT NULL,
translation TEXT NOT NULL,
INDEX word_index (word)
);
CREATE TABLE general (
word CHAR(255) NOT NULL,
translation TEXT NOT NULL,
INDEX word_index (word)
);
CREATE TABLE pc_user (
word CHAR(255) NOT NULL,
translation TEXT NOT NULL,
INDEX word_index (word)
);
CREATE TABLE public (
word CHAR(255) NOT NULL,
translation TEXT NOT NULL,
INDEX word_index (word)
);
CREATE TABLE rus_eng (
word CHAR(255) NOT NULL,
translation TEXT NOT NULL,
INDEX word_index (word)
);
CREATE TABLE update_d (
word CHAR(255) NOT NULL,
translation TEXT NOT NULL,
INDEX word_index (word)
);
И запустите его на исполнение командой:
mysql> ./ create.sql
либо
mysql> source create.sql
Если текстовый файл находится не в текущем каталоге, то укажите полный путь к
файлу.
После завершения работы скрипта проверьте, создались ли новые таблицы в базе
данных:
mysql> SHOW TABLES;
Итак, таблицы созданы, можно загружать в них данные. Эту работу лучше выполнять из
Java программы используя JDBC (Java Database Connection или Java Database Connectivity)
API.
JDBC API предоставляет универсальный доступ к данным из Java программ. Для доступа к
базе данных вам понадобится так называемый драйвер - специальный Java класс с помощью
которого вы сможете получить соединение к SQL серверу.
Список JDBC драйверов поддерживается фирмой Sun и находится по адресу:
http://industry.java.sun.com/products/jdbc/drivers.
Для СУБД MySQL мы будем использовать драйвер MM.MySQL, его можно найти
здесь или
здесь.
На текущий момент последней версией драйвера является 2.0.7.
MM.MySQL - драйвер типа 4. Что это означает:
- Драйверы типа 1 являлись мостами ODBC-JDBC. Требовали наличия какого-либо ODBC
драйвера.
- Драйверы типа 2 известны как драйверы, частично написанные на Java. Они переводили
вызовы JDBC API в непосредственно вызовы API базы данных. На машине с клиентским
приложением должна была быть установленна соответствующая бинарная клиентская библиотека
от производителя СУБД (Oracle, DB2, Sybase).
- Драйверы типа 3 - драйверы написанне на чистом языке Java, которые трансформировали
вызовы JDBC API в независимый от базы данных протокол. Драйвер не соединялся
непосредственно с базой данных, а соединялся с связующим промежуточным сервером
(middleware server). Для перенастройки Java приложения на другую базу данных требовалось
поменять настройки промежуточного сервера. Недостаток этого метода - большая загрузка
системы из-за дополнительного связующего звена. С другой стороны, преимуществом является
то, что если приложение обрается ко многим типам баз данных, оно сможет делать это
используя лишь один JDBC драйвер.
- И, наконец, драйверы типа 4 - это драйверы написанне на чистом языке Java, которые
связываются непосредственно с базой данных. Разработчики считают этот тип драйверов
оптимальным, так как он обеспечивает хорошую производительность и позволяет программистам
использовать все специфичные для конкретной СУБД функции. Конечно, тесная привязанность к
конкретному типу СУБД может уменьшить гибкость, особенно если вы захотите перенастроить
на другой тип СУБД. Преимуществом драйвера является то, что вы можете писать
распределенные приложения (distributed applications) когда хост клиентского приложения
напрямую связывается с хостом сервера базы данных (апплеты и др.)
Допустим, вы скачали файл mm.mysql-2.0.7-you-must-unjar-me.jar с
драйвером, вам надо его распаковать :
с:\> jar -xvf
mm.mysql-2.0.7-you-must-unjar-me.jar
зайдите в новый каталог mm.mysql-2.0.7 и скопируйте из него сам файл
драйвера mm.mysql-2.0.7-bin.jar например в каталог
c:\mysql\jdbc (создайте его сами).
Чтобы Java программы смогли создавать экземпляры данного класса на этапе выполнения,
он должен быть указан в системной переменной окружения CLASSPATH.
Это можно сделать либо на этапе запуска программы через командную строку:
java -cp
путь_к_классу_драйвера\
имя_jar_архива_драйвера.jar имя_программы
либо через Control Panel в Windows NT (Start -> Settings ->
Control Panel -> System -> закладка Environment):
Заодно занесите и текущий каталог (".") в
CLASSPATH.
Нажмите кнопку Set, затем Apply.
Зайдите к коммандную строку и наберите команду:
с:\> set
Среди системных переменных найдите переменную CLASSPATH. Помимо
остальных путей, она должна содержать "." и
"с:\mysql\jdbc\mm.mysql-2.0.7-bin.jar".
Теперь мы уже можем написать простейший класс, устанавливающий соединение с сервером
базы данных.
Соединение с базой данных выполняется в несколько шагов:
Надо создать экземпляр класса драйвера и загрузить его в JVM (при этом класс
регистрируется в менеджере драйверов):
static {
DriverManager.registerDriver(
new org.gjt.mm.mysql.Driver());
}
или при непосредственно при помощи ClassLoader:
Class.forName("org.gjt.mm.mysql.Driver");
или, используя системное свойство jdbc.drivers:
Используя двоеточие, вы можете загружать несколько драйверов. Преимущества этого метода -
отсутствие необходимости модификации кода при смене класса драйвера. Если загружено
несколько драйверов, их приоритет следующий:
- JDBC драйверы, загруженные через свойство
jdbc.drivers при инициализации
JVM.
- JDBC драйверы, загруженные динамически (runtime).
Так как свойство jdbc.drivers проверяется единожды при вызове методов
класса DriverManager, перед первой установкой соединения с БД важно
удостовериться, что драйверы правильно зарегистрированы.
Некоторые JVM, в которых неправильно работает статический инициализатор, требуют
немного отличного подхода регистрации JDBC драйвера:
Class.forName("org.gjt.mm.mysql.Driver").
newInstance();
или
DriverManager.registerDriver(
new org.gjt.mm.mysql.Driver());
Эти способы будут работать во всех JVM.
Обратите внимание, так как метод forName() статический, то мы можем его
вызывать не создавая экземляра типа Class. Как уже упоминалось выше, мы
можем загрузить несколько JDBC драйверов в свое приложение.
Составим правильный URL для создания соединения (Connection), который включает в себя
следующие части :
- jdbc - с этой строки начинаются все URL для работы с JDBC API.
- имя СУБД (mysql)
- имя хоста (опционально порт) с SQL сервером (localhost)
- имя БД (mdictdb)
- имя пользователя БД (mdictuser)
- пароль пользователя БД (mdictpassword)
static String DBUrl =
"jdbc:mysql://localhost/mdictdb?
user=mdictuser&password=mdictpassword";
Затем надо получить сроединение от менеджера драйверов. Он автоматически по URL
определяет, какой JDBC драйвер следует использовть для доступа к данной СУБД:
Connection c = DriverManager.
getConnection(DBUrl);
альтернативный способ - задание имени пользователя и пароля в параметрах метода
getConnection():
Connection c = DriverManager.getConnection(
DBUrl, "mdictuser", "mdictpassword");
Весь полностью код класса приведен ниже:
import java.sql.*;
// Notice, do not import org.gjt.mm.mysql.*
// or you will have problems!
public class GetConnection {
static String DBUrl =
"jdbc:mysql://localhost/mdictdb?
user=mdictuser&password=mdictpassword";
public static void main(String[] Args) {
try {
// The newInstance() call is a work around for some
// broken Java implementations
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
System.out.println("Driver loaded !");
try {
Connection c = DriverManager.getConnection(DBUrl);
// Do something with the Connection
System.out.println("Connection Created !");
//Close the connection to the database
c.close();
}
catch (SQLException e) {
System.out.println("SQLException: " + e.getMessage());
System.out.println("SQLState: " + e.getSQLState());
System.out.println("VendorError: " + e.getErrorCode());
}
}
catch (Exception e1) {
System.err.println("Unable to load driver.");
e1.printStackTrace();
}
}
}
Скопируйте его в файл GetConnection.java, откомпилируйте
c:\> javac GetConnection.java
и запустите на исполнение:
c:\> java GetConnection
Если вы получите на экране сообщение о созданном соединении, то все нормально и можно
переходить к написанию класса, который загрузит текстовые данные в таблицы.
Если вы получите сообщение от JVM о том, что она не может найти класс
"org.gjt.mm.mysql.Driver", проверьте еще раз переменную
CLASSPATH.
Если вы получите сообщение об SQL exception, проверьте, запущен ли ваш SQL сервер
(войдите в Control Panel -> Services -> MySql).
После получения сообщения об удачном соединении с сервером БД, можно двигаться
дальше.
TOC | Часть 4

|