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);
}