Manipolazione di un database di Access da Java senza ODBC


114

Voglio manipolare un database di Microsoft Access (file .accdb o .mdb) dal mio progetto Java. Non voglio utilizzare il bridge JDBC-ODBC e il driver ODBC di accesso di Microsoft perché:

  • il JDBC-ODBC Bridge è stato rimosso da Java SE 8 e non è supportato (rif: qui ),
  • il bridge JDBC-ODBC non funziona correttamente con il driver ODBC di accesso quando il testo include caratteri Unicode con punti di codice sopra U + 00FF (rif: qui ), quindi una tale configurazione non sarebbe in grado di gestire caratteri come greco, russo, cinese , Arabo, ecc.,
  • il driver Access ODBC di Microsoft funziona solo in Windows e
  • esistono versioni separate a 32 e 64 bit del motore di database di Access (e del driver ODBC) che possono essere un fastidio per la distribuzione.

Ho visto altre risposte che menzionano un driver JDBC per database di Access denominato UCanAccess . Come posso impostare il mio progetto Java per utilizzare questo approccio?

(Le risposte che suggeriscono modi migliori di lavorare con i database di Access da Java sarebbero anche le benvenute.)


Gord vorrei metterti in contatto con te. Indirizzo email, è possibile? Saluti
bonCodigo

Puoi utilizzare le classi odbc jdbc da jre7 anche in jre8 - vedi stackoverflow.com/a/34617075/2110961
Frank M.

Risposte:


160

UCanAccess è un puro driver Java JDBC che ci consente di leggere e scrivere su database di Access senza utilizzare ODBC. Utilizza altri due pacchetti, Jackcess e HSQLDB , per eseguire queste attività. Quella che segue è una breve panoramica su come configurarlo.

 

Opzione 1: utilizzo di Maven

Se il tuo progetto utilizza Maven puoi semplicemente includere UCanAccess tramite le seguenti coordinate:

groupId: net.sf.ucanaccess
artifactId: ucanaccess

Quello che segue è un estratto da pom.xml, potrebbe essere necessario aggiornare <version>per ottenere la versione più recente:

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

 

Opzione 2: aggiunta manuale dei JAR al progetto

Come accennato in precedenza, UCanAccess richiede Jackcess e HSQLDB. Jackcess a sua volta ha le sue dipendenze . Quindi per usare UCanAccess dovrai includere i seguenti componenti:

UCanAccess (ucanaccess-xxxjar)
HSQLDB (hsqldb.jar, versione 2.2.5 o successiva)
Jackcess (jackcess-2.xxjar)
commons-lang (commons-lang-2.6.jar, o versione 2.x più recente )
commons-logging ( commons-logging-1.1.1.jar o versione 1.x più recente )

Fortunatamente, UCanAccess include tutti i file JAR richiesti nel suo file di distribuzione. Quando lo decomprimerai vedrai qualcosa di simile

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

Tutto quello che devi fare è aggiungere tutti e cinque (5) i JAR al tuo progetto.

NOTA: non aggiungere loader/ucanload.jaral percorso di compilazione se si stanno aggiungendo gli altri cinque (5) file JAR. La UcanloadDriverclasse viene utilizzata solo in circostanze speciali e richiede una configurazione diversa. Vedere la relativa risposta qui per i dettagli.

Eclipse: fai clic con il pulsante destro del mouse sul progetto in Package Explorer e scegli Build Path > Configure Build Path.... Fare clic sul pulsante "Aggiungi JAR esterni ..." per aggiungere ciascuno dei cinque (5) JAR. Quando hai finito, il tuo Java Build Path dovrebbe assomigliare a questo

BuildPath.png

NetBeans: espandere la visualizzazione ad albero del progetto, fare clic con il pulsante destro del mouse sulla cartella "Librerie" e scegliere "Aggiungi JAR / cartella ...", quindi individuare il file JAR.

nbAddJar.png

Dopo aver aggiunto tutti e cinque (5) i file JAR, la cartella "Librerie" dovrebbe essere simile a questa:

nbLibraries.png

IntelliJ IDEA: scegli File > Project Structure...dal menu principale. Nel riquadro "Librerie" fare clic sul pulsante "Aggiungi" ( +) e aggiungere i cinque (5) file JAR. Una volta fatto ciò, il progetto dovrebbe assomigliare a questo:

IntelliJ.png

 

Questo è tutto!

Ora "Puoi accedere" ai dati nei file .accdb e .mdb usando un codice come questo

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

 

Divulgazione

Al momento della stesura di queste domande e risposte non avevo alcun coinvolgimento o affiliazione con il progetto UCanAccess; L'ho appena usato. Da allora sono diventato un collaboratore del progetto.


2
Hai qualche affiliazione con questa libreria? Potrebbe valere la pena rivelarlo se lo fai.
Joe

Puoi usarlo per connetterti a una cartella di lavoro Excel (.xlsx) in Java 8?
steinbitur

2
@ sємsєм La classe del conducente ènet.ucanaccess.jdbc.UcanaccessDriver
Gord Thompson,

1
@GordThompson Questa è un'ottima risposta. Tutta la mia classe era bloccata con questo problema credendo che fosse un errore di privilegio del file system. Mi ha aiutato moltissimo e ci sono voluti una quantità sorprendente di scavi per realizzare Oracle che ha eliminato il bridge JDBC-ODBC da Java 8.
wilbomc

1
Che ne dici di integrare l'origine dati UcanAcces su JPA con Hibernate e Spring?
Warren M. Nocos
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.