2013-02-23 124 views
12

जबकि MySQL डेटाबेस से कनेक्ट मैं निम्नलिखित है चरणोंयह क्लास.forनाम ("com.mysql.jdbc.Driver") वास्तव में क्या करता है। NewInstance();

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 में नहीं है। यह कहां मौजूद है?

उत्तर

18

Class कक्षा java.lang पैकेज में स्थित है, इसलिए इसे जावा के साथ वितरित किया जाता है, और प्रत्येक वर्ग में स्वचालित रूप से आयात किया जाता है।

forName() विधि क्या करता है, क्लास लोडर द्वारा लोड किए गए पैरामीटर के लिए Class ऑब्जेक्ट वापस लौटाता है। newInstance() विधि फिर वर्ग का एक नया उदाहरण देता है।

तो फिर क्या होता है आप Class.forName(...) फोन यह com.mysql.jdbc.Driver.class देता है। फिर आप उस कक्षा पर newInstance() पर कॉल करते हैं जो कक्षा का एक उदाहरण देता है, जिसमें कोई पैरामीटर नहीं है, इसलिए यह मूल रूप से new com.mysql.jdbc.Driver(); पर कॉल कर रहा है।

+0

आपके अच्छे स्पष्टीकरण के लिए धन्यवाद –

+0

कोई समस्या नहीं, कक्षा/कक्षा की सामग्री थोड़ा कठिन हो सकती है अपने सिर को चारों ओर लपेटने के लिए। :) – chossenger

5

यह com.mysql.jdbc.Driver वर्ग का एक नया उदाहरण पैदा करेगा और इसलिए स्थिर आरंभीकरण जो DriverManager साथ चालक रजिस्टर करेंगे ताकि आप यूआरएल आप दूसरी पंक्ति में उपयोग के आधार पर mysql कनेक्शन बना सकते हैं कहते हैं।

कक्षा हालांकि mysql.jar में होनी चाहिए।

+2

आप रजिस्टर कहते हैं स्थैतिक ब्लॉक चलाने के लिए एक उदाहरण बनाने की आवश्यकता नहीं है। –

7

यह वर्ग "com.mysql.jdbc.Driver" प्रारंभ करता है, तो classpath में पाया जाता है, यह मतलब है कि ड्राइवर JDBC ड्राइवर प्रबंधक में पंजीकृत है के बाद से पंजीकरण प्रक्रिया चालक वर्ग के स्थिर प्रारंभकर्ता अंदर है ...

एक और है दृष्टिकोण जो आप ड्राइवर को पंजीकृत करने के लिए उपयोग कर सकते हैं: स्थिर DriverManager.registerDriver() विधि का उपयोग करना है।

+0

नाम विधि क्या करती है? –

+0

कॉल के लिए कॉल ("com.mysql.jdbc.Driver") चालक नाम की कक्षा को प्रारंभ करने का कारण बनता है। – aleroot

+0

मेरे पास एक और सवाल है, असल में मैं अपना mysql पासवर्ड भूल गया हूं और मैंने mysql पासवर्ड बदलने के बारे में SO में सभी उत्तरों की जांच की है लेकिन मैं इसे पुनर्प्राप्त नहीं कर सका। क्या आप कृपया इस –

3

JDBC Specification से हवाला देते हुए, अध्याय 9, धारा 2:

JDBC ड्राइवर को ड्राइवर इंटरफ़ेस को लागू करना चाहिए, और कार्यान्वयन एक स्थिर प्रारंभकर्ता कि बुलाया जाएगा जब चालक भरी हुई है शामिल होना चाहिए। यह प्रारंभकर्ता DriverManager के साथ स्वयं का एक नया उदाहरण पंजीकृत करता है। इस प्रकार

और एक उदाहरण कोड AcmeJdbcDriver के लिए प्रदान की जाती है:

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

और जब आप Class.forName(String className) फोन API दस्तावेज़ के अनुसार, निम्न होता है:

forName लिए एक कॉल ("एक्स") एक्स नामक कक्षा को शुरू करने का कारण बनता है।

जहां प्रारंभिक स्थिति में स्थिर ब्लॉक में कोड शामिल किया गया है।

तो मूल रूप से, आप ड्राइवर वर्ग को प्रारंभ करते हैं, और बदले में क्लास java.sql के साथ स्वयं पंजीकृत होता है।जेडीबीसी विनिर्देश के अनुसार ड्राइवर प्रबंधक।

कृपया ध्यान दें, अब इसकी आवश्यकता नहीं है। विवरण here पाया जा सकता है।

DriverManager तरीकों getConnection और getDrivers जावा मानक संस्करण सेवा प्रदाता तंत्र का समर्थन करने के बढ़ाया गया है। जेडीबीसी 4.0 ड्राइवर्स में फाइल मेटा-आईएनएफ/सेवाएं/java.sql.Driver शामिल होना चाहिए। इस फ़ाइल में java.sql.Driver के जेडीबीसी ड्राइवर कार्यान्वयन का नाम शामिल है। उदाहरण के लिए, लोड करने के लिए my.sql.Driver वर्ग, META-INF/सेवाओं/java.sql.Driver फ़ाइल प्रवेश होते हैं:

my.sql.Driver 

आवेदन नहीं रह गया है explictly का उपयोग कर JDBC ड्राइवर को लोड करने के लिए की जरूरत है कक्षा .forName()।

+0

यह एक बहुत बेहतर स्पष्टीकरण है! धन्यवाद! – Casper

+0

केवल एक होने के लिए तैयार है जो उल्लेख करता है कि ऐप्स को Class.forName (..) को कॉल करने की आवश्यकता नहीं है –

-1

यह com.mysql.jdbc.Driver क्लास का एक नया उदाहरण बनाते हैं और ड्राइवर को पंजीकृत करते हैं।

तो फिर क्या होता है आप Class.forName ("com.mysql.jdbc.Driver") के बिना 'newInstance()' यह com.mysql.jdbc.Driver वर्ग वापस आती है और चालक केवल