Håndtering af den aktuelle linje

Vi skrev det første program, og det fungerede perfekt. Vi skrev en forespørgsel, udførte den, og som et resultat returnerede executeQuery()- metoden et objekt til osresultatsætEn som indeholder alle resultaterne af forespørgslen. Og nu vil vi prøve at finde ud af, hvordan man får disse resultater fra det.

Forespørgselsresultatet kan indeholde tusindvis af rækker og hundredvis af kolonner af forskellige typer, så dette er ikke så triviel en opgave, som du måske tror. For eksempel kan billeder gemmes i databasen, så kan du få et billede som et sæt bytes eller en InputStream til at downloade det.

Men vi starter med det enkleste - med konceptet " aktuel resultatlinje ". Da resultatet normalt har mange rækker, vil objektetresultatsæthar en pegepind til den aktuelle linje indeni. Og skifter sekventielt linjerne for at læse dem ved hjælp af metoden next() .

Denne tilgang er primært lavet for optimering. JDBC-driveren indlæser muligvis ikke strenge fra databasen, før du sekventielt kan læse dem. Du læser også FileInputStream sekventielt fra begyndelsen til slutningen. Så denne tilgang bør være bekendt og forståelig for dig.

Men hvis du virkelig har brug for det, så kan filer læses hvor som helst ved hjælp af RandomAccessFile- klassen .

ResultSet- klassen tillader også noget lignende og giver dig mulighed for at flytte den aktuelle række langs resultatet hvor som helst. For at gøre dette har den følgende metoder:

Metode Beskrivelse
1 Næste() Skift til næste linje
2 Tidligere() Skift til forrige linje
3 er først() Nuværende linje først?
4 isBeforeFirst() Er vi foran den første linje?
5 er Sidste() Er den nuværende linje den sidste?
6 erAfterLast() Er vi efter deadline?
7 absolut(int n) Gør den N'te linje aktuel
8 relativ(int n) Flytter den aktuelle linje N positioner fremad. N kan være <0
9 getRow() Returnerer linjenummeret

Metoderne er ret enkle, men der skal laves to forklaringer. Resultaterne er så at sige indrammet af tomme streger på begge sider. Derfor er den aktuelle linje i første omgang før den første linje i resultatet. Og for at få den første række, skal du kalde metoden next() mindst én gang .

Hvis du kaldte metoden next() på den sidste række , så flyttede du til linjen efter den sidste . Du kan ikke læse data fra den, men der opstår ingen fejl. Her vil isAfterLast() metoden erklære sand som resultatet.

Eksempel:

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

Henter data fra den aktuelle række

Du har lært at styre den nuværende linje mesterligt. Lad os nu finde ud af, hvordan man får data fra det. Til dette, objektetresultatsætder er specielle metoder, der alle kan beskrives med én skabelon:

getType(numberColumns)

Men hvis kolonnen har et navn, kan du også få ved kolonnenavnet:

getType(nameColumns)

Eksempel:

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

Nedenfor vil jeg give en tabel, der hjælper dig med at tilknytte SQL-datatyper og ResultSet-metoder:

SQL datatype getXXX() metoder
CHAR getString()
VARCHAR getString()
INT getInt()
FLYDE getDouble()
KLUB getClob()
BLOB getBlob()
DATO getDate()
TID getTime()
TIDSSTEMPEL getTimestamp()

Pointen, jeg tror du forstår.

Få forskellige data om ResultSet

Vi fandt ud af, hvordan man læser data fra den aktuelle linje: både ved kolonnenummeret og ved dets navn. Hvordan kan jeg forresten finde ud af kolonnenavnet ved dets nummer? Eller antallet af kolonner i resultatet?

På den ene side, hvis du skriver en anmodning, så ser du ud til at du skal vide alt dette. På den anden side kan vi skrive et program, der viser resultatet af en forespørgsel på skærmen: forespørgslen sendes til os, og vi vil bare vise alt, hvad SQL-serveren returnerede på skærmen (i konsollen, websiden). til os.

JDBC har et specielt objekt til dette, ResultSetMetaData- grænsefladen . At få et objekt af denne type er ret simpelt:

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

ResultSetMetaData- grænsefladen har nogle meget interessante metoder. Nedenfor er de mest populære:

1 getColumnCount() Returnerer antallet af resultatkolonner
2 getColumnName(int kolonne) Returnerer kolonnenavnet
3 getColumnLabel(int column) Returnerer beskrivelsen af ​​kolonnen
4 getColumnType() Returnerer kolonnetype: nummer (specialkode)
5 getColumnTypeName() Returnerer kolonnetype: streng
6 getColumnClassName() Returnerer java-klassenavnet for kolonnetypen
7 getTableName() Returnerer tabelnavnet
8 getCatalogName() Returnerer biblioteksnavnet på kolonnen
9 getSchemaName() Returnerer skemanavnet for databasen
10 erAutoIncrement(int kolonne) Understøtter kolonnen AUTO FORØGNING?
elleve er nullbar() Kan en kolonne indeholde NULL?

Lad os bruge det til at lære lidt om vores tabel:

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

Vigtig! Vær opmærksom på, at kolonner er nummereret fra 1. Rækker i øvrigt også. Hvor usædvanligt er det, ikke?

Og dette er resultatet, jeg fik efter at have kørt programmet:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
id java.lang.Integer INT 4
navn java.lang.string VARCHAR 12
niveau java.lang.Integer INT 4
oprettet_dato java.sql.date DATO 91
Processen afsluttet med udgangskode 0