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.rowsetJDBC RowSet 实现的标准接口和基类。 
javax.sql.rowset.spi第三方供应商在其同步提供者的实现中必须使用的标准类和接口。 

3.2、java.sql 中 Wrapper 的使用

java.sql 中 Wrapper 的子接口
 interfaceCallableStatement
          用于执行 SQL 存储过程的接口。
 interfaceConnection
          与特定数据库的连接(会话)。
 interfaceDatabaseMetaData
          关于数据库的整体综合信息。
 interfaceParameterMetaData
          可用于获取关于 PreparedStatement 对象中每个参数标记的类型和属性信息的对象。
 interfacePreparedStatement
          表示预编译的 SQL 语句的对象。
 interfaceResultSet
          表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
 interfaceResultSetMetaData
          可用于获取关于 ResultSet 对象中列的类型和属性信息的对象。
 interfaceStatement
          用于执行静态 SQL 语句并返回它所生成结果的对象。

3.3、javax.sql 中 Wrapper 的使用

javax.sql中 Wrapper的子接口
 interfaceDataSource
          该工厂用于提供到此 DataSource 对象所表示的物理数据源的连接。
 interfaceRowSet
          该接口添加了对 JavaBeansTM 组件模型的 JDBC API 支持。
 interfaceRowSetMetaData
          该对象包含关于 RowSet 对象的列的信息。

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

3.4.1、javax.sql.rowset 中 Wrapper 的子接口
javax.sql.rowset 中 Wrapper 的子接口
 interfaceCachedRowSet
          所有标准 CachedRowSet 实现都必须实现的接口。
 interfaceFilteredRowSet
          所有标准 FilteredRowSet 实现都必须实现的标准接口。
 interfaceJdbcRowSet
          所有标准 JdbcRowSet 实现都必须实现的标准接口。
 interfaceJoinRowSet
          JoinRowSet 接口提供了一种机制,用于将取自不同 RowSet 对象的相关数据组合到一个 JoinRowSet 对象中,该对象表示一个 SQL JOIN
 interfaceWebRowSet
          所有 WebRowSet 的实现都必须实现的标准接口。
3.4.2、实现 Wrapper 的 javax.sql.rowset 中的类
实现 Wrapper的 javax.sql.rowset 中的类
 classRowSetMetaDataImpl
          为设置和获取关于 RowSet 对象列的元数据信息的方法提供实现。

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

javax.sql.rowset.spi 中 Wrapper 的子接口
interfaceSyncResolver
          定义一个框架,当发生同步冲突时,它允许应用程序使用手工决策树来确定应该执行的操作。

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);
    }
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值