JDBC API 4.2(十一):java.sql.Wrapper 接口源碼分析

1、簡介

java.sql.Wrapper 是 JDBC 的接口,當相關實例實際上是代理類時,該接口提供檢索委託實例的功能。

許多 JDBC 驅動程序實現使用包裝器模式提供超越傳統 JDBC API 的擴展功能,傳統 JDBC API 是特定於數據源的。開發人員可能希望訪問那些被包裝(代理)爲代表實際資源代理類實例的資源。

此接口描述了一種標準機制,用於訪問那些由代理代表的包裝資源的標準機制,以允許對資源代理的直接訪問。

2、源碼

這個接口只定義了兩個方法,下面我們分別學習一下這兩個方法的功能

2.1、 T unwrap(java.lang.Class iface)

返回一個實現給定接口的對象,以允許訪問非標準方法或代理未公開的標準方法。

如果接收者實現了該接口,那麼結果是接收者或接收者代理。

如果接收者是包裝器且包裝對象實現了該接口,那麼結果是包裝對象或包裝對象的代理。否則,返回對該包裝對象或該結果的代理進行遞歸調用的結果。

如果接收者不是包裝器且未實現該接口,則拋出 sqlexception。

參數:

iface - 定義結果必須實現的接口的 class。

返回值:

一個實現接口的對象。 可能是實際實現對象的代理。

2.2、boolean isWrapperFor(java.lang.Class<?> iface)

如果此方法實現了接口參數,或者直接或間接地對該對象進行了包裝,則返回true。 否則返回false。

如果實現了接口,那麼返回true,否則如果這是一個包裝器,那麼返回在包裝對象上遞歸調用isWrapperFor的結果。

如果不實現接口並且不是包裝器,則返回false。

與 unwrap 相比,此方法應作爲一種低成本操作來實現,以便調用者可以使用此方法來避免可能失敗的昂貴的 unwrap 調用。 如果此方法返回true,則使用相同參數調用unwrap應該會成功。

參數:

iface - 定義接口的類。

返回值:

如果這實現了接口,或者直接或間接地包裝了一個對象,則爲true。

3、接口 java.sql.Wrapper 的使用

3.1、使用 Wrapper 的軟件包

java.sql 提供使用 JavaTM 編程語言訪問並處理存儲在數據源(通常是一個關係數據庫)中的數據的 API。 
javax.sql 爲通過 JavaTM 編程語言進行服務器端數據源訪問和處理提供 API。 
javax.sql.rowset JDBC RowSet 實現的標準接口和基類。 
javax.sql.rowset.spi 第三方供應商在其同步提供者的實現中必須使用的標準類和接口。 

3.2、java.sql 中 Wrapper 的使用

java.sql 中 Wrapper 的子接口
 interface CallableStatement
          用於執行 SQL 存儲過程的接口。
 interface Connection
          與特定數據庫的連接(會話)。
 interface DatabaseMetaData
          關於數據庫的整體綜合信息。
 interface ParameterMetaData
          可用於獲取關於 PreparedStatement 對象中每個參數標記的類型和屬性信息的對象。
 interface PreparedStatement
          表示預編譯的 SQL 語句的對象。
 interface ResultSet
          表示數據庫結果集的數據表,通常通過執行查詢數據庫的語句生成。
 interface ResultSetMetaData
          可用於獲取關於 ResultSet 對象中列的類型和屬性信息的對象。
 interface Statement
          用於執行靜態 SQL 語句並返回它所生成結果的對象。

3.3、javax.sql 中 Wrapper 的使用

javax.sql中 Wrapper的子接口
 interface DataSource
          該工廠用於提供到此 DataSource 對象所表示的物理數據源的連接。
 interface RowSet
          該接口添加了對 JavaBeansTM 組件模型的 JDBC API 支持。
 interface RowSetMetaData
          該對象包含關於 RowSet 對象的列的信息。

3.4、javax.sql.rowset 中 Wrapper 的使用

3.4.1、javax.sql.rowset 中 Wrapper 的子接口

javax.sql.rowset 中 Wrapper 的子接口
 interface CachedRowSet
          所有標準 CachedRowSet 實現都必須實現的接口。
 interface FilteredRowSet
          所有標準 FilteredRowSet 實現都必須實現的標準接口。
 interface JdbcRowSet
          所有標準 JdbcRowSet 實現都必須實現的標準接口。
 interface JoinRowSet
          JoinRowSet 接口提供了一種機制,用於將取自不同 RowSet 對象的相關數據組合到一個 JoinRowSet 對象中,該對象表示一個 SQL JOIN
 interface WebRowSet
          所有 WebRowSet 的實現都必須實現的標準接口。

3.4.2、實現 Wrapper 的 javax.sql.rowset 中的類

實現 Wrapper的 javax.sql.rowset 中的類
 class RowSetMetaDataImpl
          爲設置和獲取關於 RowSet 對象列的元數據信息的方法提供實現。

3.5、javax.sql.rowset.spi 中 Wrapper 的使用

javax.sql.rowset.spi 中 Wrapper 的子接口
interface SyncResolver
          定義一個框架,當發生同步衝突時,它允許應用程序使用手工決策樹來確定應該執行的操作。

4、【示例】在 MySQL jdbc 類 ConnectionImpl 種的實現

 @Override
    public <T> T unwrap(java.lang.Class<T> iface) throws java.sql.SQLException {
        try {
            // 這適用於實際上沒有包裝任何東西的類
            return iface.cast(this);
        } catch (ClassCastException cce) {
            throw SQLError.createSQLException("Unable to unwrap to " + iface.toString(), MysqlErrorNumbers.SQL_STATE_ILLEGAL_ARGUMENT,
                    getExceptionInterceptor());
        }
    }

    @Override
    public boolean isWrapperFor(Class<?> iface) throws SQLException {

        // 這適用於實際上沒有包裝任何東西的類
        return iface.isInstance(this);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章