Beheren van de huidige lijn

We schreven het eerste programma en het werkte perfect. We hebben een query geschreven, uitgevoerd en als resultaat heeft de methode executeQuery() ons een object geretourneerdresultaat ingesteldEen die alle resultaten van de query bevat. En nu zullen we proberen erachter te komen hoe we deze resultaten eruit kunnen halen.

Het queryresultaat kan duizenden rijen en honderden kolommen van verschillende typen bevatten, dus dit is niet zo'n triviale taak als u misschien denkt. Afbeeldingen kunnen bijvoorbeeld in de database worden opgeslagen, waarna u een afbeelding als een set bytes of een InputStream kunt downloaden om deze te downloaden.

Maar we beginnen met de eenvoudigste - met het concept van " huidige resultaatlijn ". Aangezien het resultaat meestal veel rijen heeft, is het objectresultaat ingesteldheeft een aanwijzer naar de huidige regel binnenin. En schakelt achtereenvolgens de regels om ze te lezen met behulp van de methode next() .

Deze aanpak wordt voornamelijk gedaan voor optimalisatie. Het JDBC-stuurprogramma laadt mogelijk geen tekenreeksen uit de database totdat u ze achtereenvolgens kunt lezen. Ook u leest FileInputStream opeenvolgend van het begin tot het einde. Deze benadering moet u dus bekend en begrijpelijk zijn.

Als u het echter echt nodig hebt, kunnen bestanden overal worden gelezen met behulp van de klasse RandomAccessFile .

De klasse ResultSet staat ook iets soortgelijks toe en stelt u in staat om de huidige rij overal langs het resultaat te verplaatsen. Om dit te doen, heeft het de volgende methoden:

Methode Beschrijving
1 volgende() Schakel over naar de volgende regel
2 vorig() Schakel over naar de vorige regel
3 is eerste() Huidige regel eerst?
4 isBeforeFirst() Staan we voor de eerste linie?
5 islaatste() Is de huidige regel de laatste?
6 isnalaatste() Zijn we na de deadline?
7 absoluut(int n) Maakt de N-de regel actueel
8 relatief(int n) Verplaatst de huidige regel N posities vooruit. N kan <0 zijn
9 krijgRij() Retourneert het regelnummer

De methoden zijn vrij eenvoudig, maar er zijn twee verklaringen nodig. De resultaten worden als het ware omkaderd door lege lijnen aan weerszijden. Daarom bevindt de huidige regel zich aanvankelijk vóór de eerste regel van het resultaat. En om de eerste rij te krijgen, moet je de methode next() minstens één keer aanroepen .

Als je de next() methode op de laatste rij hebt aangeroepen, dan ben je naar de regel na de laatste gegaan . U kunt er geen gegevens uit lezen, maar er zal geen fout optreden. Hier zal de methode isAfterLast() als resultaat waar verklaren.

Voorbeeld:

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

Gegevens ophalen uit de huidige rij

Je hebt geleerd om de huidige lijn meesterlijk te beheren. Laten we nu eens kijken hoe we er gegevens uit kunnen halen. Hiervoor het voorwerpresultaat ingestelder zijn speciale methoden die allemaal door één sjabloon kunnen worden beschreven:

getType(numberColumns)

Als de kolom echter een naam heeft, kunt u ook de kolomnaam gebruiken:

getType(nameColumns)

Voorbeeld:

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

Hieronder zal ik een tabel geven die u zal helpen bij het koppelen van SQL-gegevenstypen en ResultSet-methoden:

SQL-gegevenstype getXXX() Methoden
CHAR getString()
VARCHAR getString()
INT getInt()
VLOT krijgDubbel()
KLOB haalClob()
BLOB haalBlob()
DATUM krijg datum()
TIJD krijg tijd()
TIJDSTAMP getTimestamp()

Het punt, ik denk dat je het begrijpt.

Verschillende gegevens over ResultSet ophalen

We hebben uitgezocht hoe we gegevens van de huidige regel moeten lezen: zowel op kolomnummer als op naam. Trouwens, hoe kan ik de kolomnaam vinden aan de hand van het nummer? Of het aantal kolommen in het resultaat?

Aan de ene kant, als je een verzoek schrijft, dan lijk je dit allemaal te moeten weten. Aan de andere kant kunnen we een programma schrijven dat het resultaat van een query op het scherm weergeeft: de query wordt aan ons doorgegeven en we willen alleen op het scherm (in de console, webpagina) alles weergeven wat de SQL-server heeft geretourneerd aan ons.

JDBC heeft hiervoor een speciaal object, de interface ResultSetMetaData . Een object van dit type krijgen is vrij eenvoudig:

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

De ResultSetMetaData- interface heeft een aantal zeer interessante methoden. Hieronder staan ​​de meest populaire:

1 getColumnCount() Retourneert het aantal resultaatkolommen
2 getColumnName(int kolom) Retourneert de kolomnaam
3 getColumnLabel(int kolom) Retourneert de beschrijving van de kolom
4 getColumnType() Retourneert kolomtype: nummer (speciale code)
5 getColumnTypeNaam() Retourneert kolomtype: tekenreeks
6 getColumnClassName() Retourneert de Java-klassenaam voor het kolomtype
7 getTableName() Retourneert de tabelnaam
8 getCatalogusNaam() Retourneert de mapnaam van de kolom
9 getSchemaNaam() Retourneert de schemanaam van de database
10 isAutoIncrement(int kolom) Ondersteunt de kolom AUTO INCREMENT?
elf isNullable() Kan een kolom NULL bevatten?

Laten we het gebruiken om iets over onze tafel te leren:

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

Belangrijk! Let op dat de kolommen genummerd zijn vanaf 1. Rijen trouwens ook. Hoe ongewoon is dat, toch?

En dit is het resultaat dat ik kreeg na het uitvoeren van het programma:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
ID kaart java.lang.Integer INT 4
naam java.lang.string VARCHAR 12
niveau java.lang.Integer INT 4
gemaakte_datum java.sql.datum DATUM 91
Proces beëindigd met afsluitcode 0