Az aktuális sor kezelése

Megírtuk az első programot, és tökéletesen működött. Írtunk egy lekérdezést, végrehajtottuk, és ennek eredményeként az executeQuery() metódus egy objektumot adott vissza nekünkeredménykészletEgy, amely tartalmazza a lekérdezés összes eredményét. És most megpróbáljuk kitalálni, hogyan érhetjük el ezeket az eredményeket.

A lekérdezés eredménye több ezer sort és több száz különböző típusú oszlopot tartalmazhat, így ez nem olyan triviális feladat, mint gondolná. Például képeket lehet tárolni az adatbázisban, majd letölthető egy képet bájtkészletként vagy egy InputStream segítségével.

De kezdjük a legegyszerűbbvel - az „ aktuális eredménysor ” fogalmával . Mivel az eredmény általában sok sorból áll, az objektumeredménykészletbelül van egy mutató az aktuális sorra. És szekvenciálisan átkapcsolja a sorokat, hogy elolvassa őket a next() metódussal .

Ez a megközelítés elsősorban optimalizálásra szolgál. Előfordulhat, hogy a JDBC illesztőprogram nem tölti be a karakterláncokat az adatbázisból, amíg el nem olvassa őket egymás után. Ön is olvassa el a FileInputStream-et szekvenciálisan az elejétől a végéig. Tehát ennek a megközelítésnek ismerősnek és érthetőnek kell lennie az Ön számára.

Ha azonban valóban szüksége van rá, akkor a fájlok bárhol olvashatók a RandomAccessFile osztály segítségével .

A ResultSet osztály is lehetővé tesz valami hasonlót, és lehetővé teszi, hogy az aktuális sort bárhová mozgassa az eredmény mentén. Ehhez a következő módszerekkel rendelkezik:

Módszer Leírás
1 következő() Váltás a következő sorra
2 előző() Váltás az előző sorra
3 isFirst() Az aktuális vonal első?
4 isBeforeFirst() Az első sor előtt állunk?
5 isLast() A jelenlegi sor az utolsó?
6 isAfter Last() Túl vagyunk a határidőn?
7 abszolút (nint) Aktuálissá teszi az N-edik sort
8 rokon(int n) Az aktuális sort N pozícióval előre mozgatja. N lehet <0
9 getRow() A sor számát adja vissza

A módszerek meglehetősen egyszerűek, de két magyarázatra van szükség. Az eredményeket mindkét oldalon üres sorok keretezték. Ezért kezdetben az aktuális sor az eredmény első sora előtt van. És az első sor eléréséhez legalább egyszer meg kell hívnia a next() metódust .

Ha az utolsó sorban hívtad meg a next() metódust, akkor az utolsó utáni sorba léptél . Adatokat nem lehet kiolvasni belőle, de nem történik hiba. Itt az isAfterLast() metódus igazat ad eredményül.

Példa:

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

Adatok lekérése az aktuális sorból

Megtanultad mesterien kezelni az aktuális vonalat. Most nézzük meg, hogyan lehet adatokat szerezni belőle. Ehhez az objektumeredménykészletVannak speciális módszerek, amelyek mindegyike egy sablonnal leírható:

getType(numberColumns)

Ha azonban az oszlopnak van neve, akkor az oszlopnév alapján is megadhatja:

getType(nameColumns)

Példa:

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

Az alábbiakban bemutatok egy táblázatot, amely segít az SQL adattípusok és ResultSet metódusok társításában:

SQL adattípus getXXX() Methods
CHAR getString()
VARCHAR getString()
INT getInt()
ÚSZÓ getDouble()
CLOB getClob()
FOLT getBlob()
DÁTUM getDate()
IDŐ getTime()
IDŐBÉLYEG getTimestamp()

A lényeg, szerintem érted.

Különféle adatok lekérése a ResultSetről

Kitaláltuk, hogyan olvassunk ki adatokat az aktuális sorból: mind az oszlopszám, mind a név alapján. Egyébként hogyan találhatom meg az oszlop nevét a szám alapján? Vagy az eredmény oszlopainak száma?

Egyrészt, ha felkérést ír, akkor úgy tűnik, mindezt tudnia kell. Másrészt írhatunk olyan programot, amely egy lekérdezés eredményét megjeleníti a képernyőn: a lekérdezést átadják nekünk, és mi csak a képernyőn (konzolban, weboldalon) akarjuk megjeleníteni mindazt, amit az SQL szerver visszaadott. nekünk.

A JDBC-nek erre van egy speciális objektuma, a ResultSetMetaData felület . Az ilyen típusú objektumok beszerzése meglehetősen egyszerű:

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

A ResultSetMetaData felületnek van néhány nagyon érdekes módszere. Az alábbiakban felsoroljuk a legnépszerűbbeket:

1 getColumnCount() Az eredményoszlopok számát adja vissza
2 getColumnName(int oszlop) Az oszlop nevét adja vissza
3 getColumnLabel(int oszlop) Az oszlop leírását adja vissza
4 getColumnType() Az oszlop típusa: szám (speciális kód)
5 getColumnTypeName() A következő oszloptípust adja vissza: string
6 getColumnClassName() Az oszloptípus java osztálynevét adja vissza
7 getTableName() A tábla nevét adja vissza
8 getCatalogName() Az oszlop könyvtárnevét adja vissza
9 getSchemaName() Az adatbázis sémanevét adja vissza
10 isAutoIncrement (belső oszlop) Támogatja az oszlop az AUTOMATIKUS NÖVEKEDÉS funkciót?
tizenegy isNullable() Tartalmazhat egy oszlop NULL-t?

Használjuk, hogy tanuljunk egy kicsit a táblázatunkról:

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

Fontos! Ügyeljen arra, hogy az oszlopok 1-től vannak számozva. A sorok egyébként is. Ugye milyen szokatlan?

És ez az eredmény, amit a program futtatása után kaptam:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
id java.lang.Integer INT 4
név java.lang.string VARCHAR 12
szint java.lang.Integer INT 4
Létrehozás dátuma java.sql.date DÁTUM 91
A folyamat a 0 kilépési kóddal fejeződött be