web-dev-qa-db-ja.com

Class.forName( "com.mysql.jdbc.Driver")。newInstance();これは正確に何をしますか。

MySQLデータベースに接続しながら、次の手順を実行します

_Connection con = null;
Resultset rs = null;
Statement st = null;
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/database","root","passwp");
_

実際、Class.forName("com.mysql.jdbc.Driver").newInstance();ステートメントが何をするのか知りたいと思いました。

このクラスはmysql.jarにはありません。どこにありますか?

17
user2098012

ClassクラスはJava.langパッケージにあるため、Javaとともに配布され、すべてのクラスに自動的にインポートされます。

forName()メソッドは、クラスローダーによってロードされたパラメーターのClassオブジェクトを返すだけです。 newInstance()メソッドは、クラスの新しいインスタンスを返します。

そのため、Class.forName(...)を呼び出すと、com.mysql.jdbc.Driver.classが返されます。次に、そのクラスでnewInstance()を呼び出します。これはパラメーターなしでクラスのインスタンスを返すため、基本的にはnew com.mysql.jdbc.Driver();を呼び出しています。

26
chossenger

クラスパスで見つかった場合、クラス_"com.mysql.jdbc.Driver"_を初期化します。これは、登録プロセスがドライバークラスの静的初期化子内にあるため、ドライバーがJDBCドライバーマネージャーに登録されていることを意味します。

ドライバーを登録するために使用できる別のアプローチがあります:静的DriverManager.registerDriver()メソッドを使用することです。

7
aleroot

JDBC仕様 、第9章、セクション2から引用:

JDBCドライバーはDriverインターフェースを実装する必要があり、実装にはドライバーのロード時に呼び出される静的初期化子が含まれている必要があります。この初期化子は、それ自体の新しいインスタンスをDriverManagerに登録します。

また、次のようにAcmeJdbcDriverのサンプルコードが提供されています。

public class AcmeJdbcDriver implements Java.sql.Driver {
    static {
        Java.sql.DriverManager.registerDriver(newAcmeJdbcDriver());
    }
}

APIドキュメントによると、 Class.forName(String className) を呼び出すと、次のことが起こります。

ForName( "X")を呼び出すと、Xという名前のクラスが初期化されます。

初期化には、実行される静的ブロック内のコードが含まれます。

したがって、基本的に、Driverクラスを初期化すると、クラスはJava.sql.DriverManager JDBC仕様ごと。

これはもう必要ないことに注意してください。詳細は こちら をご覧ください。

DriverManagerのメソッドgetConnectionおよびgetDriversは、Java Standard Editionサービスプロバイダーメカニズムをサポートするように拡張されています。JDBC4.0ドライバーには、META-INF/services/Java.sql.Driverファイルが含まれている必要があります。 Java.sql.DriverのJDBCドライバ実装の名前。たとえば、my.sql.Driverクラスをロードするには、META-INF/services/Java.sql.Driverファイルに次のエントリが含まれます。

my.sql.Driver

アプリケーションは、Class.forName()を使用してJDBCドライバーを明示的にロードする必要がなくなりました。

6
Koray Tugay

com.mysql.jdbc.Driverクラスの新しいインスタンスを作成するため、静的初期化を呼び出して、ドライバーをDriverManagerに登録するので、2行目で使用するURLに基​​づいてmysql接続を作成できます。

ただし、クラスはmysql.jarにある必要があります。

5
Janick Bernet