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 メソッドでクラスをロードすることで、ドライバ登録ロジックが実行されるということがわかります。