[ Java ] JDBC で DB 接続するときの Class.forName って何?

Pocket

Java で データベースに接続するときには、以下のように Class.forName メソッドでクラスをロードするようにします。これは、単なるおまじないではありません。

『おまじないだと思って書いとけばいいよ』 って若者にバカにされたように教わりました(怒)。どうも本人はわかっていないようでしたが、プライドは高い人のようでした。(おっちゃんキれたら出川より怖いよ。ヤバイヨ ヤバイヨー)

スポンサーリンク

データベース接続するサンプル

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

    /*
     * MySQL に接続する場合
     */     
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test?user=user&password=pass");

    /*
     * オラクル に接続する場合
     */ 
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL", "user", "password");

どうして、Class.forName でクラスをロードしたからと言って、DriverManager.getConnection でデータベースに接続できるのでしょうか?

これは、JDBC ドライバクラスの static 初期化子DriverManager に自身を登録しているからです。以下に、OracleDriver クラスの処理内容を抜粋(コメント追加)して掲載しています。

public class OracleDriver implements Driver {

    ・・・・・
    ・・・・・

    private static OracleDriver defaultDriver;

    /*
     * static 初期化子
     * --------------------------------------
     * Class.forName でロードされたときに実行される
     *
     */
    static 
    {
        defaultDriver = null;
        Timestamp timestamp = Timestamp.valueOf("2000-01-01 00:00:00.0");
        try
        {
            if(defaultDriver == null)
            {
                defaultDriver = new OracleDriver();
                DriverManager.registerDriver(defaultDriver);
            }
        }
        catch(RuntimeException runtimeexception) { }
        catch(SQLException sqlexception) { }
    }

    ・・・・・
    ・・・・・
}

ということで、Class.forName メソッドで DriverManager に JDBC ドライバを登録しているのではなく、 Class.forName メソッドでクラスをロードすることで、ドライバ登録ロジックが実行されるということがわかります。

参考
スポンサーリンク

Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>