Rambler's Top100IT • archiv

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




Колонки


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

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

3. Создание таблиц словарей. Установление соединения с БД из Java программы.

Как уже обсуждалось ранее, все таблицы словарей будут иметь по два поля:

  1. word
  2. 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

Заодно занесите и текущий каталог (".") в 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:
  • java -Djdbc.drivers=org.gjt.mm.mysql.Driver имя_программы
  • в самой программе:
    System.setProperty("jdbc.drivers",
     "org.gjt.mm.mysql.Driver") ;
    
    
  • Установкой системного свойства jdbc.drivers в системном файле свойств (зависит от конкретной используемой ОС)
Используя двоеточие, вы можете загружать несколько драйверов. Преимущества этого метода - отсутствие необходимости модификации кода при смене класса драйвера. Если загружено несколько драйверов, их приоритет следующий:
  1. JDBC драйверы, загруженные через свойство jdbc.drivers при инициализации JVM.
  2. 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 >




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