Mengelola lini saat ini

Kami menulis program pertama dan bekerja dengan sempurna. Kami menulis kueri, mengeksekusinya, dan sebagai hasilnya, metode executionQuery() mengembalikan sebuah objek kepada kamikumpulan hasilYang berisi semua hasil kueri. Dan sekarang kami akan mencoba mencari cara untuk mendapatkan hasil ini darinya.

Hasil kueri dapat berisi ribuan baris dan ratusan kolom dari berbagai jenis, jadi ini bukan tugas sepele seperti yang Anda bayangkan. Misalnya, gambar dapat disimpan dalam database, lalu Anda bisa mendapatkan gambar sebagai kumpulan byte atau InputStream untuk mengunduhnya.

Tapi kita akan mulai dengan yang paling sederhana - dengan konsep " garis hasil saat ini ". Karena hasilnya biasanya memiliki banyak baris, objekkumpulan hasilmemiliki penunjuk ke baris saat ini di dalamnya. Dan secara berurutan mengganti baris untuk membacanya menggunakan metode next() .

Pendekatan ini terutama dilakukan untuk optimasi. Driver JDBC mungkin tidak memuat string dari database sampai Anda membacanya secara berurutan. Anda juga membaca FileInputStream secara berurutan dari awal hingga akhir. Jadi pendekatan ini harus Anda kenal dan mengerti.

Namun, jika Anda benar-benar membutuhkannya, maka file dapat dibaca di mana saja menggunakan kelas RandomAccessFile .

Kelas ResultSet juga memungkinkan sesuatu yang serupa dan memungkinkan Anda memindahkan baris saat ini di sepanjang hasil di mana saja. Untuk melakukan ini, ia memiliki metode berikut:

metode Keterangan
1 Berikutnya() Beralih ke baris berikutnya
2 sebelumnya() Beralih ke baris sebelumnya
3 pertama() Baris saat ini dulu?
4 isBeforeFirst() Apakah kita di depan baris pertama?
5 terakhir() Apakah baris saat ini yang terakhir?
6 isAfterLast() Apakah kita setelah tenggat waktu?
7 absolut(int n) Membuat jalur ke-N saat ini
8 relatif(int n) Memindahkan posisi baris N saat ini ke depan. N bisa <0
9 getRow() Mengembalikan nomor baris

Metodenya cukup sederhana, tetapi dua penjelasan perlu dibuat. Hasilnya seolah-olah dibingkai dengan garis kosong di kedua sisi. Oleh karena itu, awalnya baris saat ini berada sebelum baris pertama dari hasil. Dan untuk mendapatkan baris pertama, Anda perlu memanggil metode next() setidaknya satu kali .

Jika Anda memanggil metode next() pada baris terakhir , maka Anda pindah ke baris setelah baris terakhir . Anda tidak dapat membaca data darinya, tetapi tidak akan terjadi kesalahan. Di sini metode isAfterLast() akan mendeklarasikan true 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 dari baris saat ini

Anda telah belajar untuk mengelola jalur saat ini dengan ahli. Sekarang mari kita cari tahu cara mendapatkan data darinya. Untuk ini, objekkumpulan hasilada metode khusus yang semuanya dapat dijelaskan oleh satu templat:

getType(numberColumns)

Namun, jika kolom memiliki nama, Anda juga bisa mendapatkan nama kolom:

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 ini saya akan memberikan tabel yang akan membantu Anda mengaitkan tipe data SQL dan metode ResultSet:

tipe data SQL metode getXXX()
ARANG getString()
VARCHAR getString()
INT getInt()
MENGAMBANG getDouble()
KLOB getClob()
GUMPAL getBlob()
TANGGAL getDate()
WAKTU getTime()
URUTAN WAKTU getTimestamp()

Intinya, saya pikir Anda mengerti.

Mendapatkan data berbeda tentang ResultSet

Kami menemukan cara membaca data dari baris saat ini: baik dengan nomor kolom maupun namanya. Omong-omong, bagaimana saya bisa mengetahui nama kolom dengan nomornya? Atau jumlah kolom dalam hasil?

Di satu sisi, jika Anda menulis permintaan, Anda sepertinya harus mengetahui semua ini. Di sisi lain, kita dapat menulis program yang menampilkan hasil kueri di layar: kueri diteruskan kepada kita dan kita hanya ingin menampilkan di layar (di konsol, halaman web) semua yang dikembalikan oleh server SQL untuk kita.

JDBC memiliki objek khusus untuk ini, antarmuka ResultSetMetaData . Mendapatkan objek jenis ini cukup sederhana:

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

Antarmuka ResultSetMetaData memiliki beberapa metode yang sangat menarik. Di bawah ini adalah yang paling populer:

1 dapatkanColumnCount() Mengembalikan jumlah kolom hasil
2 getColumnName(kolom int) Mengembalikan nama kolom
3 getColumnLabel(kolom int) Mengembalikan deskripsi kolom
4 getColumnType() Mengembalikan jenis kolom: angka (kode khusus)
5 getColumnTypeName() Mengembalikan tipe kolom: string
6 getColumnClassName() Mengembalikan nama kelas java untuk tipe kolom
7 getTableName() Mengembalikan nama tabel
8 getCatalogName() Mengembalikan nama direktori kolom
9 getSchemaName() Mengembalikan nama skema database
10 isAutoIncrement(kolom int) Apakah kolom mendukung PENINGKATAN OTOMATIS?
sebelas isNullable() Bisakah kolom berisi NULL?

Mari kita gunakan untuk mempelajari sedikit tentang 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! Perhatikan bahwa kolom diberi nomor dari 1. Ngomong-ngomong, baris juga. Betapa tidak biasa itu, bukan?

Dan inilah hasil yang saya dapatkan setelah menjalankan program:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
pengenal java.lang.Integer INT 4
nama java.lang.string VARCHAR 12
tingkat java.lang.Integer INT 4
tanggal_dibuat java.sql.tanggal TANGGAL 91
Proses selesai dengan kode keluar 0