Маніпуляція базою даних Access з Java без ODBC


114

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

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

Я бачив інші відповіді, де згадується драйвер JDBC для баз даних Access з назвою UCanAccess . Як я можу створити свій проект Java для використання цього підходу?

(Відповіді, які пропонують кращі способи роботи з базами даних Access від Java, також були б дуже вітаються.)


Горд, я хотів би зв’язатися з тобою. Адреса електронної пошти, це можливо? Ура
bonCodigo

Ви можете використовувати jdbc odbc класи від jre7 також у jre8 - див. Stackoverflow.com/a/34617075/2110961
Frank M.

Відповіді:


160

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: Вручну додати JAR до свого проекту

Як було сказано вище, UCanAccess вимагає Jackcess та HSQLDB. Джексекс у свою чергу має свої залежності . Тому для використання UCanAccess вам потрібно буде включити такі компоненти:

UCanAccess (ucanaccess-xxxjar)
HSQLDB (hsqldb.jar, версія 2.2.5 або пізніша версія)
Jackcess (jackcess-2.xxjar)
Загально-Ленга (Загально-Ланг-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: Клацніть правою кнопкою миші проект у Explorer Explorer і виберіть Build Path > Configure Build Path.... Натисніть кнопку "Додати зовнішні JARs ...", щоб додати кожен із п'яти (5) JAR. Коли ви закінчите, ваш шлях складання Java повинен виглядати приблизно так

BuildPath.png

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

nbAddJar.png

Після додавання всіх п'яти (5) файлів JAR папка "Бібліотеки" повинна виглядати приблизно так:

nbLibraries.png

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

IntelliJ.png

 

Це воно!

Тепер дані "U може отримати доступ" у файлах .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 і не був причетним до нього; Я просто користувався цим. З тих пір я став учасником проекту.


2
Чи є у вас приналежність до цієї бібліотеки? Можливо, варто розкрити це, якщо ви це зробите.
Джо

Чи можете ви використовувати це для підключення до робочої книги Excel (.xlsx) на Java 8?
steinbitur

2
@ sêsêм Клас водіяnet.ucanaccess.jdbc.UcanaccessDriver
Gord Thompson,

1
@GordThompson Це чудова відповідь. Увесь мій клас був застряг у цьому питанні, вважаючи, що це помилка привілеїв файлової системи. Допоміг мені вантажу, і знадобилося дивовижна кількість копання, щоб зрозуміти, що Oracle покінчив з мостом JDBC-ODBC з Java 8.
wilbomc

1
Як щодо інтеграції джерела даних UcanAcces до JPA зі сплячим режимом та Spring?
Уоррен М. Нокос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.