杰瑞科技汇

Java如何连接Access数据库?

核心要点

  1. 驱动程序:Java 本身不直接支持 Access,你需要一个 JDBC 驱动程序,目前最常用、推荐的是 UCanAccess,它是一个纯 Java 实现,无需安装 Access 或 ODBC 驱动,非常方便。
  2. 数据库文件:Access 数据库是一个文件,通常以 .accdb (Access 2007 及以上版本) 或 .mdb (旧版本) 为后缀,你的 Java 程序需要知道这个文件的路径。
  3. 连接字符串:这是连接数据库的关键,它告诉 JDBC 驱动程序如何连接到你的 Access 文件。

第一步:准备 Access 数据库文件

你需要一个 Access 数据库文件。

Java如何连接Access数据库?-图1
(图片来源网络,侵删)
  1. 创建一个名为 test.accdb 的 Access 数据库文件。
  2. 在该数据库中创建一个表,students
    • id (自动编号,主键)
    • name (文本)
    • age (数字)
  3. students 表中插入几条示例数据。

假设你将 test.accdb 文件放在了你的 Java 项目的根目录下。

MyJavaProject/
├── src/
│   └── com/
│       └── example/
│           └── Main.java
├── lib/              <-- 我们稍后会把驱动包放这里
└── test.accdb        <-- 你的 Access 数据库文件

第二步:下载 JDBC 驱动程序 (UCanAccess)

  1. 访问 UCanAccess 的官方发布页面:https://github.com/ucanaccess/ucanaccess/releases
  2. 下载最新的 "Release Bundle" (ucanaccess-5.0.1-bin.zip),这是一个 ZIP 压缩包。
  3. 解压这个 ZIP 文件,你会看到很多 .jar 文件,我们主要需要以下几个核心库:
    • ucanaccess-x.x.x.jar (核心驱动)
    • jackcess-x.x.x.jar (读取 Access 文件格式)
    • hsqldb-x.x.x.jar (依赖的数据库引擎)
    • commons-lang-x.x.jar (依赖的通用工具库)

第三步:配置项目环境

你有两种主要方式将驱动库添加到你的项目中:

手动添加到项目库 (适合 Eclipse, IntelliJ IDEA 等传统 IDE)

  1. 在你的项目中创建一个名为 lib 的文件夹。
  2. 将上一步解压出的 所有 .jar 文件复制到 lib 文件夹中。
  3. 在你的 IDE 中,右键点击项目 -> Build Path / Project Structure -> Libraries / Modules。
  4. 添加一个 "Library" 或 "Module SDK",然后选择 "External JARs...",并选中 lib 文件夹中的所有 .jar 文件。
  5. 确保这些 JAR 文件被添加到项目的编译路径和运行路径中。

使用 Maven (推荐)

这是现代 Java 项目的标准做法,能自动管理依赖。

  1. 如果你使用 Maven,确保你的 pom.xml 文件中有以下依赖:
<dependencies>
    <!-- UCanAccess JDBC Driver -->
    <dependency>
        <groupId>com.github.u-can-access</groupId>
        <artifactId>ucanaccess</artifactId>
        <version>5.0.1</version> <!-- 使用你下载的版本号 -->
    </dependency>
</dependencies>

Maven 会自动下载所有必需的传递性依赖(如 jackcesshsqldb)。

Java如何连接Access数据库?-图2
(图片来源网络,侵删)

第四步:编写 Java 连接代码

下面是一个完整的、可运行的 Java 示例,它演示了如何连接到 Access 数据库、执行查询、处理结果集,并执行更新操作。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class AccessConnectionExample {
    // 数据库连接URL
    // 这是关键!格式为: jdbc:ucanaccess://<数据库文件的绝对路径或相对路径>
    // 如果数据库文件在项目根目录下,可以直接写文件名
    private static final String DB_URL = "jdbc:ucanaccess://test.accdb";
    public static void main(String[] args) {
        // try-with-resources 语句,确保连接、语句和结果集在使用后自动关闭
        try (Connection conn = DriverManager.getConnection(DB_URL);
             Statement stmt = conn.createStatement()) {
            System.out.println("成功连接到 Access 数据库!");
            // --- 示例1: 查询数据 ---
            System.out.println("\n--- 查询学生信息 ---");
            String sqlSelect = "SELECT id, name, age FROM students";
            try (ResultSet rs = stmt.executeQuery(sqlSelect)) {
                while (rs.next()) {
                    // 通过列名获取数据,更安全
                    int id = rs.getInt("id");
                    String name = rs.getString("name");
                    int age = rs.getInt("age");
                    System.out.println("ID: " + id + ", 姓名: " + name + ", 年龄: " + age);
                }
            }
            // --- 示例2: 插入数据 ---
            System.out.println("\n--- 插入新学生 ---");
            String sqlInsert = "INSERT INTO students (name, age) VALUES ('王五', 25)";
            int rowsInserted = stmt.executeUpdate(sqlInsert);
            if (rowsInserted > 0) {
                System.out.println("成功插入 " + rowsInserted + " 行数据。");
            }
            // --- 示例3: 更新数据 ---
            System.out.println("\n--- 更新学生年龄 ---");
            String sqlUpdate = "UPDATE students SET age = 26 WHERE name = '王五'";
            int rowsUpdated = stmt.executeUpdate(sqlUpdate);
            if (rowsUpdated > 0) {
                System.out.println("成功更新 " + rowsUpdated + " 行数据。");
            }
            // --- 示例4: 删除数据 ---
            System.out.println("\n--- 删除学生记录 ---");
            String sqlDelete = "DELETE FROM students WHERE name = '王五'";
            int rowsDeleted = stmt.executeUpdate(sqlDelete);
            if (rowsDeleted > 0) {
                System.out.println("成功删除 " + rowsDeleted + " 行数据。");
            }
        } catch (SQLException e) {
            System.err.println("数据库操作出错!");
            e.printStackTrace();
        }
    }
}

第五步:运行程序

确保你的 test.accdb 文件位置正确,然后运行 main 方法,如果一切配置无误,你将在控制台看到类似下面的输出:

成功连接到 Access 数据库!
--- 查询学生信息 ---
ID: 1, 姓名: 张三, 年龄: 20
ID: 2, 姓名: 李四, 年龄: 22
--- 插入新学生 ---
成功插入 1 行数据。
--- 更新学生年龄 ---
成功更新 1 行数据。
--- 删除学生记录 ---
成功删除 1 行数据。

常见问题与解决方案

Q1: java.lang.ClassNotFoundException: net.ucanaccess.jdbc.UcanaccessDriver

原因:JVM 在运行时找不到 UCanAccess 的驱动类,这通常是因为你忘记将 .jar 文件添加到项目的类路径中。 解决

  • 如果你使用的是 IDE,请检查 Build Path / Project Structure 设置,确保所有 .jar 文件都已正确添加。

    Java如何连接Access数据库?-图3
    (图片来源网络,侵删)
  • 如果你使用命令行编译和运行,请确保在 javacjava 命令中使用 -cp-classpath 选项指定所有 .jar 文件的路径。

    # 编译
    javac -cp ".;lib/ucanaccess-5.0.1.jar;lib/jackcess-3.0.1.jar;lib/hsqldb-2.5.2.jar;lib/commons-lang3-3.12.0.jar" src/com/example/Main.java
    # 运行
    java -cp ".;lib/ucanaccess-5.0.1.jar;lib/jackcess-3.0.1.jar;lib/hsqldb-2.5.2.jar;lib/commons-lang3-3.12.0.jar" com.example.Main

    (注意:Windows 系统使用分号 分隔路径,Linux/macOS 使用冒号 )

Q2: java.io.IOException: [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified

原因:这个错误很经典,它表明你使用的可能是旧的 ODBC 驱动方式,而不是推荐的 UCanAccess,或者你的连接字符串格式不正确。 解决

  1. 确认你使用的是 UCanAccess,而不是其他已废弃的驱动。
  2. 检查连接字符串,确保它以 jdbc:ucanaccess:// 开头,并且路径正确,如果路径中有空格,最好用引号括起来或使用 URL 编码(%20)。

Q3: 数据库文件被锁定,无法写入 (The database is exclusively locked...)

原因:Access 数据库文件在同一时间只能被一个进程独占写入,如果另一个 Access 实例、或者你的 Java 程序没有正确关闭连接,就会导致文件被锁定。 解决

  1. 确保没有其他程序(如 Microsoft Access)正在打开数据库文件,关闭所有可能打开它的程序。
  2. 在代码中总是使用 try-with-resources,如上面的示例所示,这样可以确保 Connection, Statement, 和 ResultSet 对象在代码块执行完毕后自动关闭,释放资源。
  3. 检查你的代码,在执行更新操作前,确保之前的连接已经关闭。

Q4: 如何连接 .mdb 文件?

解决:UCanAccess 同时支持 .accdb.mdb 文件,连接字符串的写法完全一样,只需要将文件名后缀改为 .mdb 即可。

private static final String DB_URL = "jdbc:ucanaccess://mydatabase.mdb";

连接 Java 和 Access 数据库的最佳实践是:

  1. 使用 UCanAccess 驱动:它是最现代、最可靠的纯 Java 解决方案。
  2. 使用 Maven 管理依赖:简化项目配置和依赖管理。
  3. 使用 try-with-resources:确保数据库资源被正确释放,避免文件锁定问题。
  4. 使用列名访问结果集:代码更具可读性和健壮性。

希望这份详细的指南能帮助你成功连接 Java 和 Access!

分享:
扫描分享到社交APP
上一篇
下一篇