Gestione della linea corrente

Abbiamo scritto il primo programma e ha funzionato perfettamente. Abbiamo scritto una query, l'abbiamo eseguita e, di conseguenza, il metodo executeQuery() ci ha restituito un oggettoset di risultatiAn che contiene tutti i risultati della query. E ora proveremo a capire come ottenere questi risultati da esso.

Il risultato della query può contenere migliaia di righe e centinaia di colonne di vario tipo, quindi non si tratta di un compito banale come si potrebbe pensare. Ad esempio, le immagini possono essere memorizzate nel database, quindi è possibile ottenere un'immagine come un insieme di byte o un InputStream per scaricarla.

Ma inizieremo con il più semplice - con il concetto di " linea di risultato corrente ". Poiché il risultato di solito ha molte righe, l'oggetto objectset di risultaticontiene un puntatore alla riga corrente. E cambia in sequenza le righe per leggerle usando il metodo next() .

Questo approccio viene utilizzato principalmente per l'ottimizzazione. Il driver JDBC potrebbe non caricare le stringhe dal database fino a quando non le leggi in sequenza. Anche tu leggi FileInputStream in sequenza dall'inizio alla fine. Quindi questo approccio dovrebbe esserti familiare e comprensibile.

Tuttavia, se ne hai davvero bisogno, i file possono essere letti ovunque utilizzando la classe RandomAccessFile .

La classe ResultSet consente anche qualcosa di simile e consente di spostare la riga corrente lungo il risultato ovunque. Per fare questo, ha i seguenti metodi:

Metodo Descrizione
1 Prossimo() Passa alla riga successiva
2 precedente() Passa alla riga precedente
3 èPrimo() Prima linea attuale?
4 èPrimaPrima() Siamo davanti alla prima fila?
5 èUltimo() La riga attuale è l'ultima?
6 èDopoUltimo() Siamo oltre la scadenza?
7 assoluto(int n) Rende corrente l'ennesima riga
8 relativo(int n) Sposta in avanti la riga corrente di N posizioni. N può essere <0
9 getRow() Restituisce il numero di riga

I metodi sono abbastanza semplici, ma occorre fare due spiegazioni. I risultati sono, per così dire, incorniciati da linee vuote su entrambi i lati. Pertanto, inizialmente la riga corrente è prima della prima riga del risultato. E per ottenere la prima riga, devi chiamare il metodo next() almeno una volta .

Se hai chiamato il metodo next() sull'ultima riga , ti sei spostato sulla riga dopo l'ultima . Non è possibile leggere i dati da esso, ma non si verificherà alcun errore. Qui il metodo isAfterLast() dichiarerà true come risultato.

Esempio:

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");

System.out.println( results.getRow() );        	// 0
System.out.println( results.isBeforeFirst() );  // true
System.out.println( results.isFirst() );          	// false

results.next();

System.out.println( results.getRow() );        	// 1
System.out.println( results.isBeforeFirst() );  // false
System.out.println( results.isFirst() );          	// true

results.next();

System.out.println( results.getRow() );        	// 2
System.out.println( results.isBeforeFirst() );  // false
System.out.println( results.isFirst() );          	// false

Ottenere dati dalla riga corrente

Hai imparato a gestire magistralmente la linea attuale. Ora scopriamo come ottenere dati da esso. Per questo, l'oggettoset di risultatici sono metodi speciali che possono essere tutti descritti da un modello:

getType(numberColumns)

Tuttavia, se la colonna ha un nome, puoi anche ottenere dal nome della colonna:

getType(nameColumns)

Esempio:

while (results.next()) {
        	Integer id = results.getInt(“id”);
        	String name = results.getString(“name”);
        	System.out.println(results.getRow() + ". " + id + "\t"+ name);
}

Di seguito fornirò una tabella che ti aiuterà ad associare i tipi di dati SQL e i metodi ResultSet:

Tipo di dati SQL getXXX() Metodi
CAR getString()
VARCHAR getString()
INT getInt()
GALLEGGIANTE getDouble()
CLUB getClob()
BLOB getBlob()
DATA getDate()
TEMPO prendi tempo()
TIMESTAMP getTimestamp()

Il punto, penso che tu abbia capito.

Ottenere dati diversi su ResultSet

Abbiamo capito come leggere i dati dalla riga corrente: sia dal numero della colonna che dal suo nome. A proposito, come posso scoprire il nome della colonna in base al suo numero? O il numero di colonne nel risultato?

Da un lato, se scrivi una richiesta, sembra che tu debba sapere tutto questo. Possiamo invece scrivere un programma che visualizzi sullo schermo il risultato di una query: la query ci viene passata e vogliamo solo visualizzare sullo schermo (nella console, nella pagina web) tutto ciò che il server SQL ha restituito a noi.

JDBC ha un oggetto speciale per questo, l' interfaccia ResultSetMetaData . Ottenere un oggetto di questo tipo è abbastanza semplice:

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
ResultSetMetaData resultSetMetaData = results.getMetaData();

L' interfaccia ResultSetMetaData ha alcuni metodi molto interessanti. Di seguito sono riportati i più popolari:

1 getColumnCount() Restituisce il numero di colonne dei risultati
2 getColumnName(colonna int) Restituisce il nome della colonna
3 getColumnLabel(colonna int) Restituisce la descrizione della colonna
4 getColumnType() Restituisce il tipo di colonna: numero (codice speciale)
5 getColumnTypeName() Restituisce il tipo di colonna: stringa
6 getColumnClassName() Restituisce il nome della classe Java per il tipo di colonna
7 getNomeTabella() Restituisce il nome della tabella
8 getNomeCatalogo() Restituisce il nome della directory della colonna
9 getNomeSchema() Restituisce il nome dello schema del database
10 isAutoIncrement(colonna int) La colonna supporta AUTO INCREMENT?
undici isNullable() Una colonna può contenere NULL?

Usiamolo per imparare qualcosa sulla nostra tabella:

ResultSetMetaData metaData = results.getMetaData();
int columnCount = metaData.getColumnCount();
for (int column = 1; column <= columnCount; column++)
{
        	String name = metaData.getColumnName(column);
        	String className = metaData.getColumnClassName(column);
        	String typeName = metaData.getColumnTypeName(column);
        	int type = metaData.getColumnType(column);

        	System.out.println(name + "\t" + className + "\t" + typeName + "\t" + type);
}

Importante! Fai attenzione che le colonne siano numerate da 1. Anche le righe. Quanto è insolito, vero?

E questo è il risultato che ho ottenuto dopo aver eseguito il programma:

"C:\Programmi\Java\jdk-17.0.3.1\bin\java.exe...
id java.lang.Intero INT 4
nome java.lang.stringa VARCHAR 12
livello java.lang.Intero INT 4
Data di Creazione java.sql.data DATA 91
Processo terminato con codice di uscita 0