杰瑞科技汇

Java ODBC数据库连接如何实现?

JDBC-ODBC 桥接器已废弃

在开始之前,必须强调一个非常重要的信息:JDBC-ODBC 桥接器从 Java 7 开始被标记为废弃,并在 Java 8 中被完全移除。

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

这意味着,如果你使用的是 Java 8 或更高版本,你将无法直接使用 sun.jdbc.odbc.JdbcOdbcDriver

为什么会被废弃?

  1. 平台依赖性:ODBC 是微软 Windows 平台的 API,在 Linux、macOS 等系统上无法原生使用,这使得 Java 程序失去了“一次编写,到处运行”的优势。
  2. 性能问题:桥接器本身是 Java 代码调用本地 C 代码来访问 ODBC,中间层多,性能通常不如纯 Java 的 JDBC 驱动。
  3. 维护成本:随着数据库技术的发展,为每种数据库维护一个 ODBC 驱动,并让 Java 去适配它,成本很高。

现代的最佳实践是什么? 直接使用数据库厂商提供的 纯 Java JDBC 驱动

  • MySQL: mysql-connector-java (现在是 com.mysql.cj.jdbc.Driver)
  • PostgreSQL: postgresql
  • SQL Server: mssql-jdbc
  • Oracle: ojdbc8.jarojdbc11.jar

理解 JDBC-ODBC 的工作原理对于学习 Java 数据库连接的基本概念仍然非常有帮助,下面我将为你详细解释其原理和步骤,主要面向 Java 6 或 7 的环境,或者用于学习和理解。

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

JDBC-ODBC 连接详解

JDBC-ODBC 桥接器的作用就像一个“翻译官”,它让 Java 的 JDBC API 能够调用本地的 ODBC 驱动程序,而 ODBC 驱动程序再去与具体的数据库通信。

连接步骤

  1. 配置 ODBC 数据源:在操作系统级别创建一个指向特定数据库的 DSN (Data Source Name)。
  2. 加载 JDBC 驱动:在 Java 代码中加载 sun.jdbc.odbc.JdbcOdbcDriver
  3. 建立连接:使用 DriverManager 类和 DSN 名称来获取数据库连接对象。
  4. 创建执行语句:通过连接对象创建 StatementPreparedStatement
  5. 执行 SQL 查询:执行 SQL 语句,并处理返回的结果集。
  6. 关闭资源:按顺序关闭 ResultSet、Statement 和 Connection,释放资源。

完整示例代码 (以 Windows + Microsoft Access 为例)

假设我们要连接一个本地的 Microsoft Access 数据库文件 C:\data\mydatabase.mdb

第 1 步:配置 ODBC 数据源 (在 Windows 上)

  1. 打开 “控制面板” -> “管理工具” -> “数据源 (ODBC)”。
  2. 选择 “系统 DSN” (System DSN) 标签页,点击 “添加”。
  3. 在驱动程序列表中,选择 “Microsoft Access Driver (.mdb, .accdb)”,然后点击 “完成”。
  4. 在 “数据源名称” 中输入一个你喜欢的名字,MyAccessDB
  5. 点击 “选择...” 按钮,浏览并选择你的 Access 数据库文件 C:\data\mydatabase.mdb
  6. 点击 “确定” 保存所有设置,你的 ODBC 数据源 MyAccessDB 就配置好了。

第 2 步:编写 Java 代码

下面是一个完整的 Java 示例,它会连接到你刚刚创建的 ODBC 数据源,并查询一张名为 Employees 的表。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
public class JdbcOdbcExample {
    public static void main(String[] args) {
        // 1. 定义数据库连接信息
        // 注意:这里的 "jdbc:odbc:MyAccessDB" 中的 "MyAccessDB" 就是你上一步创建的 ODBC 数据源名称
        String url = "jdbc:odbc:MyAccessDB";
        String user = ""; // Access ODBC 通常不需要用户名
        String password = ""; // Access ODBC 通常不需要密码
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            // 2. 加载 JDBC-ODBC 桥接器驱动
            // 注意:在 Java 8+ 中,这行代码会抛出 ClassNotFoundException
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            // 3. 建立数据库连接
            System.out.println("正在连接到数据库...");
            conn = DriverManager.getConnection(url, user, password);
            System.out.println("数据库连接成功!");
            // 4. 创建 Statement 对象
            stmt = conn.createStatement();
            // 5. 执行 SQL 查询
            String sql = "SELECT ID, Name, Position FROM Employees";
            System.out.println("正在执行查询: " + sql);
            rs = stmt.executeQuery(sql);
            // 6. 处理结果集
            System.out.println("查询结果:");
            System.out.println("---------------------------------");
            System.out.println("ID\tName\tPosition");
            System.out.println("---------------------------------");
            while (rs.next()) {
                // 通过列名获取数据,更健壮
                int id = rs.getInt("ID");
                String name = rs.getString("Name");
                String position = rs.getString("Position");
                // 输出数据
                System.out.println(id + "\t" + name + "\t" + position);
            }
            System.out.println("---------------------------------");
        } catch (ClassNotFoundException e) {
            System.err.println("错误: 找不到 JDBC-ODBC 驱动类。");
            System.err.println("原因: 你可能在使用 Java 8 或更高版本,此驱动已被移除。");
            e.printStackTrace();
        } catch (SQLException e) {
            System.err.println("数据库操作出错: " + e.getMessage());
            e.printStackTrace();
        } finally {
            // 7. 关闭资源 (非常重要!)
            // 关闭的顺序和创建的顺序相反
            System.out.println("正在关闭资源...");
            try {
                if (rs != null) rs.close();
                if (stmt != null) stmt.close();
                if (conn != null) conn.close();
                System.out.println("资源已关闭。");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

如何运行这段代码

  1. 编译:确保你的 CLASSPATH 包含了 JDBC-ODBC 的 JAR(在 JDK lib 目录下,通常是 rt.jar,但现在通常不需要手动设置,JDK 6/7 会自动找到)。
    javac JdbcOdbcExample.java
  2. 运行
    java JdbcOdbcExample

替代方案:使用现代 JDBC 驱动 (以 MySQL 为例)

为了让你感受到现代方式的便利,这里提供一个使用 MySQL 官方驱动的例子。

第 1 步:添加 JDBC 驱动依赖

如果你使用 Maven,在 pom.xml 中添加依赖:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version> <!-- 使用最新的稳定版本 -->
</dependency>

如果你手动管理 JAR,请下载 MySQL Connector/J 并将其添加到你的项目类路径中。

第 2 步:编写 Java 代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
public class ModernJdbcExample {
    public static void main(String[] args) {
        // 1. 定义数据库连接信息
        // 格式: jdbc:mysql://[主机地址]:[端口]/[数据库名]?[属性]
        String url = "jdbc:mysql://localhost:3306/your_database_name";
        String user = "your_username";
        String password = "your_password";
        // 注意:不再需要 Class.forName(),DriverManager 在 Java 6+ 中会自动注册驱动
        try (Connection conn = DriverManager.getConnection(url, user, password);
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT id, name, email FROM users")) {
            System.out.println("数据库连接成功!");
            System.out.println("ID\tName\tEmail");
            System.out.println("---------------------------------");
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String email = rs.getString("email");
                System.out.println(id + "\t" + name + "\t" + email);
            }
            System.out.println("---------------------------------");
        } catch (SQLException e) {
            System.err.println("数据库操作出错: " + e.getMessage());
            e.printStackTrace();
        }
        // try-with-resources 语句会自动关闭 Connection, Statement, 和 ResultSet
    }
}

总结对比

特性 JDBC-ODBC 桥接器 现代 JDBC 驱动
可用性 已废弃 (Java 8+ 不可用) 推荐使用
平台依赖 强依赖 Windows ODBC 纯 Java,跨平台
性能 较差,有中间层开销 高,直接通信
配置 需要在系统配置 ODBC DSN 只需在代码中提供 URL、用户名、密码
驱动加载 需要手动 Class.forName() 通常自动注册
适用场景 旧项目维护、学习历史概念 所有新项目

除非你正在维护一个非常古老的 Java 6/7 项目,否则请绝对不要在新项目中使用 JDBC-ODBC,直接学习并使用你所连接的数据库对应的现代 JDBC 驱动,这是更专业、更高效、更具可移植性的选择。

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