Вопрос-ответ

Manipulating an Access database from Java without ODBC

Управление базой данных Access из Java без ODBC

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


  • Мост JDBC-ODBC был удален из Java SE 8 и не поддерживается (ссылка: здесь),

  • Мост JDBC-ODBC не работает должным образом с драйвером Access ODBC, когда текст содержит символы Юникода с кодовыми точками выше U + 00FF (ссылка: здесь), поэтому такая настройка не сможет обрабатывать такие символы, как греческий, русский, китайский, арабский и т.д.,

  • драйвер Access ODBC от Microsoft работает только в Windows, и

  • существуют отдельные 32-разрядные и 64-разрядные версии компонента Access Database Engine (и драйвера ODBC), которые могут создавать неудобства при развертывании.

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

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

Переведено автоматически
Ответ 1

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

 

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

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

groupId: 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: добавление JARS вручную в ваш проект

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

UCanAccess (ucanaccess-x.x.x.jar)

HSQLDB (hsqldb.jar, версия 2.2.5 или новее)

Jackcess (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: щелкните проект правой кнопкой мыши в проводнике пакетов и выберите Build Path > Configure Build Path.... Нажмите кнопку "Добавить внешние банки данных ...", чтобы добавить каждую из пяти (5) банок данных. Когда вы закончите, ваш путь сборки Java должен выглядеть примерно так

Путь к сборке.png

NetBeans: Expand the tree view for your project, right-click the "Libraries" folder and choose "Add JAR/Folder...", then browse to the JAR file.

nbAddJar.png

After adding all five (5) JAR files the "Libraries" folder should look something like this:

nbLibraries.png

IntelliJ IDEA: Choose File > Project Structure... from the main menu. In the "Libraries" pane click the "Add" (+) button and add the five (5) JAR files. Once that is done the project should look something like this:

IntelliJ.png

 

That's it!

Now "U Can Access" data in .accdb and .mdb files using code like this

// 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));
}

 

Disclosure

At the time of writing this Q&A I had no involvement in or affiliation with the UCanAccess project; I just used it. I have since become a contributor to the project.

java