Saat menggunakan JDBC, kami secara alami akan menggunakan pernyataan berikut:
Salinan kode adalah sebagai berikut:
Class.forname ("com.mysql.jdbc.driver");
String url = "jdbc: mysql: //127.0.0.1/test? UseUnicode = true & characterencoding = utf-8";
String user = "";
String psw = "";
Koneksi con = driverManager.getConnection (url, user, psw);
Mengapa ini alami?
Apakah ini perlu? Tidak, kita bisa menggantinya dengan kalimat ini:
Salinan kode adalah sebagai berikut:
com.mysql.jdbc.driver driver = com.mysql.jdbc.driver () baru;
//atau:
// com.mysql.jdbc.driver () baru;
String url = "jdbc: mysql: //127.0.0.1/test? UseUnicode = true & characterencoding = utf-8";
String user = "";
String psw = "";
Koneksi con = driverManager.getConnection (url, user, psw);
Anda mungkin telah melihat ide kasar. Kedua metode di atas dapat mengimplementasikan fungsi ini, sehingga program dapat berjalan secara normal. Perhatikan bahwa jika kami melakukan operasi berikut, program tidak akan berjalan secara normal, karena ini hanya menyebabkan kelas driver dimuat ke JVM, tetapi tidak melakukan pekerjaan inisialisasi yang sesuai.
Salinan kode adalah sebagai berikut:
com.mysql.jdbc.driver driver = null;
//atau:
Classloader cl = classloader baru ();
cl.LoadClass ("com.mysql.jdbc.driver");
Kita semua tahu bahwa JDBC dirancang menggunakan Mode Jembatan. Harap dicatat bahwa driver sebelumnya adalah antarmuka, sedangkan yang terakhir adalah kelas, yang mengimplementasikan antarmuka driver sebelumnya.
Dalam Mode Jembatan, Abstrak (DriverManager) perlu memiliki referensi ke implementasi (driver), tetapi selama penggunaannya, kami tidak mendaftarkan objek driver ke dalam driverManager. Ada kalimat dalam deskripsi dokumen JDK tentang pengemudi:
Saat kelas driver dimuat, itu harus membuat instance sendiri dan mendaftarkannya dengan driverManager
Oh, ternyata com.mysql.jdbc.driver secara otomatis menyelesaikan langkah ini setelah memuat. Kode sumber seperti ini:
Salinan kode adalah sebagai berikut:
Paket com.mysql.jdbc
Driver kelas publik memperluas nonregisteringdriver mengimplementasikan java.sql.driver {
// ~ bidang/inisialisasi statis
// Daftarkan diri kita dengan driverManager
//
statis {
mencoba {
java.sql.drivermanager.registerdriver (driver baru ());
} catch (sqlexception e) {
Lempar RuntimeException baru ("Tidak dapat mendaftar driver!");
}
}
// ~ Konstruktor
/**
*Bangun driver baru dan daftarkan dengan driverManager
*
* @Throws SQlexception
* Jika kesalahan database terjadi.
*/
driver publik () melempar sqlexception {
// Diperlukan untuk class.forname (). NewInstance ()
}
}
PS: Revisi pemuatan driver JDBC
Salinan kode adalah sebagai berikut:
Classloader cl = thread.currentThread (). GetContextClassLoader ();
Class clazz = cl.LoadClass ("com.mysql.jdbc.driver");
clazz.newinstance ();
Koneksi conn = driverManager.getConnection ("jdbcurl");
Itu juga dapat dieksekusi. Tetapi dengan cara ini, kami membangun instance tambahan com.mysql.jdbc.driver. Sama seperti class.forname ("com.mysql.jdbc.driver").
Sekarang:
Salinan kode adalah sebagai berikut:
Class.forname ("com.mysql.jdbc.driver") == cl.LoadClass ("com.mysql.jdbc.driver"). Newinstance ();
Class.forname dan classloader.loadClass adalah dua hal yang berbeda: satu kelas instantiated dan kelas lainnya yang dimuat