عند استخدام JDBC ، سنستخدم العبارة التالية بشكل طبيعي:
نسخة الكود كما يلي:
class.forname ("com.mysql.jdbc.driver") ؛
url url = "jdbc: mysql: //127.0.0.1/test؟ useUnicode = true & distaryencoding = utf-8" ؛
string user = "" ؛
سلسلة psw = "" ؛
Connection con = drivermanager.getConnection (url ، user ، psw) ؛
لماذا هو طبيعي؟
هل هذا ضروري؟ لا ، يمكننا استبدالها بهذه الجملة:
نسخة الكود كما يلي:
com.mysql.jdbc.driver driver = new com.mysql.jdbc.driver () ؛
//أو:
// new com.mysql.jdbc.driver () ؛
url url = "jdbc: mysql: //127.0.0.1/test؟ useUnicode = true & distaryencoding = utf-8" ؛
string user = "" ؛
سلسلة psw = "" ؛
Connection con = drivermanager.getConnection (url ، user ، psw) ؛
ربما تكون قد شاهدت فكرة تقريبية. يمكن لكل من الطريقتين أعلاه تنفيذ هذه الوظيفة ، بحيث يمكن للبرنامج تشغيل بشكل طبيعي. لاحظ أنه إذا أجرينا العمليات التالية ، فلن يتم تشغيل البرنامج بشكل طبيعي ، لأن هذا يؤدي فقط إلى تحميل فئة السائق في JVM ، ولكن لا يؤدي أعمال التهيئة المقابلة.
نسخة الكود كما يلي:
com.mysql.jdbc.driver driver = null ؛
//أو:
classloader cl = new ClassLoader () ؛
cl.loadClass ("com.mysql.jdbc.driver") ؛
نعلم جميعًا أن JDBC مصمم باستخدام وضع الجسر. يرجى ملاحظة أن برنامج التشغيل السابق هو واجهة ، في حين أن الأخير هو فئة ، والتي تنفذ واجهة السائق السابقة.
في وضع الجسر ، يحتاج الملخص (Drivermanager) إلى إشارة إلى التنفيذ (السائق) ، ولكن أثناء الاستخدام ، لم نقم بتسجيل كائن السائق في Drivermanager. هناك جملة في وصف مستند JDK للسائق:
عند تحميل فئة السائق ، يجب أن تنشئ مثيلًا بنفسه وتسجيله مع DriverManager
أوه ، اتضح أن com.mysql.jdbc.driver أكملت هذه الخطوة تلقائيًا بعد التحميل. رمز المصدر مثل هذا:
نسخة الكود كما يلي:
حزمة com.mysql.jdbc
سائق الطبقة العامة يمتد غير المسجلة التي تنفذ java.sql.driver {
// ~ الحقول الثابتة/المهيئات
// تسجيل أنفسنا مع Drivermanager
//
ثابت {
يحاول {
java.sql.drivermanager.registerDriver (New Driver ()) ؛
} catch (sqlexception e) {
رمي New RunTimeException ("لا يمكن تسجيل برنامج التشغيل!") ؛
}
}
// ~ البنائين
/**
*بناء سائق جديد وتسجيله مع Drivermanager
*
* throws sqlexception
* في حالة حدوث خطأ في قاعدة البيانات.
*/
سائق عام () يلقي sqlexception {
// مطلوب لـ class.forname (). newinstance ()
}
}
ملاحظة: مراجعة تحميل برنامج تشغيل JDBC
نسخة الكود كما يلي:
classloader cl = thread.currentThRead (). getContextClassLoader () ؛
class clazz = cl.loadClass ("com.mysql.jdbc.driver") ؛
clazz.newinstance () ؛
Connection conn = drivermanager.getConnection ("jdbcurl") ؛
يمكن أيضًا تنفيذها. ولكن بهذه الطريقة ، نقوم ببناء مثيل إضافي من com.mysql.jdbc.driver. نفس class.forname ("com.mysql.jdbc.driver").
الآن:
نسخة الكود كما يلي:
class.forname ("com.mysql.jdbc.driver") == cl.loadClass ("com.mysql.jdbc.driver"). newinstance () ؛
class.forname و classloader.loadClass هما شيئان مختلفان: فئة واحدة تم تنشيطها والفئة الأخرى المحملة