22
January

Работа с MS Access из Java

Posted in: Java open-source проекты, Базы данных, SQL, Oracle |

Даже если ваш проект использует новейшие разработки в области кросс-платформенного ПО, рано или поздно придется столкнуться с технологиями, с которыми не очень хотелось сталкиваться.
Так случилось и со мной, когда заказчик захотел получать отчеты в виде базы данных MS Access.
Пришлось порыться в поисках java-библиотеки для работы с форматом mdb.
О результатах своих поисков я и хочу вам рассказать.


Первое, что пришло на ум - JDBC-ODBC Bridge. Стандартная реализация находится в JDK - класс sun.jdbc.odbc.JdbcOdbcDriver - это драйвер, с помощью которого можно общаться с файлами mdb.
Но данный подход был отвергнут сразу, так как этот мост работает через msjet40.dll. То есть на Linux это работать не будет.

Второй вариарт - использование pure JDBC драйвера. Хорошей библиотекой для этого является HXTT Access. Но у нее есть один недостаток - она платная. Evaluation версия работает 30 дней и не позволяет выполнять более 50 запросов на одно соединение. Да и не серьезно как-то использовать нелицензионные версии библиотек для коммерческих продуктов (вот все остальное - можно, сказал c0nst незаметно сворачивая Idea в taskbar Windows).
Для тех, кто все же решит использовать эту библиотеку - выполнение create database if not exists создавало новый файл mdb, который потом корректно не открывался. Возможно, это очередное ограничение на использование пробной версии. Workaround - лучше создать пустую базу, например template.mdb, а потом ее копировать и уже тогда использовать копию для своих нужд.

Наконец, взгляд был брошен на open source сообщество. В частности была обнаружена библиотека с оригинальным названием jackcess.
API библиотеки достаточно прозрачное. Никаких глюков не обнаружено. Со скоростью есть небольшие проблемы: с ростом базы данных скорость записи уменьшается. 500 тысяч записей писало около 4-х часов, тогда как 50 тысяч - около 10-ти минут.
О нюансах использования библиотеки можно почитать на сайте проекта. Я лишь хочу дать минимально представление об ее использовании.

Итак, для создания новой базы данных (или открытия старой) используется следующая конструкция:

  File file = new File("d:/test.mdb")
  Database db = Database.create(file);

Чтобы создать новую таблицу, необходимо сперва описать все колонки, из которых она будет состоять:

  List columns = new ArrayList();

  Column col = new Column();
  col.setName("Mobile");
  col.setSQLType(Types.VARCHAR);
  columns.add(col);

Для установки типов используйте Types из пакета java.sql. Для типа MEMO подойдет LONGVARCHAR.

Непосредственно создание новой таблицы:

  db.createTable("tabl", columns);

Для того, чтобы создать запись в таблице, нужно выполнить следующий код:

  Table newTable = db.getTable("tabl");

  newTable.addRow(new Object[] {"value"});

Ну и последнее, базу данных после работы необходимо закрывать:

  db.flush();
  db.close();

Самое главное - не забыть выполнить flush, особенно если сразу после наполнения базы данными необходимо отдать mdb-файл пользователю на скачивание или использовать внутри приложения для других целей. В первый раз я совершил такую ошибку и сразу закрывал базу данных. Результат - скачивался недописанный файл.

Если вы знаете еще какие-нибудь библиотеки для работы с MS Access, пишите - обсудим.
Всего хорошего.

7 Comments »

RSS feed for comments on this post.



January 23, 2008 #

А я бы посоветовал бы использовать биплатный хибернэйт. Правда
там почему-то нет соответствующего диалекта. Однако это не беда, можно и свой отнаследовать от стандартного Dialect, по типу этого -
SQL dialect for Microsoft Access.

Сергей
February 7, 2008 #

Не так много работал с hibernate, но, если я не ошибаюсь, hibernate использует jdbc драйвер. А с драйверами для access’а проблемы.

April 4, 2008 #

Samsonych ну вы и предложили из пушки по воробьям. Я долго работал с Hibernate и думаю, что не ошибусь, утверждая, что данное решение лучше всего подходит для больших приложений из сферы J2EE. Мне трудно представить себе Java приложение, работающее с Access которому необходимо тащить за собой в зависимостях хибернейт. Все-таки если надо 3 связанных таблички замапить можно и что-то полегче взять (да и даже как вариант свое написать), а если нужно что-то сложнее, то зачем Access?

April 4, 2008 #

Да, хибернейт тут не нужен.
Есть другая тема - можно генерировать специфический для MS Access SQL в текстовом формате, а потом из базы его импортировать. Это и по скорости генерации будет классно и для клиента не очень напряжно :). Если дойдут до этого руки, обязательно выложу код генератора.

April 5, 2008 #

2 Samolisov Pavel:
В общем вы конечно правы насчет тяжеловесности hibernate для данного приложения. Я просто исходил из беспланости и кросссубдшности решения. Хотя согласитесь использование MS Access в качестве контейнера под Linux - выглядит несколько извращенно. В данном случае отлично подошел бы hsqldb. А если приложение будет использоваться только под виндой, то можно и jdbc-odbc мостом обойтись.

April 5, 2008 #

>> Хотя согласитесь использование MS Access в качестве контейнера под Linux - выглядит несколько извращенно.

Согласен с вами, тем более ходят слухи что в 2009м офисе MS отказывается от Access в пользу MS SQL Server Expres. А сейчас очень пиарит SQL Server Compact.

Кстати не знаток, а есть кросс-платформенная файл-ориентированная СУБД?

April 5, 2008 #

Кстати не знаток, а есть кросс-платформенная файл-ориентированная СУБД?

Думаю hsqldb вполне подходит под данное определение вопроса, так как полностью реализованна на Java.
Возможно есть смысл посмотреть на SQLite, но конкретно с ней не работал.

Leave a comment

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>