Manipular una base de datos de Access desde Java sin ODBC

Resuelto Gord Thompson asked hace 10 años • 1 respuestas

Quiero manipular una base de datos de Microsoft Access (archivo .accdb o .mdb) desde mi proyecto Java. No quiero utilizar el puente JDBC-ODBC y el controlador Access ODBC de Microsoft porque:

  • el puente JDBC-ODBC se eliminó de Java SE 8 y no es compatible (ref: aquí ),
  • El puente JDBC-ODBC no funciona correctamente con el controlador ODBC de Access cuando el texto incluye caracteres Unicode con puntos de código superiores a U+00FF (ref: aquí ), por lo que dicha configuración no podría manejar caracteres como griego, ruso o chino. , árabe, etc.,
  • el controlador Access ODBC de Microsoft solo funciona en Windows, y
  • Hay versiones separadas de 32 y 64 bits de Access Database Engine (y del controlador ODBC) que pueden ser una molestia para la implementación.

He visto otras respuestas que mencionan un controlador JDBC para bases de datos de Access llamado UCanAccess . ¿Cómo puedo configurar mi proyecto Java para utilizar este enfoque?

(También serían bienvenidas las respuestas que sugieran mejores formas de trabajar con bases de datos de Access desde Java).

Gord Thompson avatar Feb 22 '14 20:02 Gord Thompson
Aceptado

UCanAccess es un controlador JDBC de Java puro que nos permite leer y escribir en bases de datos de Access sin utilizar ODBC. Utiliza otros dos paquetes, Jackcess y HSQLDB , para realizar estas tareas. La siguiente es una breve descripción general de cómo configurarlo.

 

Opción 1: usar Maven

Si su proyecto utiliza Maven, simplemente puede incluir UCanAccess a través de las siguientes coordenadas:

ID de grupo: net.sf.ucanaccess
ID de artefacto: ucanaccess

El siguiente es un extracto de pom.xml, es posible que deba actualizarlo <version>para obtener la versión más reciente:

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

 

Opción 2: agregar manualmente los JAR a su proyecto

Como se mencionó anteriormente, UCanAccess requiere Jackcess y HSQLDB. Jackcess a su vez tiene sus propias dependencias . Entonces, para utilizar UCanAccess necesitarás incluir los siguientes componentes:

UCanAccess (ucanaccess-xxxjar)
HSQLDB (hsqldb.jar, versión 2.2.5 o posterior)
Jackcess (jackcess-2.xxjar)
commons-lang (commons-lang-2.6.jar, o versión 2.x más reciente )
commons-logging ( commons-logging-1.1.1.jar o versión 1.x más reciente )

Afortunadamente, UCanAccess incluye todos los archivos JAR necesarios en su archivo de distribución. Al descomprimirlo verás algo como

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

Todo lo que necesita hacer es agregar los cinco (5) JAR a su proyecto.

NOTA: No agregue loader/ucanload.jara su ruta de compilación si está agregando los otros cinco (5) archivos JAR. La UcanloadDriverclase sólo se utiliza en circunstancias especiales y requiere una configuración diferente. Consulte la respuesta relacionada aquí para obtener más detalles.

Eclipse: haga clic derecho en el proyecto en el Explorador de paquetes y elija Build Path > Configure Build Path.... Haga clic en el botón "Agregar JAR externos..." para agregar cada uno de los cinco (5) JAR. Cuando haya terminado, su ruta de compilación de Java debería verse así

Ruta de construcción.png

NetBeans: expanda la vista de árbol de su proyecto, haga clic derecho en la carpeta "Bibliotecas" y elija "Agregar JAR/Carpeta...", luego busque el archivo JAR.

nbAddJar.png

Después de agregar los cinco (5) archivos JAR, la carpeta "Bibliotecas" debería verse así:

nbBibliotecas.png

IntelliJ IDEA: Elija File > Project Structure...en el menú principal. En el panel "Bibliotecas", haga clic en el +botón "Agregar" ( ) y agregue los cinco (5) archivos JAR. Una vez hecho esto, el proyecto debería verse así:

IntelliJ.png

 

¡Eso es todo!

Ahora "U puede acceder" a los datos en archivos .accdb y .mdb usando un código como este

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

 

Divulgación

Al momento de escribir estas preguntas y respuestas, no tenía participación ni afiliación con el proyecto UCanAccess; Lo acabo de usar. Desde entonces me he convertido en colaborador del proyecto.

Gord Thompson avatar Feb 22 '2014 13:02 Gord Thompson