杰瑞科技汇

Java如何连接Access数据库?

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

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

下面我将分步为您讲解整个过程,包括环境准备、代码示例和常见问题。


核心概念:JDBC-ODBC 桥

  1. ODBC (Open Database Connectivity): 这是微软提供的一个标准的数据库访问接口,Windows 操作系统自带了 ODBC 数据管理器,你可以通过它来配置任何数据库的“数据源名称”(DSN)。
  2. JDBC (Java Database Connectivity): 这是 Java 提供的用于执行 SQL 语句的 Java API。
  3. 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 | 文本 | 学生性别 |

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

示例数据: | id | name | age | gender | | :--- | :--- | :--- | :--- | | 1 | 张三 | 20 | 男 | | 2 | 李四 | 21 | 女 | | 3 | 王五 | 22 | 男 |

students.accdb 文件放在一个固定的路径下,D:\database\students.accdb

配置 ODBC 数据源 (DSN)

这是最关键的一步,需要你在 Windows 操作系统上进行配置。

  1. 打开 ODBC 数据源管理器

    Java如何连接Access数据库?-图3
    (图片来源网络,侵删)
    • Windows 10/11: 在开始菜单搜索 "ODBC" 或 "数据源",然后选择 “ODBC 数据源 (64 位)” (如果你的 Java 是 64 位) 或 “ODBC 数据源 (32 位)” (如果你的 Java 是 32 位)。注意:必须选择与你的 JVM 架构一致的版本!
    • Windows 7: 控制面板 -> 管理工具 -> 数据源 (ODBC)。
  2. 在弹出的窗口中,切换到 “用户 DSN” (User DSN) 选项卡,然后点击 “添加” (Add...) 按钮。

  3. 在驱动列表中,找到 Microsoft Access Driver (.mdb, .accdb),然后点击 “完成”

  4. 配置数据源信息:

    • 数据源名称: 为你的数据源起一个名字,MyAccessDB,这个名字非常重要,Java 代码中会用到。
    • 说明: 可选,可以写一些描述性文字。
    • 数据库: 点击 “选择” 按钮,然后浏览并选择你之前创建的 students.accdb 文件。
  5. 点击 “确定” 保存。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  男

第三步:代码解析

  1. 加载驱动 (隐式) 在 JDBC 4.0 (Java 6 及以上) 之后,Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") 这行代码不再是必需的,驱动程序会自动在类路径中注册,如果你使用的是更早的 Java 版本,则需要手动加载。

  2. 建立连接 DriverManager.getConnection() 是获取连接的核心方法。

    • DB_URL = "jdbc:odbc:MyAccessDB": 这里的 MyAccessDB 就是我们之前在 ODBC 管理器中设置的数据源名称。
    • USERPASS: 对于 Access,这两个参数通常是空的。
  3. 创建 Statement 对象 conn.createStatement() 用于创建一个 Statement 对象,这个对象用于向数据库发送 SQL 语句。

  4. 执行查询 stmt.executeQuery("...") 用于执行一个查询(SELECT)语句,并返回一个 ResultSet 对象,这个对象包含了查询结果。

  5. 处理结果集 rs.next(): 将光标移动到下一行,如果存在下一行则返回 truers.getXXX("columnName"): 从当前行中获取指定列的数据。XXX 是数据类型,如 getString, getInt, getDate 等,推荐使用列名而不是列索引,因为代码更具可读性,并且在表结构变化时更健壮。

  6. 关闭资源 try-with-resources 语句是 Java 7 引入的一个非常方便的特性,它会自动在 try 代码块执行完毕后关闭 Connection, Statement, 和 ResultSet,即使发生了异常,从而避免了资源泄漏。


常见问题与解决方案

  1. 问题: java.sql.SQLException: [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified

    • 原因: 这是最常见的错误,意味着 Java 找不到你配置的 DSN。
    • 解决方案:
      1. 检查 ODBC 数据源名称 MyAccessDB 是否拼写正确。
      2. 确认你是在 32位 还是 64位 的 ODBC 管理器中配置的 DSN,并且你的 Java 程序运行在对应的环境中,如果你用 64 位 JDK 运行程序,就必须使用 64 位 ODBC 管理器。
      3. 确认数据库文件路径是否正确。
  2. 问题: java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver

    • 原因: 通常出现在 Java 8 之前的版本,或者 JDK 不完整的情况下。
    • 解决方案: 在 Java 8 及更高版本中,此驱动已被移除,如果你必须使用旧版 Java,请确保你的 JDK 安装完整,对于现代项目,强烈建议考虑替代方案。
  3. 问题: 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 的步骤:

  1. 下载 JAR 包: 从 UCanAccess 官网 下载最新版本的 ZIP 文件。
  2. 添加依赖: 将 ZIP 文件中的所有 JAR 文件(特别是 ucanaccess-x.x.x.jar 和依赖的 jackcess-x.x.jar, hsqldb-x.x.x.jar)添加到你的项目的类路径中。
  3. 修改连接 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 桥依然是一个可行的选择。

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