Манипулирование базы данных Access с Java без ODBC

Я хочу манипулировать базой данных Microsoft Access (файл .accdb или .mdb) из моего проекта Java. Я не хочу использовать мост JDBC-ODBC и драйвер ODBC Access из Microsoft, потому что:

  • Мост JDBC-ODBC был удален из Java SE 8 и не поддерживается (ссылка: здесь),
  • Мост JDBC-ODBC не работает должным образом с драйвером Access ODBC, когда текст включает символы Unicode с кодовыми точками выше U + 00FF (ref: здесь), поэтому такая установка не сможет обрабатывать такие символы, как греческий, русский, китайский, арабский и т.д.,
  • Драйвер доступа ODBC от Microsoft работает только в Windows и
  • Существуют отдельные 32-битные и 64-разрядные версии Engine Database Engine (и драйвера ODBC), которые могут быть неприятными для развертывания.

Я видел другие ответы, в которых упоминается драйвер JDBC для баз данных Access с именем UCanAccess. Как я могу настроить свой проект Java для использования этого подхода?

(Ответы, предлагающие лучшие способы работы с базами данных Access с Java, также были бы очень желанными.)

Ответ 1

UCanAccess - это чистый JDBC-драйвер Java, который позволяет нам выполнять чтение и запись в базы данных Access без использования ODBC. Для выполнения этих задач используются два других пакета: Jackcess и HSQLDB. Ниже приведен краткий обзор того, как его настроить.

  Вариант 1. Использование Maven

Если ваш проект использует Maven, вы можете просто включить UCanAccess с помощью следующих координат:

идентификатор группы: net.sf.ucanaccess
artifactId: ucanaccess

Ниже приведен отрывок из pom.xml, вам может потребоваться обновить <version>, чтобы получить самый последний выпуск:

  <dependencies>
    <dependency>
        <groupId>net.sf.ucanaccess</groupId>
        <artifactId>ucanaccess</artifactId>
        <version>4.0.4</version>
    </dependency>
  </dependencies>

Вариант 2. Добавление JAR файлов в ваш проект вручную

Как упоминалось выше, UCanAccess требует Jackcess и HSQLDB. У Джекцесса в свою очередь есть свои зависимости. Поэтому для использования UCanAccess вам необходимо будет включить следующие компоненты:

UCanAccess (ucanaccess-x.x.x.jar)
HSQLDB (hsqldb.jar, версия 2.2.5 или новее)
Джекцесс (jackcess-2.x.x.jar)
commons-lang (commons-lang-2.6.jar или более новая версия 2.x)
регистрация общего пользования (commons-logging-1.1.1.jar или более новая версия 1.x)

К счастью, UCanAccess включает в себя все необходимые JAR файлы в своем дистрибутивном файле. Разархивировав его, вы увидите что-то вроде

ucanaccess-4.0.1.jar  
  /lib/
    commons-lang-2.6.jar  
    commons-logging-1.1.1.jar  
    hsqldb.jar  
    jackcess-2.1.6.jar

Все, что вам нужно сделать, это добавить все пять (5) JAR файлов в ваш проект.

ПРИМЕЧАНИЕ. не добавляйте loader/ucanload.jar в путь сборки, если вы добавляете остальные пять (5) файлов JAR. Класс UcanloadDriver используется только в особых обстоятельствах и требует другой настройки. Подробнее см. соответствующий ответ здесь.

Eclipse: Щелкните правой кнопкой мыши по проекту в Package Explorer и выберите Build Path > Configure Build Path.... Нажмите кнопку "Добавить внешние файлы JAR...", чтобы добавить каждый из пяти (5) файлов JAR. Когда вы закончите, ваш Java Build Path должен выглядеть примерно так

BuildPath.png

NetBeans: Разверните древовидное представление для своего проекта, щелкните правой кнопкой мыши папку "Библиотеки" и выберите "Добавить JAR/папку...", затем перейдите к файлу JAR.

nbAddJar.png

После добавления всех пяти (5) JAR файлов папка "Библиотеки" должна выглядеть примерно так:

nbLibraries.png

IntelliJ IDEA: Выберите File > Project Structure... в главном меню. На панели "Библиотеки" нажмите кнопку "Добавить" (+) и добавьте пять (5) файлов JAR. После этого проект должен выглядеть примерно так:

IntelliJ.png

  Вот оно!

Теперь вы можете получить доступ к данным в файлах .accdb и .mdb, используя такой код

// assumes...
//     import java.sql.*;
Connection conn=DriverManager.getConnection(
        "jdbc:ucanaccess://C:/__tmp/test/zzz.accdb");
Statement s = conn.createStatement();
ResultSet rs = s.executeQuery("SELECT [LastName] FROM [Clients]");
while (rs.next()) {
    System.out.println(rs.getString(1));
}

Раскрытие

На момент написания этого вопроса я не имел никакого отношения к проекту UCanAccess и не имел к нему отношения; Я просто использовал это. С тех пор я стал спонсором проекта.