Hantera den aktuella linjen

Vi skrev det första programmet och det fungerade perfekt. Vi skrev en fråga, körde den och som ett resultat returnerade metoden executeQuery() ett objekt till ossresultatet sattEn som innehåller alla resultat av frågan. Och nu ska vi försöka ta reda på hur man får dessa resultat från det.

Frågeresultatet kan innehålla tusentals rader och hundratals kolumner av olika slag, så det här är inte en så trivial uppgift som du kanske tror. Till exempel kan bilder lagras i databasen, sedan kan du få en bild som en uppsättning byte eller en InputStream för att ladda ner den.

Men vi börjar med det enklaste - med konceptet " nuvarande resultatrad ". Eftersom resultatet vanligtvis har många rader, objektetresultatet satthar en pekare till den aktuella linjen inuti. Och växlar raderna sekventiellt för att läsa dem med metoden next() .

Detta tillvägagångssätt görs främst för optimering. JDBC-drivrutinen kanske inte laddar strängar från databasen förrän du sekventiellt får läsa dem. Du läser också FileInputStream sekventiellt från början till slutet. Så detta tillvägagångssätt bör vara bekant och förståeligt för dig.

Men om du verkligen behöver det kan filer läsas var som helst med klassen RandomAccessFile .

Klassen ResultSet tillåter också något liknande och låter dig flytta den aktuella raden längs resultatet var som helst. För att göra detta har den följande metoder:

Metod Beskrivning
1 Nästa() Växla till nästa rad
2 tidigare() Växla till föregående rad
3 isFirst() Nuvarande linje först?
4 isBeforeFirst() Står vi framför första raden?
5 isLast() Är den nuvarande raden den sista?
6 isAfterLast() Är vi efter deadline?
7 absolut(int n) Gör den N:e linjen aktuell
8 relativ(int n) Flyttar den aktuella raden N positioner framåt. N kan vara <0
9 getRow() Returnerar radnumret

Metoderna är ganska enkla, men två förklaringar måste göras. Resultaten är så att säga inramade av tomma streck på båda sidor. Därför är den aktuella raden initialt före den första raden i resultatet. Och för att få den första raden måste du anropa metoden next() minst en gång .

Om du anropade metoden next() på den sista raden så flyttade du till raden efter den sista . Du kan inte läsa data från den, men inget fel kommer att uppstå. Här kommer metoden isAfterLast() att deklarera sant som resultat.

Exempel:

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

Hämtar data från den aktuella raden

Du har lärt dig att mästerligt hantera den nuvarande linjen. Låt oss nu ta reda på hur man får data från den. För detta, objektetresultatet sattdet finns speciella metoder som alla kan beskrivas med en mall:

getType(numberColumns)

Men om kolumnen har ett namn kan du också komma efter kolumnnamnet:

getType(nameColumns)

Exempel:

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

Nedan kommer jag att tillhandahålla en tabell som hjälper dig att associera SQL-datatyper och ResultSet-metoder:

SQL-datatyp getXXX() metoder
RÖDING getString()
VARCHAR getString()
INT getInt()
FLYTA getDouble()
CLOB getClob()
KLICK getBlob()
DATUM getDate()
TID få tid()
TIDSSTÄMPEL getTimestamp()

Poängen, jag tror du förstår.

Få olika data om ResultSet

Vi kom på hur man läser data från den aktuella raden: både med kolumnnumret och med dess namn. Förresten, hur kan jag ta reda på kolumnnamnet efter dess nummer? Eller antalet kolumner i resultatet?

Å ena sidan, om du skriver en förfrågan, så verkar du behöva veta allt detta. Å andra sidan kan vi skriva ett program som visar resultatet av en fråga på skärmen: frågan skickas till oss och vi vill bara visa på skärmen (i konsolen, webbsidan) allt som SQL-servern returnerade till oss.

JDBC har ett speciellt objekt för detta, ResultSetMetaData- gränssnittet . Att få ett objekt av denna typ är ganska enkelt:

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

ResultSetMetaData -gränssnittet har några mycket intressanta metoder. Nedan är de mest populära:

1 getColumnCount() Returnerar antalet resultatkolumner
2 getColumnName(int kolumn) Returnerar kolumnnamnet
3 getColumnLabel(int kolumn) Returnerar beskrivningen av kolumnen
4 getColumnType() Returnerar kolumntyp: nummer (specialkod)
5 getColumnTypeName() Returnerar kolumntyp: sträng
6 getColumnClassName() Returnerar java-klassnamnet för kolumntypen
7 getTableName() Returnerar tabellnamnet
8 getCatalogName() Returnerar katalognamnet för kolumnen
9 getSchemaName() Returnerar schemanamnet för databasen
10 isAutoIncrement(int kolumn) Stöder kolumnen AUTO ÖKNING?
elva isNullable() Kan en kolumn innehålla NULL?

Låt oss använda den för att lära oss lite om vårt bord:

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

Viktig! Var uppmärksam på att kolumner är numrerade från 1. Rader, förresten, också. Hur ovanligt är det, eller hur?

Och detta är resultatet jag fick efter att ha kört programmet:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
id java.lang.Integer INT 4
namn java.lang.string VARCHAR 12
nivå java.lang.Integer INT 4
Skapat Datum java.sql.date DATUM 91
Processen avslutad med utgångskod 0