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

114

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

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

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

(Мы также приветствовали бы ответы, предлагающие более эффективные способы работы с базами данных Access из Java.)

Горд Томпсон
источник
Горд, я бы хотел с тобой связаться. Электронный адрес, возможно ли это? Cheers
bonCodigo
Вы можете использовать классы jdbc odbc из jre7 также в jre8 - см. Stackoverflow.com/a/34617075/2110961
Фрэнк М.

Ответы:

160

UCanAccess - это чистый драйвер JDBC для Java, который позволяет нам читать и записывать в базы данных 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: добавление файлов JAR в проект вручную

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

UCanAccess (ucanaccess-xxxjar)
HSQLDB (hsqldb.jar, версия 2.2.5 или новее)
Jackcess (jackcess-2.xxjar)
commons-lang (commons-lang-2.6.jar или более новая версия 2.x )
commons-logging ( 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.... Нажмите кнопку «Добавить внешние JAR…», чтобы добавить каждый из пяти (5) JAR. Когда вы закончите, ваш путь сборки Java должен выглядеть примерно так

BuildPath.png

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

nbAddJar.png

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

nbLibraries.png

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

IntelliJ.png

 

Это оно!

Теперь "U Can Access" данные в файлах .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));
}

 

раскрытие

На момент написания этого Q&A я не участвовал в проекте UCanAccess и не был связан с ним; Я просто использовал это. С тех пор я стал участником этого проекта.

Горд Томпсон
источник
2
Имеете ли вы какое-либо отношение к этой библиотеке? Возможно, стоит раскрыть это, если вы это сделаете.
Джо
Можно ли использовать это для подключения к книге Excel (.xlsx) в Java 8?
steinbitur
2
@ sємsєм Класс водителяnet.ucanaccess.jdbc.UcanaccessDriver
Горд Томпсон
1
@GordThompson Это отличный ответ. Весь мой класс застрял в этой проблеме, полагая, что это ошибка привилегий файловой системы. Помогло мне много, и потребовалось удивительное количество копаний, чтобы понять, что Oracle покончила с мостом JDBC-ODBC из Java 8.
wilbomc
1
Как насчет интеграции источника данных UcanAcces в JPA с Hibernate и Spring?
Уоррен М. Нокос,