Управление базой данных 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 должен выглядеть примерно так
NetBeans: Expand the tree view for your project, right-click the "Libraries" folder and choose "Add JAR/Folder...", then browse to the JAR file.
After adding all five (5) JAR files the "Libraries" folder should look something like this:
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:
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.