文章目錄
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);
}