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

- 创建一个名为
test.accdb的 Access 数据库文件。 - 在该数据库中创建一个表,
students。id(自动编号,主键)name(文本)age(数字)
- 向
students表中插入几条示例数据。
假设你将 test.accdb 文件放在了你的 Java 项目的根目录下。
MyJavaProject/
├── src/
│ └── com/
│ └── example/
│ └── Main.java
├── lib/ <-- 我们稍后会把驱动包放这里
└── test.accdb <-- 你的 Access 数据库文件
第二步:下载 JDBC 驱动程序 (UCanAccess)
- 访问 UCanAccess 的官方发布页面:https://github.com/ucanaccess/ucanaccess/releases
- 下载最新的 "Release Bundle" (
ucanaccess-5.0.1-bin.zip),这是一个 ZIP 压缩包。 - 解压这个 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)
- 在你的项目中创建一个名为
lib的文件夹。 - 将上一步解压出的 所有
.jar文件复制到lib文件夹中。 - 在你的 IDE 中,右键点击项目 -> Build Path / Project Structure -> Libraries / Modules。
- 添加一个 "Library" 或 "Module SDK",然后选择 "External JARs...",并选中
lib文件夹中的所有.jar文件。 - 确保这些 JAR 文件被添加到项目的编译路径和运行路径中。
使用 Maven (推荐)
这是现代 Java 项目的标准做法,能自动管理依赖。
- 如果你使用 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 会自动下载所有必需的传递性依赖(如 jackcess 和 hsqldb)。

第四步:编写 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文件都已正确添加。
(图片来源网络,侵删) -
如果你使用命令行编译和运行,请确保在
javac和java命令中使用-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,或者你的连接字符串格式不正确。 解决:
- 确认你使用的是 UCanAccess,而不是其他已废弃的驱动。
- 检查连接字符串,确保它以
jdbc:ucanaccess://开头,并且路径正确,如果路径中有空格,最好用引号括起来或使用 URL 编码(%20)。
Q3: 数据库文件被锁定,无法写入 (The database is exclusively locked...)
原因:Access 数据库文件在同一时间只能被一个进程独占写入,如果另一个 Access 实例、或者你的 Java 程序没有正确关闭连接,就会导致文件被锁定。 解决:
- 确保没有其他程序(如 Microsoft Access)正在打开数据库文件,关闭所有可能打开它的程序。
- 在代码中总是使用
try-with-resources,如上面的示例所示,这样可以确保Connection,Statement, 和ResultSet对象在代码块执行完毕后自动关闭,释放资源。 - 检查你的代码,在执行更新操作前,确保之前的连接已经关闭。
Q4: 如何连接 .mdb 文件?
解决:UCanAccess 同时支持 .accdb 和 .mdb 文件,连接字符串的写法完全一样,只需要将文件名后缀改为 .mdb 即可。
private static final String DB_URL = "jdbc:ucanaccess://mydatabase.mdb";
连接 Java 和 Access 数据库的最佳实践是:
- 使用 UCanAccess 驱动:它是最现代、最可靠的纯 Java 解决方案。
- 使用 Maven 管理依赖:简化项目配置和依赖管理。
- 使用
try-with-resources:确保数据库资源被正确释放,避免文件锁定问题。 - 使用列名访问结果集:代码更具可读性和健壮性。
希望这份详细的指南能帮助你成功连接 Java 和 Access!
