Manipular una base de datos de Access desde Java sin ODBC
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).
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.jar
a su ruta de compilación si está agregando los otros cinco (5) archivos JAR. LaUcanloadDriver
clase 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í
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.
Después de agregar los cinco (5) archivos JAR, la carpeta "Bibliotecas" debería verse así:
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í:
¡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.