![]() |
|
JDBC: Introduzione a Java Database Connectivity
1.INTRODUZIONE Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
A questo punto si stabilisce la connessione fra l'applicazione Java ed il database chiamando il metodo getConnection della classe DriverManager nel modo seguente:
Connection con = DriverManager.getConnection("jdbc:odbc:database");
Il metodo getConnection richiede come parametro una stringa che contiene il nome della sorgente di dati nella forma:
jdbc:<subprotocol>:<subname>dove subprotocol indica il driver da utilizzare e subname è il nome della fonte di dati. 2.4 Estrazione e modifica dei dati del Database Per eseguire delle interrogazioni o modifiche sulla base di dati si crea per prima cosa un oggetto di tipo Statement utilizzando il metodo createStatement dell'oggetto di tipo Connection ottenuto in precedenza. Statement st = con.CreateStatement();L'interfaccia Statement fornisce una serie di metodi come executeQuery ed executeUpdate per eseguire rispettivamente delle operazioni di lettura o modifica sulla base di dati tramite istruzioni SQL. Il metodo executeQuery verrà utilizzato per eseguire delle istruzioni SELECT mentre il metodo executeUpdate per l'esecuzione di istruzioni INSERT, UPDATE e DELETE. Per esempio, per eseguire una query si farà così: ResultSet rs = st.executeQuery("SELECT * FROM Tabella1");
Il parametro richiesto dal metodo executeQuery è una stringa contenente il codice SQL da eseguire. Questo metodo non fa altro che passare le istruzioni SQL al driver JDBC e successivamente ricevere da esso il risultato della query salvandolo in un oggetto di tipo ResultSet. L'utilizzo di ResultSet è spiegato in seguito (par 2.5.1).Se invece si voglionoinserire dei dati in una tabella si utilizzerà un codice dimile al seguente: st.executeUpdate("INSERT into Tabella1 (campo1, campo2) values(1,2)");
Il metodo executeUpdate non ritorna un oggetto ResultSet, le istruzioni INSERT, UPDATE e DELETE non danno infatti come risultato una tabella.Il valore ritornato è invece un intero che indica il numero di record modificati. Un altro esempio potrebbe essere quindi:
int nRows = st.executeUpdate("DELETE * FROM Tabella2 WHERE campo1 > 0");
System.out.println("Sono stati eliminati " + nRows + " record");
Queste due righe di codice eliminano i record della tabella Tabella2 in cui il valore del campo campo1 è maggiore di 0 e successivamente visualizzano il numero di record cancellati.Oltre all'interfaccia Statement esistono anche le interfacce PreparedStatement e CallableStatement. L'utilizzo di PreparedStatement è conveniente nel caso di query eseguite ripetutamente, in quanto consente di specificare parzialmente delle query e richiamarle successivamente modificando solamente i nomi dei parametri. In questo modo l'esecuzione è più rapida, in quanto il PreparedStatement conosce già la forma dell'interrogazione e deve solo cambiarne i parametri. Inizialmente bisogna quindi creare l'interrogazione indicando con il carattere '?' i parametri il cui valore sarà inserito. PreparedStatement ps = con.prepareStatement("INSERT into Tabella3 (parametro1,parametro2) values (?,?)");
Per inserire i valore mancanti si utilizzano i metodi setXXX (dove XXX è un tipo di dato) a cui vanno passati due parametri: il primo è l'indice del parametro della query che si vuole specificare, il secondo è il valore che gli si vuole dare.
ps.setString(1,"Ciao"); ps.setInt(2,15); ps.execute();La prima riga di quest'esempio specifica che il primo parametro dell'interrogazione è una stringa il cui valore è "Ciao", nella seconda riga invece si specifica che il secondo parametro dell'interrogazione è un intero di valore 15. L'ultima riga esegue l'interrogazione sul database con i parametri specificati. L'interfaccia CallableStatement consente invece di eseguire delle procedure memorizzate all'interno del database. Per prima cosa è necessario creare un oggetto CallableStatement indicando, come per PreparedStatement, i parametri con un punto di domanda. CallableStatement cs = con.prepareCall(" { ? = Procedura1 ? }");
Da notare che il primo '?' non indica un parametro di input ma uno di output. Prima di eseguire la procedura bisogna specificare esplicitamente di che tipo è il valore di ritorno della procedura tramite il metodo RegisterOutParameter.
cs.RegisterOutParameter(1,Types.INTEGER);Questa istruzione specifica che il primo parametro del metodo prepareCall chiamato in precedenza è un parametro di output ed è un intero. Per eseguire la procedura: cs.setInt(2,10); cs.execute();La prima istruzione specifica che il parametro passato alla procedura (quindi il secondo '?' nella prepareCall) è un intero di valore 10. La seconda istruzione esegue la procedura con i parametri specificati. Per leggere il valore ritornato dalla procedura si utilizza il metodo getXXX (dove XXX indica il tipo di dato). int val = cs.getInt(1);Si era specificato in precedenza che il valore ritornato dalla procedura era di tipo intero, utilizziamo quindi il metodo getInt per leggerlo e lo salviamo in una variabile di tipo int. 2.5 Elaborare i dati Oltre ad eseguire delle interrogazioni sulla base di dati, molto probabilmente si vorranno anche visualizzare i risultati ottenuti. A differenza di SQL però, un linguaggio procedurale come Java non è pensato per operare su tabelle. A questo scopo sono quindi presenti le interfacce ResultSet, ResultSetMetaData e DatabaseMetaData. 2.5.1 ResultSet e cursori Un oggetto di tipo ResultSet fornisce l'accesso ad una tabella. Poichè una tabella può essere composta da due o più colonne (campi) e righe (record), per accedere ai dati si utilizza un cursore. Un cursore è simile ad un puntatore che indica un determinato record di una tabella; è possibile quindi leggere i valori dei campi del record selezionato. In ogni momento è possibile spostare il cursore sul record successivo o precedente a quello corrente oppure è possibile posizionarlo su un qualunque altro record specificandone l'indice. Per esempio per visualizzare i dati di una tabella è possibile procedere come segue:
while(rs.next())
{
String var1 = rs.getString("campo1")
System.out.println(var1);
}
Quando l'oggetto ResultSet viene creato il cursore punta al record "precedente al primo", quindi in realtà non punta a niente. In questo modo però è possibile scrivere un codice più elegante per scorrere tutta la tabella utilizzando un ciclo while.Il metodo next sposta il cursore sul record successivo a quello corrente e ritorna vero se il nuovo record selezionato è valido, falso se non ci sono altri record nella tabella. Il metodo getString richiede come parametro il nome di un campo della tabella e ritorna il valore di quel campo nel record corrente. Questo metodo legge il valore del campo come se fosse un campo di testo ma esiste un metodo per ogni tipo di dato (getInt, getFloat, getDate, getObject...). 2.5.2 I metadati Negli esempi precedenti si è lavorato con il presupposto di conoscere a priori lo schema del DB. In alcuni casi comunque questo non avviene e, per esempio, si ha la necessità di visualizzare il contenuto di una tabella senza sapere quanti campia ha, quali sono i loro nomi e che tipo di dati contengono. Per risolvere il problema si possono utilizzare le interfacce ResultSetMetaData e DatabaseMetaData che consentono di ottenere informazioni sullo schema del database. Ad esempio, se volessimo visualizzare l'intestazione di una tabella che non conosciamo potremmo utilizzare il seguente codice:
ResultSetMetaData rsMeta = rs.getMetaData();
int nColumn = rsMeta.getColumnCount();
for(int i=1; i <= nColumn; i++)
{
System.out.println(rsMeta,getColumnName(i) + " ");
}
Con il metodo getMetaData creiamo un oggetto di tipo ResultSetMetaData che ci fornisce i metadati della nostra tabella.Il metodo getColumnCount ritorna il numero di campi della tabella; il metodo getColumnName ritorna il nome del campo nella posizione i-esima. Questo frammento di codice, quindi, prima legge quanti campi contiene la tabella e poi li scorre uno a uno visualizzandone il nome. L'interfaccia ResultSetMetaData consente di ottenere molti altri dati sullo schema di una tabella mentre l'interfaccia DatabaseMetaData fornisce dati generici sulla base di dati come tipo di database, version, grammatiche SQL supportate, istruzioni supportate (ad esempio se è supportata o meno l'istruzione UNION) e cosi via. TAGS - java, java sun, jdbc, java database connectivity |
IN EVIDENZA
Una slidegallery con jQuery
Pagamenti online con PayPal e PHP
Breve guida a jQuery
Effetto ombra su testo con Photoshop
Guadagna col tuo sito grazie a TradeD...
Guida XHTML
Riscrivere le URL con Asp
Riavviare IIS
HTTP 500 internal server error
Generare password casuali in Javascri...
Errore 80004005: Cannot update. Datab...
Introduzione ad Ajax ed Asp con Jscri...
Referenze dei Tag Html
Stringhe di connessione via ODBC e Ol...
Referenze dei fogli di stile Css
Le espressioni regolari in Javascript
|
||||
© 2001/2010 lukeonweb.net - A cura di Luca Ruggiero, Partita IVA 05564851219 -
Privacy |
Pubblicità |
Contatti
| |||||