เมื่อใช้ JDBC เราจะใช้คำสั่งต่อไปนี้ตามธรรมชาติ:
การคัดลอกรหัสมีดังนี้:
class.forName ("com.mysql.jdbc.driver");
string url = "jdbc: mysql: //127.0.0.1/test? useunicode = true & catreatencoding = utf-8";
String user = "";
String psw = "";
การเชื่อมต่อ con = drivermanager.getConnection (URL, ผู้ใช้, PSW);
เหตุใดจึงเป็นเรื่องธรรมดา
จำเป็นหรือไม่? ไม่เราสามารถแทนที่ด้วยประโยคนี้:
การคัดลอกรหัสมีดังนี้:
com.mysql.jdbc.driver ไดรเวอร์ = ใหม่ com.mysql.jdbc.driver ();
//หรือ:
// ใหม่ com.mysql.jdbc.driver ();
string url = "jdbc: mysql: //127.0.0.1/test? useunicode = true & catreatencoding = utf-8";
String user = "";
String psw = "";
การเชื่อมต่อ con = drivermanager.getConnection (URL, ผู้ใช้, PSW);
คุณอาจเห็นความคิดคร่าวๆ วิธีการทั้งสองข้างต้นสามารถใช้ฟังก์ชั่นนี้ได้ดังนั้นโปรแกรมสามารถทำงานได้ตามปกติ โปรดทราบว่าหากเราดำเนินการต่อไปนี้โปรแกรมจะไม่ทำงานตามปกติเพราะสิ่งนี้จะทำให้คลาสไดรเวอร์โหลดลงใน JVM แต่ไม่ได้ดำเนินการเริ่มต้นที่สอดคล้องกัน
การคัดลอกรหัสมีดังนี้:
com.mysql.jdbc.driver driver = null;
//หรือ:
classloader cl = new classloader ();
cl.loadclass ("com.mysql.jdbc.driver");
เราทุกคนรู้ว่า JDBC ได้รับการออกแบบโดยใช้โหมดบริดจ์ โปรดทราบว่าไดรเวอร์ก่อนหน้านี้เป็นอินเทอร์เฟซในขณะที่หลังเป็นคลาสซึ่งใช้อินเทอร์เฟซไดรเวอร์ก่อนหน้า
ในโหมดบริดจ์บทคัดย่อ (DriverManager) ต้องมีการอ้างอิงไปยัง edportoR (ไดรเวอร์) แต่ในระหว่างการใช้งานเราไม่ได้ลงทะเบียนวัตถุไดรเวอร์ลงใน DriverManager มีประโยคในคำอธิบายของไดรเวอร์เอกสารของ JDK:
เมื่อโหลดคลาสไดรเวอร์มันควรสร้างอินสแตนซ์ของตัวเองและลงทะเบียนกับ DriverManager
โอ้ปรากฎว่า com.mysql.jdbc.driver เสร็จสิ้นขั้นตอนนี้โดยอัตโนมัติหลังจากโหลด ซอร์สโค้ดเป็นเช่นนี้:
การคัดลอกรหัสมีดังนี้:
แพ็คเกจ com.mysql.jdbc
ไดรเวอร์ระดับสาธารณะขยาย NonregisteringDriver ใช้ java.sql.driver {
// ~ ฟิลด์คงที่/initializers
// ลงทะเบียนตัวเองกับ DriverManager
-
คงที่ {
พยายาม {
java.sql.driverManager.registerDriver (ไดรเวอร์ใหม่ ());
} catch (sqlexception e) {
โยน runtimeException ใหม่ ("ไม่สามารถลงทะเบียนไดรเวอร์!");
-
-
// ~ constructors
-
*สร้างไดรเวอร์ใหม่และลงทะเบียนด้วย DriverManager
-
* @throws sqlexception
* หากเกิดข้อผิดพลาดฐานข้อมูล
-
ไดรเวอร์สาธารณะ () พ่น sqlexception {
// จำเป็นสำหรับ class.forName (). newInstance ()
-
-
PS: แก้ไขการโหลดไดรเวอร์ 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 เป็นสองสิ่งที่แตกต่างกัน: คลาสอินสแตนซ์หนึ่งคลาสและคลาสที่โหลดอื่น ๆ