Ngatur baris saiki

We wrote program pisanan lan makarya sampurna. Kita nulis pitakon, dieksekusi, lan minangka asil, metode executeQuery () ngasilake obyek marang kita.set asilSing ngemot kabeh asil pitakon. Lan saiki kita bakal nyoba ngerteni carane entuk asil kasebut.

Asil pitakon bisa ngemot ewonan larik lan atusan kolom saka macem-macem jinis, mula iki ora dadi tugas sing sepele kaya sing sampeyan pikirake. Contone, gambar bisa disimpen ing database, banjur sampeyan bisa njupuk gambar minangka set bita utawa InputStream kanggo ngundhuh.

Nanging kita bakal miwiti kanthi sing paling gampang - kanthi konsep " garis asil saiki ". Wiwit asil biasane wis akeh larik, obyekset asilwis pointer kanggo baris saiki nang. Lan sequentially ngalih baris kanggo maca nggunakake sabanjuré () cara .

Pendekatan iki utamane ditindakake kanggo optimasi. Driver JDBC bisa uga ora mbukak senar saka database nganti sampeyan bisa maca kanthi urutan. Sampeyan uga maca FileInputStream kanthi urut saka wiwitan nganti pungkasan. Dadi pendekatan iki kudu akrab lan bisa dingerteni sampeyan.

Nanging, yen sampeyan pancene mbutuhake, file bisa diwaca ing ngendi wae nggunakake kelas RandomAccessFile .

Kelas ResultSet uga ngidini sing padha lan ngidini sampeyan mindhah baris saiki ing asil ing ngendi wae. Kanggo nindakake iki, ana cara ing ngisor iki:

Metode Katrangan
1 sabanjure () Ngalih menyang baris sabanjure
2 sadurunge () Ngalih menyang baris sadurunge
3 pisanan () Baris saiki pisanan?
4 isBeforeFirst() Apa kita ing ngarep baris pisanan?
5 isLast() Apa baris saiki sing pungkasan?
6 isAfterLast() Apa kita sawise deadline?
7 mutlak (int n) Ndadekake baris Nth saiki
8 relatif (int n) Ngalih posisi garis saiki N maju. N bisa <0
9 getRow() Ngasilake nomer baris

Cara kasebut cukup prasaja, nanging rong panjelasan kudu digawe. Asil kasebut, kaya-kaya, dipigura dening garis kosong ing loro-lorone. Mulane, wiwitan baris saiki sadurunge baris pisanan asil. Lan kanggo njaluk baris pisanan, sampeyan kudu nelpon sabanjuré () cara paling sapisan .

Yen sampeyan nelpon cara sabanjure () ing baris pungkasan , sampeyan pindhah menyang baris sawise sing pungkasan . Sampeyan ora bisa maca data saka iku, nanging ora ana kesalahan. Ing kene metode isAfterLast () bakal ngumumake bener minangka asil.

Tuladha:

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

Njupuk data saka baris saiki

Sampeyan wis sinau kanggo masterfully ngatur baris saiki. Saiki ayo goleki carane njaluk data saka iku. Kanggo iki, obyekset asilana cara khusus sing kabeh bisa diterangake dening siji cithakan:

getType(numberColumns)

Nanging, yen kolom duwe jeneng, sampeyan uga bisa njaluk jeneng kolom:

getType(nameColumns)

Tuladha:

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

Ing ngisor iki aku bakal nyedhiyakake tabel sing bakal mbantu sampeyan nggandhengake jinis data SQL lan metode ResultSet:

Tipe data SQL getXXX() Metode
CHAR getString()
VARCHAR getString()
INT getInt()
NGAMUNG getDouble()
CLOB getClob()
BLOB getBlob()
TANGGAL getDate()
WAKTU getTime()
TIMESTAMP getTimestamp()

Intine, aku rumangsa ngerti.

Entuk data sing beda babagan ResultSet

Kita ngerti carane maca data saka baris saiki: kanthi nomer kolom lan jenenge. Ngomong-ngomong, kepiye carane ngerteni jeneng kolom kanthi nomer kasebut? Utawa nomer kolom ing asil?

Ing sisih siji, yen sampeyan nulis panjaluk, mula sampeyan kudu ngerti kabeh iki. Ing sisih liya, kita bisa nulis program sing nampilake asil pitakon ing layar: pitakon kasebut diterusake menyang kita lan mung pengin ditampilake ing layar (ing console, kaca web) kabeh sing bali server SQL. kanggo awake dhewe.

JDBC nduweni obyek khusus kanggo iki, antarmuka ResultSetMetaData . Njupuk obyek saka jinis iki cukup prasaja:

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

Antarmuka ResultSetMetaData nduweni sawetara cara sing menarik banget. Ing ngisor iki sing paling populer:

1 getColumnCount() Ngasilake nomer kolom asil
2 getColumnName(int kolom) Ngasilake jeneng kolom
3 getColumnLabel(int kolom) Ngasilake katrangan saka kolom
4 getColumnType() Ngasilake jinis kolom: nomer (kode khusus)
5 getColumnTypeName() Ngasilake jinis kolom: string
6 getColumnClassName() Ngasilake jeneng kelas java kanggo jinis kolom
7 getTableName() Ngasilake jeneng meja
8 getCatalogName() Ngasilake jeneng direktori kolom
9 getSkemaName() Ngasilake jeneng skema database
10 isAutoIncrement(int kolom) Apa kolom ndhukung AUTO INCREMENT?
sewelas isNullable() Apa kolom bisa ngemot NULL?

Ayo digunakake kanggo sinau babagan tabel kita:

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

Penting! Pay manungsa waé sing kolom sing nomer saka 1. Larik, dening cara, banget. Carane mboten umum iku, ta?

Lan iki minangka asil sing aku entuk sawise mbukak program:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
id java.lang.Integer INT 4
jeneng java.lang.string VARCHAR 12
tingkat java.lang.Integer INT 4
digawe_tanggal java.sql.date TANGGAL 91
Proses rampung kanthi kode metu 0