広告

Java : Wrapper (JDBC) - API使用例

Wrapper (Java SE 21 & JDK 21) の使い方まとめです。
だいたいのメソッドを網羅済みです。
API仕様書のおともにどうぞ。


概要

委譲インスタンスが実際はプロキシ・クラスであるときにそのインスタンスを取得できる、JDBCクラスのインタフェースです。

クラス構成

Wrapper インタフェースを使うと、各ドライバ固有の API を利用できます。

補足

  • JDBC のドライバには Apache Derby を使っています。
    Apache Derby は、古い JDK に含まれていたこともありましたが、最新の JDK には含まれていません。
final var url = "jdbc:derby:memory:db;create=true";
try (final var connection = DriverManager.getConnection(url)) {

    final var iface = EmbedConnection.class;
    System.out.println("iface = " + iface);

    if (connection.isWrapperFor(iface)) {
        System.out.println("isWrapperFor = true");

        final EmbedConnection unwrapped = connection.unwrap(iface);
        System.out.println("unwrapped = " + unwrapped);
    }
}

// 結果
// ↓
//iface = class org.apache.derby.impl.jdbc.EmbedConnection
//isWrapperFor = true
//unwrapped = org.apache.derby.impl.jdbc.EmbedConnection@626393072
//  (XID = 166), (SESSIONID = 1), (DATABASE = memory:db), (DRDAID = null)

メソッド

boolean isWrapperFor (Class<?> iface)

これが、指定されたインタフェースを実装している場合や、そのようなオブジェクトの直接的または間接的なラッパーである場合は、trueを返します。

final var url = "jdbc:derby:memory:db;create=true";
try (final var connection = DriverManager.getConnection(url)) {

    final var iface = EmbedConnection.class;
    System.out.println("iface = " + iface);

    if (connection.isWrapperFor(iface)) {
        System.out.println("isWrapperFor = true");

        final EmbedConnection unwrapped = connection.unwrap(iface);
        System.out.println("unwrapped = " + unwrapped);
    }
}

// 結果
// ↓
//iface = class org.apache.derby.impl.jdbc.EmbedConnection
//isWrapperFor = true
//unwrapped = org.apache.derby.impl.jdbc.EmbedConnection@626393072
//  (XID = 166), (SESSIONID = 1), (DATABASE = memory:db), (DRDAID = null)

<T> T unwrap (Class<T> iface)

標準以外のメソッド、またはプロキシによって公開されない標準メソッドにアクセスできるようにするために、指定されたインタフェースを実装しているオブジェクトを返します。

final var url = "jdbc:derby:memory:db;create=true";
try (final var connection = DriverManager.getConnection(url)) {

    final var iface = EmbedConnection.class;
    System.out.println("iface = " + iface);

    if (connection.isWrapperFor(iface)) {
        System.out.println("isWrapperFor = true");

        final EmbedConnection unwrapped = connection.unwrap(iface);
        System.out.println("unwrapped = " + unwrapped);
    }
}

// 結果
// ↓
//iface = class org.apache.derby.impl.jdbc.EmbedConnection
//isWrapperFor = true
//unwrapped = org.apache.derby.impl.jdbc.EmbedConnection@626393072
//  (XID = 166), (SESSIONID = 1), (DATABASE = memory:db), (DRDAID = null)

関連記事

ページの先頭へ