hatora's blog

日常の出来事や仕事のことなど/Java/開発/Web/IT

JDBCドライバのロード

備忘録として

以下のようなコードはよくみるけど実際はどうなってるの?

Class.forName("org.sqlite.JDBC");
conn = DriverManager.getConnection("jdbc:sqlite:sample.db");

  • Class.forNameは引数の文字列を動的にロードする

org.sqlite.JDBCの実装をみてるみるとこんな感じ

public class JDBC implements Driver
{
    public static final String PREFIX = "jdbc:sqlite:";

    static 
    {
        try 
        {
            DriverManager.registerDriver(new JDBC());
        }
        catch (SQLException e) 
        {
            e.printStackTrace();
        }
    }

staticの部分はstaticイニシャライザ。クラスがロードされたときに評価される。


つまりこういうこと

  1. Class.forNameで実行時に引数で指定したクラス(この場合はDriverを実装したクラス)がロードされる
  2. staticイニシャライザにより、DriverManagerにインスタンスが登録される

という流れ