Verwalten der aktuellen Zeile

Wir haben das erste Programm geschrieben und es hat perfekt funktioniert. Wir haben eine Abfrage geschrieben, sie ausgeführt und als Ergebnis hat die MethodeexecuteQuery() ein Objekt an uns zurückgegebenErgebnissatzEine, die alle Ergebnisse der Abfrage enthält. Und jetzt werden wir versuchen herauszufinden, wie wir daraus diese Ergebnisse erzielen können.

Das Abfrageergebnis kann Tausende von Zeilen und Hunderte von Spalten verschiedener Typen enthalten, daher ist dies keine so triviale Aufgabe, wie Sie vielleicht denken. Beispielsweise können Bilder in der Datenbank gespeichert werden, dann können Sie ein Bild als Satz von Bytes oder einen InputStream abrufen , um es herunterzuladen.

Aber wir beginnen mit dem Einfachsten – mit dem Konzept der „ aktuellen Ergebniszeile “. Da das Ergebnis normalerweise viele Zeilen hat, ist das ObjektErgebnissatzenthält einen Zeiger auf die aktuelle Zeile. Und wechselt nacheinander die Zeilen, um sie mit der Methode next() zu lesen .

Dieser Ansatz dient in erster Linie der Optimierung. Der JDBC-Treiber lädt möglicherweise keine Zeichenfolgen aus der Datenbank, bis Sie sie nacheinander lesen können. Auch Sie lesen FileInputStream der Reihe nach vom Anfang bis zum Ende. Daher sollte Ihnen dieser Ansatz bekannt und verständlich sein.

Wenn Sie es jedoch wirklich brauchen, können Dateien mit der Klasse RandomAccessFile überall gelesen werden .

Die ResultSet- Klasse ermöglicht auch etwas Ähnliches und ermöglicht es Ihnen, die aktuelle Zeile entlang des Ergebnisses an eine beliebige Stelle zu verschieben. Hierzu stehen folgende Methoden zur Verfügung:

Methode Beschreibung
1 nächste() Zur nächsten Zeile wechseln
2 vorherige() Zur vorherigen Zeile wechseln
3 isFirst() Aktuelle Zeile zuerst?
4 isBeforeFirst() Stehen wir vor der ersten Reihe?
5 isLast() Ist die aktuelle Zeile die letzte?
6 isAfterLast() Haben wir die Frist überschritten?
7 absolut(int n) Macht die N-te Zeile aktuell
8 relative(int n) Verschiebt die aktuelle Zeile um N Positionen nach vorne. N kann <0 sein
9 getRow() Gibt die Zeilennummer zurück

Die Methoden sind recht einfach, es bedarf jedoch zweier Erklärungen. Die Ergebnisse werden sozusagen von beidseitigen Leerzeilen umrahmt. Deshalb steht zunächst die aktuelle Zeile vor der ersten Zeile des Ergebnisses. Und um die erste Zeile zu erhalten, müssen Sie die Methode next() mindestens einmal aufrufen .

Wenn Sie die next()- Methode in der letzten Zeile aufgerufen haben , sind Sie in die Zeile nach der letzten Zeile gewechselt . Sie können daraus keine Daten lesen, es tritt jedoch kein Fehler auf. Hier wird die Methode isAfterLast() als Ergebnis true deklarieren.

Beispiel:

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

Daten aus der aktuellen Zeile abrufen

Sie haben gelernt, die aktuelle Linie meisterhaft zu verwalten. Lassen Sie uns nun herausfinden, wie Sie daraus Daten erhalten. Dafür das ObjektErgebnissatzEs gibt spezielle Methoden, die alle durch eine Vorlage beschrieben werden können:

getType(numberColumns)

Wenn die Spalte jedoch einen Namen hat, können Sie sie auch über den Spaltennamen abrufen:

getType(nameColumns)

Beispiel:

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

Nachfolgend stelle ich eine Tabelle bereit, die Ihnen dabei hilft, SQL-Datentypen und ResultSet-Methoden zuzuordnen:

SQL-Datentyp getXXX()-Methoden
VERKOHLEN getString()
VARCHAR getString()
INT getInt()
SCHWEBEN getDouble()
CLOB getClob()
KLECKS getBlob()
DATUM Verabredung bekommen()
ZEIT Zeit bekommen()
ZEITSTEMPEL getTimestamp()

Der Punkt ist, ich denke, Sie haben es verstanden.

Verschiedene Daten über ResultSet abrufen

Wir haben herausgefunden, wie man Daten aus der aktuellen Zeile liest: sowohl anhand der Spaltennummer als auch anhand ihres Namens. Übrigens, wie kann ich den Spaltennamen anhand seiner Nummer herausfinden? Oder die Anzahl der Spalten im Ergebnis?

Einerseits, wenn man eine Anfrage schreibt, dann muss man das alles scheinbar wissen. Andererseits können wir ein Programm schreiben, das das Ergebnis einer Abfrage auf dem Bildschirm anzeigt: Die Abfrage wird an uns weitergeleitet und wir möchten einfach alles auf dem Bildschirm (in der Konsole, auf der Webseite) anzeigen, was der SQL-Server zurückgegeben hat zu uns.

JDBC verfügt hierfür über ein spezielles Objekt, die ResultSetMetaData- Schnittstelle . Ein Objekt dieses Typs zu erhalten ist ganz einfach:

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

Die ResultSetMetaData- Schnittstelle verfügt über einige sehr interessante Methoden. Nachfolgend sind die beliebtesten aufgeführt:

1 getColumnCount() Gibt die Anzahl der Ergebnisspalten zurück
2 getColumnName(int-Spalte) Gibt den Spaltennamen zurück
3 getColumnLabel(int-Spalte) Gibt die Beschreibung der Spalte zurück
4 getColumnType() Gibt Spaltentyp zurück: Zahl (spezieller Code)
5 getColumnTypeName() Gibt den Spaltentyp zurück: Zeichenfolge
6 getColumnClassName() Gibt den Java-Klassennamen für den Spaltentyp zurück
7 getTableName() Gibt den Tabellennamen zurück
8 getCatalogName() Gibt den Verzeichnisnamen der Spalte zurück
9 getSchemaName() Gibt den Schemanamen der Datenbank zurück
10 isAutoIncrement(int-Spalte) Unterstützt die Spalte AUTO INCREMENT?
elf isNullable() Kann eine Spalte NULL enthalten?

Lassen Sie uns damit etwas über unsere Tabelle lernen:

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

Wichtig! Achten Sie darauf, dass die Spalten ab 1 nummeriert sind. Zeilen übrigens auch. Wie ungewöhnlich ist das, oder?

Und das ist das Ergebnis, das ich nach dem Ausführen des Programms erhalten habe:

„C:\Programme\Java\jdk-17.0.3.1\bin\java.exe...“
Ausweis java.lang.Integer INT 4
Name java.lang.string VARCHAR 12
eben java.lang.Integer INT 4
erstelltes_Datum java.sql.date DATUM 91
Prozess mit Exit-Code 0 beendet