Manipular una base de datos de Access desde Java sin ODBC

114

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

  • el puente JDBC-ODBC se ha eliminado 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 por encima de U + 00FF (ref: aquí ), por lo que dicha configuración no podría manejar caracteres como griego, ruso, chino , Árabe, etc.,
  • el controlador Access ODBC de Microsoft solo funciona en Windows, y
  • hay versiones separadas de 32 bits y 64 bits del motor de base de datos de Access (y el 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?

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

Gord Thompson
fuente
Gord, me gustaría ponerme en contacto contigo. Dirección de correo electrónico, ¿es posible? Saludos
bonCodigo
Puede usar las clases de jdbc odbc de jre7 también en jre8 - consulte stackoverflow.com/a/34617075/2110961
Frank M.

Respuestas:

160

UCanAccess es un controlador JDBC de Java puro que nos permite leer y escribir en bases de datos de Access sin usar 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:

groupId: net.sf.ucanaccess
artifactId: ucanaccess

El siguiente es un extracto de pom.xml, es posible que deba actualizar <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 archivos JAR a su proyecto

Como se mencionó anteriormente, UCanAccess requiere Jackcess y HSQLDB. Jackcess a su vez tiene sus propias dependencias . Entonces, para usar UCanAccess, deberá 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 una versión 1.x más reciente )

Afortunadamente, UCanAccess incluye todos los archivos JAR necesarios en su archivo de distribución. Cuando lo descomprima verá 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 añadir loader/ucanload.jara su ruta de compilación si va a agregar los otros archivos de cinco (5) JAR. La UcanloadDriverclase solo se usa en circunstancias especiales y requiere una configuración diferente. Consulte la respuesta relacionada aquí para obtener más detalles.

Eclipse: haga clic con el botón 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í

BuildPath.png

NetBeans: expanda la vista de árbol de su proyecto, haga clic con el botón derecho en la carpeta "Bibliotecas" y seleccione "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í:

nbLibraries.png

IntelliJ IDEA: Elija File > Project Structure...del 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!

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

 

Divulgar

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

Gord Thompson
fuente
2
¿Tiene alguna afiliación con esta biblioteca? Podría valer la pena revelarlo si lo hace.
Joe
¿Puede usar esto para conectarse a un libro de Excel (.xlsx) en Java 8?
steinbitur
2
@ sємsєм La clase del conductor esnet.ucanaccess.jdbc.UcanaccessDriver
Gord Thompson
1
@GordThompson Esa es una gran respuesta. Toda mi clase estaba atascada con este problema creyendo que era un error de privilegio del sistema de archivos. Me ayudó mucho y me tomó una cantidad sorprendente de excavación para darme cuenta de que Oracle
eliminó el
1
¿Qué tal la integración de la fuente de datos UcanAcces a JPA con Hibernate y Spring?
Warren M. Nocos