Ohhnews

分类导航

$ cd ..
foojay原文

UCanAccess:连接 Microsoft Access 的现代纯 Java 桥梁

#java#数据库连接#jdbc#microsoft access#开源工具

目录 简史 它解决了什么问题?

Microsoft Access 数据库无处不在。几十年来,.mdb.accdb 文件在各种规模的组织中默默支撑着电子表格、小型商业应用程序和遗留数据存储。然而,对于 Java 开发人员来说,连接这些文件在过去意味着必须处理原生的 Windows 库、ODBC 桥接器以及各种针对特定平台的“黑科技”。

UCanAccess 终结了这一切。它是一个开源的纯 Java JDBC 驱动程序,让你能够像操作其他 SQL 数据库一样读写 Microsoft Access 数据库(.mdb.accdb)——无需原生驱动,无需依赖 Windows,也无需繁琐的配置。


简史

UCanAccess 最初由 Marco Amadei 和 Gord Thompson 创建,并迅速成为 Java 连接 Access 的首选方案。该项目价值巨大,但在 2020 年左右开发陷入了沉寂。在社区依赖了一个长期未维护的代码库一段时间后,该项目在 2022 年由现任维护者进行分支(Fork)并重启,确保了项目的持续运行和代码的整洁。

当前的分支不仅仅是一个维护版本,更是一项旨在现代化代码库的积极举措:采用 JUnit 5,通过 Checkstyle 和 PMD 强制执行严格的代码规范,保持依赖项最小化且无 CVE 漏洞,并持续改进测试覆盖率。


它解决了什么问题?

消失的桥梁

Java 8 移除了 sun.jdbc.odbc.JdbcOdbcBridge,这曾是通过 ODBC 连接 Access 数据库的遗留方案。许多项目因此陷入困境。UCanAccess 作为其纯 Java 替代品,彻底填补了这一空白。

跨平台兼容性

由于 UCanAccess 是 100% 的 Java 代码且不包含任何原生代码,因此它可以在 Linux、macOS 和 Windows 上运行。这对于容器化环境、CI/CD 流水线以及无法或不愿安装 Windows ODBC 驱动的服务器端应用程序来说至关重要。

与工具的无缝集成

UCanAccess 不仅仅适用于定制的 Java 应用程序。任何支持 JDBC 的软件环境——例如 LibreOffice BaseOpenOfficeDbVisualizerSQuirreL SQLDBeaverMATLAB——都可以通过 UCanAccess 连接到 Access 文件,而无需任何额外的配置。


技术栈与要求

  • Java 11 或更高版本(LTS 版本 17 和 21 已通过全面测试)
  • 构建工具:Maven 或 Gradle
  • 核心依赖
    • Jackcess:处理底层的 Access 二进制文件访问
    • HSQLDB:为查询转换提供内存 SQL 引擎
  • 许可证:Apache License 2.0

入门指南

添加依赖

Maven (pom.xml):

$ xml
<dependency>
    <groupId>io.github.spannm</groupId>
    <artifactId>ucanaccess</artifactId>
    <version>5.1.5</version>
</dependency>

Gradle (Kotlin DSL):

$ kotlin
implementation("io.github.spannm:ucanaccess:5.1.5")

连接与查询

连接过程与使用任何标准 JDBC 驱动一样简单,无需类注册或原生驱动设置:

$ java
import java.sql.*;

// 指向某人 2010 年“忘记”迁移的遗留文件路径
String url = "jdbc:ucanaccess:///data/legacy_system_final_v2_REAL.accdb";

try (Connection conn = DriverManager.getConnection(url);
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery("SELECT Name, Role FROM Foojay")) {

    while (rs.next()) {
        System.out.println(String.format("找到好友: %s (%s)",
                           rs.getString("Name"), rs.getString("Role")));
    }
} catch (SQLException ex) {
    System.err.println("数据库访问失败: " + ex);
}

数据回写

UCanAccess 支持完整的 DML(数据操作语言)——包括读取和写入。甚至支持部分 DDL 操作,例如 ALTER TABLE

$ java
String insert = "INSERT INTO passwd (Id, UserName, Password) VALUES (?, ?, ?)";

try (Connection conn = DriverManager.getConnection(url);
     PreparedStatement ps = conn.prepareStatement(insert)) {

    // 添加一些极其安全的遗留凭据
    ps.setInt(1, 42);
    ps.setString(2, "admin");
    ps.setString(3, "alligator3");

    int rowsAffected = ps.executeUpdate();

    System.out.println(String.format("成功更新 %d 行", rowsAffected));
} catch (SQLException ex) {
    System.err.println("凭据更新失败: " + ex);
}

Access 特有函数

在使用 Access 查询时,一个常见的痛点是使用标准 JDBC 驱动无法理解的 Access 特有 SQL 函数。UCanAccess 内置了对最常用函数的模拟,如 IIf()Nz()Format() 以及金融函数(如 PMT()PV())。原本为 Access 编写的查询通常无需修改即可直接运行。

非 Maven 项目的 Uber JAR 包

如果你正在将 UCanAccess 集成到不使用 Maven 的工具中(例如 LibreOffice Base 或 SQuirreL SQL),该项目提供了一个所谓的 Uber JAR:这是一个包含所有依赖项的单一自包含归档文件。你可以直接从 Maven Central 下载并将其放入类路径中,无需任何额外设置。


质量与维护

该活跃分支保持了极高的代码质量标准:

  • 静态分析:每次构建都会执行 Checkstyle 和 PMD 检查。
  • 测试:通过 GitHub Actions CI 在 Linux 和 Windows 上运行强大的 JUnit 5 测试套件。
  • 安全:定期的依赖项更新确保库中不存在已知的 CVE 漏洞。
  • 分发:每个版本都会发布到 Maven Central,以便于直接集成。

参与贡献

UCanAccess 的主页位于 github.com/spannm/ucanaccess。无论你是要报告 Bug、提出功能建议还是贡献测试用例,我们都非常欢迎。

如果 UCanAccess 帮助你维持了遗留系统的运行或简化了迁移工作,请考虑在 GitHub 上给它点一个 ⭐——这有助于保持项目的可见性,并向社区传达该桥梁依然活跃且维护良好的信号。


UCanAccess 基于 Apache License 2.0 授权,可在 Maven Central 获取。