首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 連接 ODBC 資料庫實戰範例(JDBC-ODBC Bridge)

     編輯:Java 相關知識

⚠️ 重要提示

JDBC-ODBC Bridge (sun.jdbc.odbc.JdbcOdbcDriver) 已在 Java 8 移除,現代專案請直接使用原生 JDBC 驅動(MySQL Connector/J、PostgreSQL JDBC、Microsoft JDBC Driver for SQL Server 等)。本文僅供維護舊系統參考。

完整程式碼範例


package 管理信息系統;

import java.io.*;
import java.sql.*;

public class Testdb {
    private Connection conn = null;
    private Statement stmt = null;
    private ResultSet rs = null;

    public static void main(String[] args) {
        new Testdb();
    }

    public Testdb() {
        try {
            // 1. 載入驅動
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

            // 2. 建立連線 (需預先在系統建立 ODBC 系統 DSN 名為 Javadb)
            String url = "jdbc:odbc:Javadb";
            conn = DriverManager.getConnection(url, "sa", "");

            // 3. 建立 Statement
            stmt = conn.createStatement();

            // 4. 執行查詢
            String sql = "select * from tbuser";
            rs = stmt.executeQuery(sql);

            // 5. 處理結果集
            while (rs.next()) {
                System.out.println(
                    rs.getString("user_name") + " | " +
                    rs.getString("user_passWord") + " | " +
                    rs.getString("user_type")
                );
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 6. 關鍵:逆序關閉資源
            closeQuietly(rs);
            closeQuietly(stmt);
            closeQuietly(conn);
        }
    }

    private void closeQuietly(AutoCloseable resource) {
        if (resource != null) {
            try { resource.close(); } catch (Exception ignored) {}
        }
    }
}

關鍵步驟解析

  1. 驅動載入:Class.forName() 觸發驅動註冊(JDBC 4.0+ 可省略,SPI 自動發現)。
  2. 連線 URL:jdbc:odbc:<DSN名稱>,DSN 需在 Windows「ODBC 資料來源管理員」預先設定。
  3. Statement vs PreparedStatement:範例用 Statement 適合靜態 SQL;生產環境**必須用 PreparedStatement 防 SQL 注入**。
  4. 結果集遍歷:rs.next() 移動游標,getString(欄位名) 取值。
  5. 資源關閉:finally 區塊 + 逆序關閉(ResultSet → Statement → Connection),避免洩漏。

現代替代方案

資料庫驅動類別Maven 坐標URL 範例
MySQLcom.mysql.cj.jdbc.Drivermysql:mysql-connector-j:8.0.33jdbc:mysql://host:3306/db?useSSL=false
PostgreSQLorg.postgresql.Driverorg.postgresql:postgresql:42.6.0jdbc:postgresql://host:5432/db
SQL Servercom.microsoft.sqlserver.jdbc.SQLServerDrivercom.microsoft.sqlserver:mssql-jdbc:12.4.1jdbc:sqlserver://host:1433;databaseName=db
Oracleoracle.jdbc.OracleDrivercom.oracle.database.jdbc:ojdbc11:23.2.0.0jdbc:oracle:thin:@host:1521:sid

最佳實踐:連線池

生產環境**禁用手動建立連線**,請使用成熟連線池:

  • HikariCP:效能最強、預設 Spring Boot 2+
  • Druid:阿里出品、監控強、SQL 防火牆
  • Tomcat JDBC Pool:Tomcat 內建

// HikariCP 範例
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
config.setUsername("user");
config.setPassword("pass");
config.setMaximumPoolSize(20);
DataSource ds = new HikariDataSource(config);

// 使用
try (Connection conn = ds.getConnection();
     PreparedStatement ps = conn.prepareStatement("SELECT * FROM user WHERE id=?")) {
    ps.setInt(1, 100);
    try (ResultSet rs = ps.executeQuery()) { ... }
}

總結

ODBC Bridge 歷史使命已終。新專案直接用原生 JDBC + 連線池 + PreparedStatement,舊專案規劃遷移路徑。核心原則:**資源必關、參數化查詢、連線池化、異常完整記錄**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved