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

JDBC 實戰基石:可擴展資料庫操作 Bean 設計(上)

     編輯:Java 相關知識

設計目標

  • 連線取得方式隨部署環境變化(DataSource、連線池、DriverManager)。
  • 符合 JavaBean 規範,兼容一般類別呼叫。
  • 通用操作封裝於基類,特定資料庫擴充由子類實作。

分層架構

ConnectionFactory (抽象連線取得)
    ↑ 繼承
DBOperater (通用 CRUD、Prepared/CallableStatement)
    ↑ 繼承
OracleDBOperater (Oracle XML 等特有功能)

核心程式碼:ConnectionFactory


public class ConnectionFactory {
    protected Connection conn;
    private static final String URL = "jdbc:mysql://...";
    private static final String USER = "root";
    private static final String PASS = "pwd";

    public ConnectionFactory() throws SQLException {
        makeConnection();
    }

    public void makeConnection() throws SQLException {
        conn = DriverManager.getConnection(URL, USER, PASS);
    }

    public void close() throws SQLException {
        if (conn != null && !conn.isClosed()) conn.close();
    }
}

conn 為 protected,供子類存取;建構子拋出異常,強制呼叫端處理連線失敗。

通用操作:DBOperater


public class DBOperater extends ConnectionFactory {

    public ResultSet executeQuery(String sql) throws SQLException {
        ensureConnection();
        Statement stmt = conn.createStatement(
            ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
        return stmt.executeQuery(sql);
    }

    public ResultSet executeUpdatableQuery(String sql) throws SQLException {
        ensureConnection();
        Statement stmt = conn.createStatement(
            ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
        return stmt.executeQuery(sql);
    }

    public int executeUpdate(String sql) throws SQLException {
        ensureConnection();
        Statement stmt = conn.createStatement(); // 基本型別,省記憶體
        return stmt.executeUpdate(sql);
    }

    public PreparedStatement getPreparedStmt(String sql) throws SQLException {
        ensureConnection();
        return conn.prepareStatement(sql);
    }

    public CallableStatement getCallableStmt(String sql) throws SQLException {
        ensureConnection();
        return conn.prepareCall(sql);
    }

    private void ensureConnection() throws SQLException {
        if (conn == null || conn.isClosed()) makeConnection();
    }
}

關鍵設計決策

  • Statement/ResultSet 不做成員變數:支援多並發查詢、不同游標型別、避免狀態耦合。
  • 三種 Statement 分離:只讀、可更新、批次更新,依需求選擇,節省資源。
  • 異常向上拋:封裝層不吞噬異常,呼叫端決定業務處理(重試、回滾、轉碼)。
  • Prepared/CallableStatement 回傳物件而非結果:呼叫端自行綁參、執行、處理結果,彈性最大。

擴充範例:Oracle XML 操作


public class OracleDBOperater extends DBOperater {
    public OracleXMLQuery getOXQuery(String sql, String table) throws Exception {
        OracleXMLQuery qry = new OracleXMLQuery(conn, sql);
        qry.setRowsetTag(table);
        qry.setRowTag("RECORD");
        return qry;
    }

    public int insertXML(String path, String table) throws Exception {
        OracleXMLSave sav = new OracleXMLSave(conn, table);
        sav.setRowTag("RECORD");
        int x = sav.insertXML(sav.createURL(path));
        sav.close();
        return x;
    }
}

總結

這個分層結構以單一職責切分關注點:連線管理、通用 SQL、廠商擴充。下篇將介紹 DatabaseMetaData 動態探索未知資料庫結構。

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