连接 Access 数据库与连接 MySQL、SQL Server 等主流数据库有所不同,因为它主要使用 JDBC-ODBC 桥接驱动,虽然这种驱动方式在现代 Java 开发中已不推荐(因为 ODBC 依赖于 Windows 操作系统),但对于一些旧的系统或简单的桌面应用来说,它仍然是一个非常直接和有效的解决方案。

下面我将分步为您讲解整个过程,包括环境准备、代码示例和常见问题。
核心概念:JDBC-ODBC 桥
- ODBC (Open Database Connectivity): 这是微软提供的一个标准的数据库访问接口,Windows 操作系统自带了 ODBC 数据管理器,你可以通过它来配置任何数据库的“数据源名称”(DSN)。
- JDBC (Java Database Connectivity): 这是 Java 提供的用于执行 SQL 语句的 Java API。
- JDBC-ODBC 桥: 这是一个 JDBC 驱动程序,它的作用是充当“翻译官”,它将 Java 的 JDBC 调用翻译成 ODBC 的调用,从而让 Java 程序能够通过 ODBC 去访问 Access 数据库。
简单流程:Java 程序 -> JDBC API -> JDBC-ODBC 桥 -> ODBC -> Access 数据库
第一步:环境准备
准备 Access 数据库文件
你需要一个 .accdb (Access 2007及以上版本) 或 .mdb (Access 2003及更早版本) 文件。
为了演示,我们创建一个名为 students.accdb 的数据库,并在其中创建一个名为 student_info 的表,并插入几条数据。
student_info 表结构:
| 字段名 | 数据类型 | 说明 |
| :--- | :--- | :--- |
| id | 自动编号 | 主键 |
| name | 文本 | 学生姓名 |
| age | 数字 | 学生年龄 |
| gender | 文本 | 学生性别 |

示例数据: | id | name | age | gender | | :--- | :--- | :--- | :--- | | 1 | 张三 | 20 | 男 | | 2 | 李四 | 21 | 女 | | 3 | 王五 | 22 | 男 |
将 students.accdb 文件放在一个固定的路径下,D:\database\students.accdb。
配置 ODBC 数据源 (DSN)
这是最关键的一步,需要你在 Windows 操作系统上进行配置。
-
打开 ODBC 数据源管理器。
(图片来源网络,侵删)- Windows 10/11: 在开始菜单搜索 "ODBC" 或 "数据源",然后选择 “ODBC 数据源 (64 位)” (如果你的 Java 是 64 位) 或 “ODBC 数据源 (32 位)” (如果你的 Java 是 32 位)。注意:必须选择与你的 JVM 架构一致的版本!
- Windows 7: 控制面板 -> 管理工具 -> 数据源 (ODBC)。
-
在弹出的窗口中,切换到 “用户 DSN” (User DSN) 选项卡,然后点击 “添加” (Add...) 按钮。
-
在驱动列表中,找到 Microsoft Access Driver (.mdb, .accdb),然后点击 “完成”。
-
配置数据源信息:
- 数据源名称: 为你的数据源起一个名字,
MyAccessDB,这个名字非常重要,Java 代码中会用到。 - 说明: 可选,可以写一些描述性文字。
- 数据库: 点击 “选择” 按钮,然后浏览并选择你之前创建的
students.accdb文件。
- 数据源名称: 为你的数据源起一个名字,
-
点击 “确定” 保存。
MyAccessDB会出现在用户 DSN 列表中,再次点击 “确定” 关闭 ODBC 数据源管理器。
至此,环境配置完成!
第二步:Java 代码实现
创建 Java 项目
在你的 IDE (如 IntelliJ IDEA, Eclipse) 中创建一个新的 Java 项目。
编写连接和查询代码
由于 JDBC-ODBC 桥是 Java 自带的,所以你不需要额外下载任何 JAR 包。
下面是一个完整的示例代码,它连接到我们刚刚配置的 DSN,并查询 student_info 表中的所有数据。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class AccessDBConnection {
// ODBC 数据源名称
private static final String DB_URL = "jdbc:odbc:MyAccessDB";
// 注意:Access 数据库通常没有用户名和密码,或者可以留空
private static final String USER = "";
private static final String PASS = "";
public static void main(String[] args) {
// try-with-resources 语句,可以自动关闭资源
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name, age, gender FROM student_info")) {
// 检查连接是否成功
if (conn != null) {
System.out.println("成功连接到 Access 数据库!");
}
System.out.println("--------------------------------------------------");
System.out.println("ID\tName\tAge\tGender");
System.out.println("--------------------------------------------------");
// 遍历结果集
while (rs.next()) {
// 通过列名获取数据,更安全且可读性高
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
String gender = rs.getString("gender");
// 打印出每一行数据
System.out.println(id + "\t" + name + "\t" + age + "\t" + gender);
}
} catch (SQLException e) {
// 捕获并处理 SQL 异常
System.err.println("数据库连接或查询失败!");
e.printStackTrace();
}
}
}
运行代码
如果一切顺利,你将看到以下输出:
成功连接到 Access 数据库!
--------------------------------------------------
ID Name Age Gender
--------------------------------------------------
1 张三 20 男
2 李四 21 女
3 王五 22 男
第三步:代码解析
-
加载驱动 (隐式) 在 JDBC 4.0 (Java 6 及以上) 之后,
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver")这行代码不再是必需的,驱动程序会自动在类路径中注册,如果你使用的是更早的 Java 版本,则需要手动加载。 -
建立连接
DriverManager.getConnection()是获取连接的核心方法。DB_URL = "jdbc:odbc:MyAccessDB": 这里的MyAccessDB就是我们之前在 ODBC 管理器中设置的数据源名称。USER和PASS: 对于 Access,这两个参数通常是空的。
-
创建 Statement 对象
conn.createStatement()用于创建一个Statement对象,这个对象用于向数据库发送 SQL 语句。 -
执行查询
stmt.executeQuery("...")用于执行一个查询(SELECT)语句,并返回一个ResultSet对象,这个对象包含了查询结果。 -
处理结果集
rs.next(): 将光标移动到下一行,如果存在下一行则返回true。rs.getXXX("columnName"): 从当前行中获取指定列的数据。XXX是数据类型,如getString,getInt,getDate等,推荐使用列名而不是列索引,因为代码更具可读性,并且在表结构变化时更健壮。 -
关闭资源
try-with-resources语句是 Java 7 引入的一个非常方便的特性,它会自动在try代码块执行完毕后关闭Connection,Statement, 和ResultSet,即使发生了异常,从而避免了资源泄漏。
常见问题与解决方案
-
问题:
java.sql.SQLException: [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified- 原因: 这是最常见的错误,意味着 Java 找不到你配置的 DSN。
- 解决方案:
- 检查 ODBC 数据源名称
MyAccessDB是否拼写正确。 - 确认你是在 32位 还是 64位 的 ODBC 管理器中配置的 DSN,并且你的 Java 程序运行在对应的环境中,如果你用 64 位 JDK 运行程序,就必须使用 64 位 ODBC 管理器。
- 确认数据库文件路径是否正确。
- 检查 ODBC 数据源名称
-
问题:
java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver- 原因: 通常出现在 Java 8 之前的版本,或者 JDK 不完整的情况下。
- 解决方案: 在 Java 8 及更高版本中,此驱动已被移除,如果你必须使用旧版 Java,请确保你的 JDK 安装完整,对于现代项目,强烈建议考虑替代方案。
-
问题:
java.sql.SQLException: [Microsoft][ODBC Driver Manager] Invalid string or buffer length- 原因: 通常是因为 Java 代码中尝试获取的列数据类型与数据库中定义的类型不匹配。
- 解决方案: 检查
rs.getXXX()方法的调用,确保XXX与数据库列的数据类型一致。
替代方案:纯 JDBC 驱动
JDBC-ODBC 桥的缺点是平台依赖性强(只能在 Windows 上使用),如果你希望跨平台,可以考虑使用第三方提供的纯 JDBC 驱动。
- UCanAccess: 这是一个流行的、开源的、纯 Java 的 JDBC 驱动,用于连接 Access 数据库(
.mdb和.accdb),它不依赖 ODBC 或本地库,是跨平台的最佳选择。
使用 UCanAccess 的步骤:
- 下载 JAR 包: 从 UCanAccess 官网 下载最新版本的 ZIP 文件。
- 添加依赖: 将 ZIP 文件中的所有 JAR 文件(特别是
ucanaccess-x.x.x.jar和依赖的jackcess-x.x.jar,hsqldb-x.x.x.jar)添加到你的项目的类路径中。 - 修改连接 URL: 连接 URL 的格式完全不同。
示例代码 (UCanAccess):
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class AccessDBConnectionWithUCanAccess {
// UCanAccess 的连接 URL
// 注意:直接指向 .accdb 或 .mdb 文件的路径
private static final String DB_URL = "jdbc:ucanaccess://D:/database/students.accdb";
public static void main(String[] args) {
// UCanAccess 不需要用户名和密码
try (Connection conn = DriverManager.getConnection(DB_URL);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name, age, gender FROM student_info")) {
System.out.println("成功通过 UCanAccess 连接到 Access 数据库!");
System.out.println("--------------------------------------------------");
System.out.println("ID\tName\tAge\tGender");
System.out.println("--------------------------------------------------");
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
String gender = rs.getString("gender");
System.out.println(id + "\t" + name + "\t" + age + "\t" + gender);
}
} catch (SQLException e) {
System.err.println("UCanAccess 连接或查询失败!");
e.printStackTrace();
}
}
}
| 特性 | JDBC-ODBC 桥 | UCanAccess (推荐) |
|---|---|---|
| 依赖 | 依赖 Windows ODBC | 纯 Java,跨平台 |
| JAR 包 | 无需额外下载 | 需要下载并添加多个 JAR |
| 配置 | 需要在 Windows 中配置 DSN | 无需配置,直接指向文件路径 |
| 适用场景 | 快速原型、旧的 Windows 应用 | 现代、跨平台的桌面应用 |
| 推荐度 | ⭐⭐ (仅限特定环境) | ⭐⭐⭐⭐⭐ (首选方案) |
对于新项目,强烈推荐使用 UCanAccess,因为它更现代、更灵活且跨平台,但对于一些简单的、只在 Windows 上运行的旧项目,JDBC-ODBC 桥依然是一个可行的选择。
