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

这意味着,如果你使用的是 Java 8 或更高版本,你将无法直接使用 sun.jdbc.odbc.JdbcOdbcDriver。
为什么会被废弃?
- 平台依赖性:ODBC 是微软 Windows 平台的 API,在 Linux、macOS 等系统上无法原生使用,这使得 Java 程序失去了“一次编写,到处运行”的优势。
- 性能问题:桥接器本身是 Java 代码调用本地 C 代码来访问 ODBC,中间层多,性能通常不如纯 Java 的 JDBC 驱动。
- 维护成本:随着数据库技术的发展,为每种数据库维护一个 ODBC 驱动,并让 Java 去适配它,成本很高。
现代的最佳实践是什么? 直接使用数据库厂商提供的 纯 Java JDBC 驱动。
- MySQL:
mysql-connector-java(现在是com.mysql.cj.jdbc.Driver) - PostgreSQL:
postgresql - SQL Server:
mssql-jdbc - Oracle:
ojdbc8.jar或ojdbc11.jar
理解 JDBC-ODBC 的工作原理对于学习 Java 数据库连接的基本概念仍然非常有帮助,下面我将为你详细解释其原理和步骤,主要面向 Java 6 或 7 的环境,或者用于学习和理解。

JDBC-ODBC 连接详解
JDBC-ODBC 桥接器的作用就像一个“翻译官”,它让 Java 的 JDBC API 能够调用本地的 ODBC 驱动程序,而 ODBC 驱动程序再去与具体的数据库通信。
连接步骤
- 配置 ODBC 数据源:在操作系统级别创建一个指向特定数据库的 DSN (Data Source Name)。
- 加载 JDBC 驱动:在 Java 代码中加载
sun.jdbc.odbc.JdbcOdbcDriver。 - 建立连接:使用
DriverManager类和 DSN 名称来获取数据库连接对象。 - 创建执行语句:通过连接对象创建
Statement或PreparedStatement。 - 执行 SQL 查询:执行 SQL 语句,并处理返回的结果集。
- 关闭资源:按顺序关闭 ResultSet、Statement 和 Connection,释放资源。
完整示例代码 (以 Windows + Microsoft Access 为例)
假设我们要连接一个本地的 Microsoft Access 数据库文件 C:\data\mydatabase.mdb。
第 1 步:配置 ODBC 数据源 (在 Windows 上)
- 打开 “控制面板” -> “管理工具” -> “数据源 (ODBC)”。
- 选择 “系统 DSN” (System DSN) 标签页,点击 “添加”。
- 在驱动程序列表中,选择 “Microsoft Access Driver (.mdb, .accdb)”,然后点击 “完成”。
- 在 “数据源名称” 中输入一个你喜欢的名字,
MyAccessDB。 - 点击 “选择...” 按钮,浏览并选择你的 Access 数据库文件
C:\data\mydatabase.mdb。 - 点击 “确定” 保存所有设置,你的 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();
}
}
}
}
如何运行这段代码
- 编译:确保你的
CLASSPATH包含了 JDBC-ODBC 的 JAR(在 JDKlib目录下,通常是rt.jar,但现在通常不需要手动设置,JDK 6/7 会自动找到)。javac JdbcOdbcExample.java
- 运行:
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 驱动,这是更专业、更高效、更具可移植性的选择。
