Gestionarea liniei curente

Am scris primul program și a funcționat perfect. Am scris o interogare, am executat-o ​​și, ca rezultat, metoda executeQuery() ne-a returnat un obiectsetul de rezultateUn care conține toate rezultatele interogării. Și acum vom încerca să ne dăm seama cum să obținem aceste rezultate din ea.

Rezultatul interogării poate conține mii de rânduri și sute de coloane de diferite tipuri, așa că aceasta nu este o sarcină atât de banală pe cât ați putea crede. De exemplu, imaginile pot fi stocate în baza de date, apoi puteți obține o imagine ca un set de octeți sau un InputStream pentru a o descărca.

Dar vom începe cu cel mai simplu - cu conceptul de „ linie de rezultat curent ”. Deoarece rezultatul are de obicei o mulțime de rânduri, obiectulsetul de rezultateare un pointer către linia curentă în interior. Și schimbă secvențial liniile pentru a le citi folosind metoda next() .

Această abordare este făcută în primul rând pentru optimizare. Este posibil ca driverul JDBC să nu încarce șiruri din baza de date până când nu ajungeți să le citiți succesiv. Citiți și dvs. FileInputStream secvenţial de la început până la sfârșit. Prin urmare, această abordare ar trebui să vă fie familiară și de înțeles.

Cu toate acestea, dacă aveți într-adevăr nevoie de el, atunci fișierele pot fi citite oriunde folosind clasa RandomAccessFile .

Clasa ResultSet permite, de asemenea, ceva similar și vă permite să mutați rândul curent de-a lungul rezultatului oriunde. Pentru a face acest lucru, are următoarele metode:

Metodă Descriere
1 Următorul() Comutați la linia următoare
2 anterior() Comutați la linia anterioară
3 este primul () Prima linie curentă?
4 isBeforeFirst() Suntem în fața primei rânduri?
5 isLast() Linia actuală este ultima?
6 isAfterLast() Suntem după termenul limită?
7 absolut (int n) Face a N-a linie curentă
8 relativă (int n) Mută ​​linia curentă N poziții înainte. N poate fi <0
9 getRow() Returnează numărul liniei

Metodele sunt destul de simple, dar trebuie făcute două explicații. Rezultatele sunt, parcă, încadrate de linii goale pe ambele părți. Prin urmare, inițial linia curentă este înaintea primei linie a rezultatului. Și pentru a obține primul rând, trebuie să apelați metoda next() cel puțin o dată .

Dacă ați apelat metoda next() pe ultimul rând , atunci ați trecut la linia de după ultimul . Nu puteți citi date din acesta, dar nu va apărea nicio eroare. Aici metoda isAfterLast() va declara adevărat ca rezultat.

Exemplu:

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

Obținerea datelor de pe rândul curent

Ați învățat să gestionați cu măiestrie linia curentă. Acum să ne dăm seama cum să obținem date din el. Pentru aceasta, obiectulsetul de rezultateExistă metode speciale care pot fi descrise toate printr-un singur șablon:

getType(numberColumns)

Cu toate acestea, dacă coloana are un nume, atunci puteți obține și după numele coloanei:

getType(nameColumns)

Exemplu:

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

Mai jos voi oferi un tabel care vă va ajuta să asociați tipurile de date SQL și metodele ResultSet:

tip de date SQL Metode getXXX().
CHAR getString()
VARCHAR getString()
INT getInt()
PLUTI getDouble()
CLOB getClob()
BLOB getBlob()
DATA getDate()
TIMP Fă-ți timp()
TIMESTAMP-UL getTimestamp()

Ideea, cred că înțelegi.

Obținerea de date diferite despre ResultSet

Ne-am dat seama cum să citim datele din linia curentă: atât după numărul coloanei, cât și după numele acesteia. Apropo, cum pot afla numele coloanei după numărul ei? Sau numărul de coloane din rezultat?

Pe de o parte, dacă scrii o cerere, atunci se pare că trebuie să știi toate acestea. Pe de altă parte, putem scrie un program care afișează rezultatul unei interogări pe ecran: interogarea ne este transmisă și vrem doar să afișăm pe ecran (în consolă, pagina web) tot ce a returnat serverul SQL pentru noi.

JDBC are un obiect special pentru aceasta, interfața ResultSetMetaData . Obținerea unui obiect de acest tip este destul de simplă:

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

Interfața ResultSetMetaData are câteva metode foarte interesante. Mai jos sunt cele mai populare:

1 getColumnCount() Returnează numărul de coloane cu rezultate
2 getColumnName(coloana int) Returnează numele coloanei
3 getColumnLabel(coloana int) Returnează descrierea coloanei
4 getColumnType() Returnează tipul coloanei: număr (cod special)
5 getColumnTypeName() Returnează tipul de coloană: șir
6 getColumnClassName() Returnează numele clasei java pentru tipul de coloană
7 getTableName() Returnează numele tabelului
8 getCatalogName() Returnează numele directorului coloanei
9 getSchemaName() Returnează numele schemei bazei de date
10 isAutoIncrement(coloana int) Coloana acceptă INCREMENT AUTOMAT?
unsprezece este Nullable() Poate o coloană să conțină NULL?

Să-l folosim pentru a afla puțin despre masa noastră:

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);
}

Important! Atenție că coloanele sunt numerotate de la 1. Apropo, și rândurile. Cât de neobișnuit este, nu?

Și acesta este rezultatul pe care l-am obținut după rularea programului:

„C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
id java.lang.Integer INT 4
Nume java.lang.string VARCHAR 12
nivel java.lang.Integer INT 4
data creata java.sql.date DATA 91
Procesul s-a încheiat cu codul de ieșire 0