Menguruskan talian semasa

Kami menulis program pertama dan ia berfungsi dengan sempurna. Kami menulis pertanyaan, melaksanakannya, dan sebagai hasilnya, kaedah executeQuery() mengembalikan objek kepada kamiset keputusanSatu yang mengandungi semua hasil pertanyaan. Dan sekarang kami akan cuba memikirkan bagaimana untuk mendapatkan hasil ini daripadanya.

Hasil pertanyaan boleh mengandungi beribu-ribu baris dan beratus-ratus lajur pelbagai jenis, jadi ini bukanlah tugas yang remeh seperti yang anda fikirkan. Sebagai contoh, gambar boleh disimpan dalam pangkalan data, kemudian anda boleh mendapatkan gambar sebagai satu set bait atau InputStream untuk memuat turunnya.

Tetapi kita akan mulakan dengan yang paling mudah - dengan konsep " garis hasil semasa ". Oleh kerana hasilnya biasanya mempunyai banyak baris, objekset keputusanmempunyai penunjuk ke garisan semasa di dalamnya. Dan secara berurutan menukar baris untuk membacanya menggunakan kaedah next() .

Pendekatan ini dilakukan terutamanya untuk pengoptimuman. Pemacu JDBC mungkin tidak memuatkan rentetan daripada pangkalan data sehingga anda dapat membacanya secara berurutan. Anda juga membaca FileInputStream secara berurutan dari awal hingga akhir. Jadi pendekatan ini harus biasa dan mudah difahami oleh anda.

Walau bagaimanapun, jika anda benar-benar memerlukannya, maka fail boleh dibaca di mana-mana sahaja menggunakan kelas RandomAccessFile .

Kelas ResultSet juga membenarkan sesuatu yang serupa dan membolehkan anda mengalihkan baris semasa sepanjang hasil di mana-mana sahaja. Untuk melakukan ini, ia mempunyai kaedah berikut:

Kaedah Penerangan
1 seterusnya() Beralih ke baris seterusnya
2 sebelumnya() Beralih ke baris sebelumnya
3 isFirst() Baris semasa dahulu?
4 isBeforeFirst() Adakah kita di hadapan barisan pertama?
5 isLast() Adakah talian semasa yang terakhir?
6 isAfterLast() Adakah kita selepas tarikh akhir?
7 mutlak(int n) Menjadikan garisan ke-N semasa
8 relatif(int n) Menggerakkan kedudukan baris semasa N ke hadapan. N boleh menjadi <0
9 getRow() Mengembalikan nombor baris

Kaedahnya agak mudah, tetapi dua penjelasan perlu dibuat. Hasilnya, seolah-olah, dibingkai oleh garis kosong di kedua-dua belah pihak. Oleh itu, pada mulanya baris semasa adalah sebelum baris pertama hasil. Dan untuk mendapatkan baris pertama, anda perlu memanggil kaedah next() sekurang-kurangnya sekali .

Jika anda memanggil kaedah next() pada baris terakhir , maka anda berpindah ke baris selepas yang terakhir . Anda tidak boleh membaca data daripadanya, tetapi tiada ralat akan berlaku. Di sini kaedah isAfterLast() akan mengisytiharkan benar sebagai hasilnya.

Contoh:

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

Mendapatkan data daripada baris semasa

Anda telah belajar untuk mengurus talian semasa dengan mahir. Sekarang mari kita fikirkan cara mendapatkan data daripadanya. Untuk ini, objekset keputusanterdapat kaedah khas yang semuanya boleh diterangkan oleh satu templat:

getType(numberColumns)

Walau bagaimanapun, jika lajur mempunyai nama, maka anda juga boleh mendapatkan nama lajur:

getType(nameColumns)

Contoh:

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

Di bawah saya akan menyediakan jadual yang akan membantu anda mengaitkan jenis data SQL dan kaedah ResultSet:

Jenis data SQL kaedah getXXX().
CHAR getString()
VARCHAR getString()
INT getInt()
TERApung getDouble()
CLOB getClob()
BLOB getBlob()
TARIKH getDate()
MASA getTime()
STAMP MASA getTimestamp()

Intinya, saya rasa anda faham.

Mendapatkan data yang berbeza tentang ResultSet

Kami mengetahui cara membaca data dari baris semasa: kedua-duanya mengikut nombor lajur dan dengan namanya. By the way, bagaimana saya boleh mengetahui nama lajur dengan nombornya? Atau bilangan lajur dalam hasilnya?

Di satu pihak, jika anda menulis permintaan, maka anda nampaknya perlu mengetahui semua ini. Sebaliknya, kami boleh menulis program yang memaparkan hasil pertanyaan pada skrin: pertanyaan dihantar kepada kami dan kami hanya mahu memaparkan pada skrin (dalam konsol, halaman web) semua yang pelayan SQL kembalikan kepada kita.

JDBC mempunyai objek khas untuk ini, antara muka ResultSetMetaData . Mendapatkan objek jenis ini agak mudah:

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

Antara muka ResultSetMetaData mempunyai beberapa kaedah yang sangat menarik. Di bawah adalah yang paling popular:

1 getColumnCount() Mengembalikan bilangan lajur hasil
2 getColumnName(int column) Mengembalikan nama lajur
3 getColumnLabel(int column) Mengembalikan perihalan lajur
4 getColumnType() Mengembalikan jenis lajur: nombor (kod khas)
5 getColumnTypeName() Mengembalikan jenis lajur: rentetan
6 getColumnClassName() Mengembalikan nama kelas java untuk jenis lajur
7 getTableName() Mengembalikan nama jadual
8 getCatalogName() Mengembalikan nama direktori lajur
9 getSchemaName() Mengembalikan nama skema pangkalan data
10 isAutoIncrement(int column) Adakah lajur menyokong AUTO INCREMENT?
sebelas isNullable() Bolehkah lajur mengandungi NULL?

Mari gunakannya untuk mengetahui sedikit tentang jadual kami:

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! Beri perhatian bahawa lajur bernombor daripada 1. Baris juga. Sungguh luar biasa, bukan?

Dan ini adalah hasil yang saya dapat selepas menjalankan program:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
ID java.lang.Integer INT 4
nama java.lang.string VARCHAR 12
tahap java.lang.Integer INT 4
tarikh_dicipta java.sql.date TARIKH 91
Proses selesai dengan kod keluar 0