2013-02-23 28 views
12

durante la connessione al database MySQL Io seguenti operazionicosa fa esattamente questo Class.forName ("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"); 

In realtà volevo sapere che cosa fa Class.forName("com.mysql.jdbc.Driver").newInstance(); dichiarazione fare.

Althogh questa classe non è in mysql.jar. Dove è presente?

risposta

18

La classe Class si trova nel pacchetto java.lang, quindi è distribuita con java e importata automaticamente in ogni classe.

Il metodo forName() restituisce l'oggetto Class per il parametro caricato dal programma di caricamento classi. Il metodo newInstance() restituisce quindi una nuova istanza della classe.

Allora quello che succede è che chiamate Class.forName(...) restituisce com.mysql.jdbc.Driver.class. Chiamate quindi newInstance() su quella classe che restituisce un'istanza della classe, con nessun parametro, quindi in pratica chiama lo new com.mysql.jdbc.Driver();.

+0

grazie per le tue buone spiegazioni –

+0

Nessun problema, la roba di classe/classe può essere un po 'difficile per avvolgere la testa. :) – chossenger

5

Creerà una nuova istanza della classe com.mysql.jdbc.Driver e quindi richiamerà l'inizializzazione statica che registrerà il driver con lo DriverManager in modo da poter creare connessioni mysql in base all'URL che si utilizza nella seconda riga.

La classe dovrebbe tuttavia essere nello mysql.jar.

+2

È non è necessario creare un'istanza per eseguire il blocco statico. –

7

E inizializzare la classe "com.mysql.jdbc.Driver" se trovato nel classpath, questo implica che il driver è stato registrato nel gestore driver JDBC dal momento che il processo di registrazione si trova all'interno del inizializzatore statico della classe del driver ...

C'è un altro approccio che è possibile utilizzare per registrare un driver: è quello di utilizzare il metodo statico DriverManager.registerDriver().

+0

cosa fa il metodo forName? –

+0

Una chiamata a forName ("com.mysql.jdbc.Driver") provoca l'inizializzazione della classe denominata Driver. – aleroot

+0

ho un'altra domanda, in realtà ho dimenticato la mia password mysql e ho controllato tutta la risposta in SO riguardo alla modifica della password mysql ma non sono riuscita a recuperarla. Potete per favore aiutarmi in questo –

3

Citando dal JDBC Specification, capitolo 9, sezione 2:

driver JDBC devono implementare l'interfaccia del driver, e l'implementazione devono contenere un inizializzatore statico che verrà chiamato quando il driver viene caricato. Questo inizializzatore registra una nuova istanza con il DriverManager.

e il codice di esempio è previsto AcmeJdbcDriver come segue:

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

E quando si chiama Class.forName(String className), secondo la documentazione API, avviene quanto segue:

Una chiamata forName ("X") provoca l'inizializzazione della classe chiamata X.

dove inizializzazione implica il codice nel blocco statico da eseguire.

Quindi, in pratica, si inizializza la classe Driver e, a sua volta, la classe si registra con java.sql.DriverManager secondo le specifiche JDBC.

Si prega di notare, questo non è più necessario. Dettagli possono essere trovati here.

La metodi DriverManager getConnection e getDrivers sono stati migliorato per supportare il provider meccanismo di Java Standard Edition Service. I driver JDBC 4.0 devono includere il file META-INF/services/java.sql.Driver. Questo file contiene il nome dell'implementazione dei driver JDBC di java.sql.Driver. Per esempio, per caricare classe my.sql.Driver, META-INF/services/file java.sql.Driver conterrebbe la voce:

my.sql.Driver 

applicazioni non è più necessario per caricare esplicitamente driver JDBC utilizzando Class.forName().

+0

Questa è una spiegazione molto migliore! Grazie! – Casper

+0

aumentato per essere l'unico a dire che le app non hanno più bisogno di chiamare Class.forName (..) –

-1

Crea una nuova istanza della classe com.mysql.jdbc.Driver e registra il driver.

Allora quello che succede è che chiamate Class.forName ("com.mysql.jdbc.Driver") senza 'newInstance()' restituisce classe com.mysql.jdbc.Driver e registrare il driver solo

Problemi correlati