22 апреля 2010 г.

Интеграция Apache Derby в Java-приложение

При создании небольших прикладных программ, решающих относительно простые задачи, очень часто приходится использовать базы данных для хранения информации, потому что это очень удобно. Так же, обычно, у таких программ не предполагается обработка и хранение больших объемов информации, работа в сети и многопользовательский доступ к базе данных. В таком случае зачастую очень не хочется заморачиваться с использованием таких СУБД, как PostgreSQL или MySQL, т.к. при установки такой программы необходимо, что бы либо пользователь обладал определенными знаниями в этой области и смог настроить СУБД для работы с созданной нами программой, либо для программы придется писать дополнительную программу-установщик, что бы избавить конечного пользователя от совершенно ненужных ему плясок вокруг установки и настройки сервера базы данных.
Но есть более простой выход - использование СУБД Apache Derby, которая может быть интегрированна в Java-приложение. В этой статье я кратко расскажу как можно реализовать такой подход.
При разработке я использовал ОС Linux и среду разработки Eclipse, поэтому статья ориентированна на эти системы, но точно так же всё написанное можно переоформить для MS Windows и любой другой среды разработки.


Порядок действий:

1. Качаем Apache Derby и распаковываем файлы (например в каталог /usr/local);

2. Для того что бы Eclipse "видел" классы, необходимые для работы с Apache Derby идем в папку [Apache Derby]/lib (например /usr/local/db-derby-10.4.2.0-bin/lib) и копируем файл derby.jar в каталог lib/ext используемой среды выполнения Java (у меня это /usr/java/jdk1.6.0_10/jre/lib/ext), либо подключаем файл derby.jar в Eclipse как пользовательскую библиотеку (Window -> Preferences -> Java -> Build Path -> User Libraries). Второй вариант предпочтительнее.


3. Пишем простенький класс для работы с базой данных Apache Derby, вроде этого:


4. Пишем программу, которая будет работать с Apache Derby;

Т.к. нам нужно, что бы написанная программа выполнялась на любом компьютере, на котором Apache Derby может быть не установлен, то надо позаботиться о доступности библиотеки derby.jar нашему приложению. Могу предложить два варианта решения этой проблемы. Первый вариант наиболее стандартен, вам просто нужно таскать с вашим приложением файл derby.jar, а путь к нему добавлять в CLASSPATH при запуске программы. Второй вариант, наверное многие сочтут кривым и неправильным, но он очень удобен. Можно распаковать файлы из derby.jar в каталог созданного проекта среды Eclipse (например, ~/workspace/DerbyTest), а потом собрать jar из всех файлов проекта и включить в него каталог org, полученный после распаковки derby.jar, тогда всю небольшую программу можно уместить в одном jar-файле. Но второй вариант, конечно, подойдет далеко не всем и не всегда, а наверное только в случае разработки действительно небольшой программы.


Пример программы:


Обратите внимание на то, что если в строке, описывающей подключение к базе данных Apache Derby (DriverManager.getConnection), не указан полный путь к базе, то её поиск будет осуществляться в той директории, из которой было запущено приложение, и если базы данных там не найдется, то она будет создана автоматически, при использовании параметра "create=true"в строке подключения.

7 комментариев:

  1. Спасибо! Только по вашему примеру разобрался!

    ОтветитьУдалить
  2. Спасибо! А как указывать путь к директории с уже существующей базой?

    ОтветитьУдалить
    Ответы
    1. Пожалуйста! Вместо простого имени базы данных в переменной dbName (см. листинг выше) надо указать полный или относительный путь от текущего рабочего каталога к существующей базе данных.

      Пример:
      Connection con = DriverManager.getConnection("jdbc:derby:/home/user/dreby/mydb");

      Параметр "create=true" в данном случае можно опустить, т.к. БД уже создана.

      Удалить
  3. Огромное спасибо! так же как Илья, разобрался только благодаря Вам)

    ОтветитьУдалить
  4. С вашим примером разобрался, спасибо! Но когда пытаюсь написать свой пример, к примеру сохранить данные пользователя для дальнейшего использования, то выскакивает исключение...
    Вот ссылка на топик с проблемой: http://javatalks.ru/topics/45794

    ОтветитьУдалить