在没有 ODBC 的情况下从 Java 操作 Access 数据库

2022-08-31 09:01:29

我想从我的 Java 项目中操作 Microsoft Access 数据库(.accdb或.mdb文件)。我不想使用微软的JDBC-ODBC Bridge和Access ODBC驱动程序,因为:

  • JDBC-ODBC Bridge 已从 Java SE 8 中删除,并且不受支持(参考:此处),
  • 当文本包含代码点高于 U+00FF 的 Unicode 字符时,JDBC-ODBC 桥接无法与 Access ODBC 驱动程序一起正常工作(参考:此处),因此此类设置将无法处理诸如希腊语、俄语、中文、阿拉伯语等字符。
  • 来自Microsoft的Access ODBC驱动程序仅适用于Windows,并且
  • 有单独的 32 位和 64 位版本的 Access 数据库引擎(和 ODBC 驱动程序),这可能会给部署带来麻烦。

我看到其他答案提到了名为UCanAccess的Access数据库的JDBC驱动程序。如何设置我的 Java 项目以使用此方法?

(建议使用Java的Access数据库的更好方法的答案也将是最受欢迎的。


答案 1

UCanAccess 是一个纯 Java JDBC 驱动程序,它允许我们在不使用 ODBC 的情况下读取和写入 Access 数据库。它使用另外两个包JackcessHSQLDB来执行这些任务。以下是有关如何设置它的简要概述。

 

选项 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。反过来,Jackcess有自己的依赖关系。因此,要使用UCanAccess,您需要包含以下组件:

UCanAccess (ucanaccess-x.x.x.jar)
HSQLDB (hsqldb.jar,版本 2.2.5 或更高版本)
Jackcess (jackcess-2.x.x.jar)
commons-lang (commons-lang-2.6.jar, 或更新的 2.x 版本
commons-logging (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 添加到您的项目中。

注意:如果要添加其他五 (5) 个 JAR 文件,请不要添加到构建路径中。该类仅在特殊情况下使用,并且需要不同的设置。有关详细信息,请参阅此处的相关答案。loader/ucanload.jarUcanloadDriver

日蚀:在包资源管理器中右键单击该项目,然后选择 。单击“添加外部 JAR...”按钮添加五 (5) 个 JAR 中的每一个。完成后,您的 Java 构建路径应如下所示Build Path > Configure Build Path...

BuildPath.png

NetBeans:展开项目的树视图,右键单击“库”文件夹并选择“添加 JAR/文件夹...”,然后浏览到 JAR 文件。

nbAddJar.png

添加所有五 (5) 个 JAR 文件后,“库”文件夹应如下所示:

nbLibraries.png

IntelliJ IDEA:从主菜单中选择。在“库”窗格中,单击“添加”()按钮,然后添加五 (5) 个 JAR 文件。完成此操作后,项目应如下所示:File > Project Structure...+

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

推荐