広告

Java : DriverManager (JDBC) - API使用例

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


概要

一連のJDBCドライバを管理するための基本的なサービスです。

クラス構成

DriverManager クラスは、JDBC のドライバを管理します。
ドライバの一覧を取得したり、直接 Connection オブジェクトを取得することもできます。

補足

  • JDBC のドライバには Apache Derby を使っています。
    Apache Derby は、古い JDK に含まれていたこともありましたが、最新の JDK には含まれていません。
DriverManager.drivers().forEach(driver -> {
    System.out.println("-- driver --");
    System.out.println("package : " + driver.getClass().getPackage().getName());
    System.out.println("major version : " + driver.getMajorVersion());
    System.out.println("minor version : " + driver.getMinorVersion());
});

// 結果
// ↓
//-- driver --
//package : org.apache.derby.iapi.jdbc
//major version : 10
//minor version : 17
//-- driver --
//package : org.apache.derby.client
//major version : 10
//minor version : 17
record Product(String name, int stock) {
}

final var products = List.of(
        new Product("Orange", 10),
        new Product("Banana", 20),
        new Product("Apple", 30)
);

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

    System.out.println("-- create table --");
    try (final var statement = connection.createStatement()) {
        final var ret = statement.executeUpdate("""
                CREATE TABLE PRODUCTS (
                    NAME VARCHAR(20),
                    STOCK INTEGER
                )
                """);
        System.out.println("ret = " + ret);
    }

    System.out.println("-- insert --");
    try (final var statement = connection.prepareStatement("""
            INSERT INTO PRODUCTS VALUES( ?, ? )
            """)) {
        for (final var product : products) {
            statement.setString(1, product.name());
            statement.setInt(2, product.stock());
            final var ret = statement.executeUpdate();
            System.out.println("ret = " + ret);
        }
    }

    System.out.println("-- select --");
    try (final var statement = connection.createStatement()) {
        try (final var result = statement.executeQuery("""
                SELECT * FROM PRODUCTS
                """)) {
            while (result.next()) {
                final var name = result.getString("name");
                final var stock = result.getInt("stock");

                System.out.println(name + " : " + stock);
            }
        }
    }

    // 結果
    // ↓
    //-- create table --
    //ret = 0
    //-- insert --
    //ret = 1
    //ret = 1
    //ret = 1
    //-- select --
    //Orange : 10
    //Banana : 20
    //Apple : 30
}

メソッド

static void deregisterDriver (Driver driver)

DriverManagerの登録済ドライバ・リストから、指定されたドライバを削除します。

final var url = "jdbc:derby:";
final var derby = DriverManager.getDriver(url);

// package org.apache.derby.iapi.jdbc
System.out.println(derby.getClass().getPackage());

System.out.println("-- drivers --");
DriverManager.drivers().forEach(driver -> {
    System.out.println("package : " + driver.getClass().getPackage().getName());
});

// 結果
// ↓
//-- drivers --
//package : org.apache.derby.iapi.jdbc
//package : org.apache.derby.client

DriverManager.deregisterDriver(derby);

System.out.println("-- drivers --");
DriverManager.drivers().forEach(driver -> {
    System.out.println("package : " + driver.getClass().getPackage().getName());
});

// 結果
// ↓
//-- drivers --
//package : org.apache.derby.client

DriverManager.registerDriver(derby);

System.out.println("-- drivers --");
DriverManager.drivers().forEach(driver -> {
    System.out.println("package : " + driver.getClass().getPackage().getName());
});

// 結果
// ↓
//-- drivers --
//package : org.apache.derby.client
//package : org.apache.derby.iapi.jdbc

static Stream<Driver> drivers ()

現在の呼出し元がアクセスできる、現在ロードされているすべてのJDBCドライバを含むストリームを取得します。

DriverManager.drivers().forEach(driver -> {
    System.out.println("-- driver --");
    System.out.println("package : " + driver.getClass().getPackage().getName());
    System.out.println("major version : " + driver.getMajorVersion());
    System.out.println("minor version : " + driver.getMinorVersion());
});

// 結果
// ↓
//-- driver --
//package : org.apache.derby.iapi.jdbc
//major version : 10
//minor version : 17
//-- driver --
//package : org.apache.derby.client
//major version : 10
//minor version : 17

static Connection getConnection (String url)

指定されたデータベースのURLへの接続を試みます。

record Product(String name, int stock) {
}

final var products = List.of(
        new Product("Orange", 10),
        new Product("Banana", 20),
        new Product("Apple", 30)
);

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

    System.out.println("-- create table --");
    try (final var statement = connection.createStatement()) {
        final var ret = statement.executeUpdate("""
                CREATE TABLE PRODUCTS (
                    NAME VARCHAR(20),
                    STOCK INTEGER
                )
                """);
        System.out.println("ret = " + ret);
    }

    System.out.println("-- insert --");
    try (final var statement = connection.prepareStatement("""
            INSERT INTO PRODUCTS VALUES( ?, ? )
            """)) {
        for (final var product : products) {
            statement.setString(1, product.name());
            statement.setInt(2, product.stock());
            final var ret = statement.executeUpdate();
            System.out.println("ret = " + ret);
        }
    }

    System.out.println("-- select --");
    try (final var statement = connection.createStatement()) {
        try (final var result = statement.executeQuery("""
                SELECT * FROM PRODUCTS
                """)) {
            while (result.next()) {
                final var name = result.getString("name");
                final var stock = result.getInt("stock");

                System.out.println(name + " : " + stock);
            }
        }
    }

    // 結果
    // ↓
    //-- create table --
    //ret = 0
    //-- insert --
    //ret = 1
    //ret = 1
    //ret = 1
    //-- select --
    //Orange : 10
    //Banana : 20
    //Apple : 30
}

static Connection getConnection (String url, String user, String password)

指定されたデータベースのURLへの接続を試みます。

final var protocol = "jdbc:derby:";
final var path = Path.of("R:", "java-work", "db");
final var url = protocol + path + ";create=true";
System.out.println(url); // jdbc:derby:R:\java-work\db;create=true

try (final var connection = DriverManager.getConnection(url + ";user=AAA")) {
    try (final var statement = connection.prepareCall("""
            CALL SYSCS_UTIL.SYSCS_CREATE_USER(?, ?)
            """)) {
        statement.setString(1, "AAA"); // user
        statement.setString(2, "XYZ"); // password
        statement.execute();
    }
}

System.out.println("-- shutdown --");
try {
    DriverManager.getConnection(url + ";shutdown=true");
} catch (SQLException e) {
    System.out.println(e.getMessage());
}

// 結果
// ↓
//-- shutdown --
//Database 'R:\java-work\db' shutdown.

System.out.println("-- invalid password --");
try (final var connection = DriverManager.getConnection(url, "AAA", "123")) {
    System.out.println("Connected!");
} catch (SQLException e) {
    System.out.println("SQLException! : " + e.getMessage());
}

// 結果
// ↓
//-- invalid password --
//SQLException! : Connection authentication failure occurred.
// Reason: Invalid authentication..

System.out.println("-- valid password --");
try (final var connection = DriverManager.getConnection(url, "AAA", "XYZ")) {
    System.out.println("Connected!");
} catch (SQLException e) {
    System.out.println("SQLException! : " + e.getMessage());
}

// 結果
// ↓
//-- valid password --
//Connected!

static Connection getConnection (String url, Properties info)

指定されたデータベースのURLへの接続を試みます。

final var url = "jdbc:derby:memory:db";

try (final var connection = DriverManager.getConnection(url)) {
    System.out.println("Connected!");
} catch (SQLException e) {
    System.out.println("SQLException! : " + e.getMessage());
}

// 結果
// ↓
//SQLException! : Database 'memory:db' not found.

final var info = new Properties();
info.setProperty("create", "true");

try (final var connection = DriverManager.getConnection(url, info)) {
    System.out.println("Connected!");
} catch (SQLException e) {
    System.out.println("SQLException! : " + e.getMessage());
}

// 結果
// ↓
//Connected!

static Driver getDriver (String url)

指定されたURLを認識するドライバを獲得しようとします。

final var url = "jdbc:derby:";
final var driver = DriverManager.getDriver(url);

System.out.println("package : " + driver.getClass().getPackage().getName());
System.out.println("major version : " + driver.getMajorVersion());
System.out.println("minor version : " + driver.getMinorVersion());

// 結果
// ↓
//package : org.apache.derby.iapi.jdbc
//major version : 10
//minor version : 17

static Enumeration<Driver> getDrivers ()

現在の呼出し元がアクセスしている、現在ロードされているすべてのJDBCドライバの列挙を取得します。

final var drivers = DriverManager.getDrivers();
while (drivers.hasMoreElements()) {
    final var driver = drivers.nextElement();

    System.out.println("-- driver --");
    System.out.println("package : " + driver.getClass().getPackage().getName());
    System.out.println("major version : " + driver.getMajorVersion());
    System.out.println("minor version : " + driver.getMinorVersion());
}

// 結果
// ↓
//-- driver --
//package : org.apache.derby.iapi.jdbc
//major version : 10
//minor version : 17
//-- driver --
//package : org.apache.derby.client
//major version : 10
//minor version : 17

static int getLoginTimeout ()

データベースにログインしているときに、ドライバが待つことのできる最長の時間を秒数で取得します。

final var ret1 = DriverManager.getLoginTimeout();
System.out.println(ret1); // 0

DriverManager.setLoginTimeout(60);

final var ret2 = DriverManager.getLoginTimeout();
System.out.println(ret2); // 60

static PrintStream getLogStream ()

非推奨。 getLogWriterを使用

非推奨です。

static PrintWriter getLogWriter ()

ログ・ライターを取得します。

try (final var writer = new PrintWriter(new StringWriter())) {

    final var ret1 = DriverManager.getLogWriter();
    System.out.println(ret1); // null

    DriverManager.setLogWriter(writer);

    final var ret2 = DriverManager.getLogWriter();
    System.out.println(ret2 == writer); // true
}

static void println (String message)

現在のJDBCログ・ストリームにメッセージを印刷します。

final var sw = new StringWriter();
try (final var writer = new PrintWriter(sw)) {

    DriverManager.setLogWriter(writer);

    final var driver = DriverManager.getDriver("jdbc:derby:");

    DriverManager.println("");
    DriverManager.println("** println **");
    DriverManager.println("  package : " + driver.getClass().getPackage().getName());
}

System.out.println("-- writer --");
System.out.print(sw);

// 結果
// ↓
//-- writer --
//DriverManager.getDriver("jdbc:derby:")
//registerDriver: org.apache.derby.iapi.jdbc.AutoloadedDriver@18317edc
//registerDriver: org.apache.derby.client.ClientAutoloadedDriver@1f760b47
//DriverManager.initialize: jdbc.drivers = null
//JDBC DriverManager initialized
//getDriver returning org.apache.derby.iapi.jdbc.AutoloadedDriver
//
//** println **
//  package : org.apache.derby.iapi.jdbc

static void registerDriver (Driver driver)

指定されたドライバをDriverManagerに登録します。

final var url = "jdbc:derby:";
final var derby = DriverManager.getDriver(url);

// package org.apache.derby.iapi.jdbc
System.out.println(derby.getClass().getPackage());

System.out.println("-- drivers --");
DriverManager.drivers().forEach(driver -> {
    System.out.println("package : " + driver.getClass().getPackage().getName());
});

// 結果
// ↓
//-- drivers --
//package : org.apache.derby.iapi.jdbc
//package : org.apache.derby.client

DriverManager.deregisterDriver(derby);

System.out.println("-- drivers --");
DriverManager.drivers().forEach(driver -> {
    System.out.println("package : " + driver.getClass().getPackage().getName());
});

// 結果
// ↓
//-- drivers --
//package : org.apache.derby.client

DriverManager.registerDriver(derby);

System.out.println("-- drivers --");
DriverManager.drivers().forEach(driver -> {
    System.out.println("package : " + driver.getClass().getPackage().getName());
});

// 結果
// ↓
//-- drivers --
//package : org.apache.derby.client
//package : org.apache.derby.iapi.jdbc

static void registerDriver (Driver driver, DriverAction da)

指定されたドライバをDriverManagerに登録します。

final var url = "jdbc:derby:";
final var derby = DriverManager.getDriver(url);

// package org.apache.derby.iapi.jdbc
System.out.println(derby.getClass().getPackage());

DriverManager.deregisterDriver(derby);

System.out.println("-- registerDriver --");
DriverManager.registerDriver(derby, () -> {
    System.out.println("Deregister!");
});

System.out.println("-- deregisterDriver --");
DriverManager.deregisterDriver(derby);

// 結果
// ↓
//-- registerDriver --
//-- deregisterDriver --
//Deregister!

static void setLoginTimeout (int seconds)

識別された後のドライバがデータベースに接続しようとするときの最大待機時間(秒単位)を設定します。

final var ret1 = DriverManager.getLoginTimeout();
System.out.println(ret1); // 0

DriverManager.setLoginTimeout(60);

final var ret2 = DriverManager.getLoginTimeout();
System.out.println(ret2); // 60

static void setLogStream (PrintStream out)

非推奨。 setLogWriterを使用

非推奨です。

static void setLogWriter (PrintWriter out)

DriverManagerおよびすべてのドライバが使用する、ログおよびトレースのPrintWriterオブジェクトを設定します。

final var sw = new StringWriter();
try (final var writer = new PrintWriter(sw)) {

    DriverManager.setLogWriter(writer);

    final var driver = DriverManager.getDriver("jdbc:derby:");

    DriverManager.println("");
    DriverManager.println("** println **");
    DriverManager.println("  package : " + driver.getClass().getPackage().getName());
}

System.out.println("-- writer --");
System.out.print(sw);

// 結果
// ↓
//-- writer --
//DriverManager.getDriver("jdbc:derby:")
//registerDriver: org.apache.derby.iapi.jdbc.AutoloadedDriver@18317edc
//registerDriver: org.apache.derby.client.ClientAutoloadedDriver@1f760b47
//DriverManager.initialize: jdbc.drivers = null
//JDBC DriverManager initialized
//getDriver returning org.apache.derby.iapi.jdbc.AutoloadedDriver
//
//** println **
//  package : org.apache.derby.iapi.jdbc

関連記事

ページの先頭へ