Geçerli satırı yönetme

İlk programı yazdık ve mükemmel çalıştı. Bir sorgu yazdık, çalıştırdık ve sonuç olarak, executeQuery() yöntemi bize bir nesne döndürdü.sonuç kümesiSorgunun tüm sonuçlarını içeren bir. Ve şimdi bu sonuçları ondan nasıl alacağımızı bulmaya çalışacağız.

Sorgu sonucu, çeşitli türlerde binlerce satır ve yüzlerce sütun içerebilir, bu nedenle bu, düşündüğünüz kadar önemsiz bir görev değildir. Örneğin, resimler veritabanında saklanabilir, ardından indirmek için bir bayt seti veya bir InputStream olarak bir resim alabilirsiniz .

Ancak en basitinden - " mevcut sonuç çizgisi " kavramıyla başlayacağız . Sonuç genellikle çok sayıda satır içerdiğinden, nesnesonuç kümesiiçindeki geçerli satıra bir işaretçi vardır. Ve next() yöntemini kullanarak okumak için sıralı olarak satırları değiştirir .

Bu yaklaşım öncelikle optimizasyon için yapılır. JDBC Sürücüsü, dizileri sırayla okuyana kadar veri tabanından dizeleri yüklemeyebilir. Siz de FileInputStream'i baştan sona sırayla okuyun. Bu nedenle, bu yaklaşım size tanıdık ve anlaşılır olmalıdır.

Ancak, gerçekten ihtiyacınız varsa, RandomAccessFile sınıfı kullanılarak dosyalar herhangi bir yerde okunabilir .

ResultSet sınıfı da benzer bir şeye izin verir ve geçerli satırı sonuç boyunca herhangi bir yere taşımanıza izin verir. Bunu yapmak için aşağıdaki yöntemlere sahiptir:

Yöntem Tanım
1 Sonraki() Sonraki satıra geç
2 öncesi() Önceki satıra geç
3 isFirst() Önce mevcut hat?
4 isBeforeFirst() İlk sıranın önünde miyiz?
5 isLast() Mevcut satır sonuncusu mu?
6 isAfterLast() Son teslim tarihini geçtik mi?
7 mutlak(int n) N'inci satırı güncel hale getirir
8 göreli(int n) Geçerli satırı N konumu ileri taşır. N <0 olabilir
9 getRow() Satır numarasını döndürür

Yöntemler oldukça basit, ancak iki açıklama yapılması gerekiyor. Sonuçlar, olduğu gibi, her iki tarafta da boş çizgilerle çerçevelenmiştir. Bu nedenle, başlangıçta geçerli satır, sonucun ilk satırından önce gelir. İlk satırı elde etmek için next() yöntemini en az bir kez çağırmanız gerekir .

next () yöntemini son satırda çağırdıysanız , son satırdan sonraki satıra geçmişsinizdir . Ondan veri okuyamazsınız, ancak herhangi bir hata oluşmayacaktır. Burada isAfterLast() yöntemi, sonuç olarak doğru beyan edecektir.

Örnek:

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

Geçerli satırdan veri alma

Mevcut hattı ustalıkla yönetmeyi öğrendiniz. Şimdi ondan nasıl veri alacağımızı bulalım. Bunun için nesnesonuç kümesitümü tek bir şablonla açıklanabilecek özel yöntemler vardır:

getType(numberColumns)

Ancak, sütunun bir adı varsa, sütun adına göre de alabilirsiniz:

getType(nameColumns)

Örnek:

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

Aşağıda, SQL veri türleri ile ResultSet yöntemlerini ilişkilendirmenize yardımcı olacak bir tablo sağlayacağım:

SQL veri türü getXXX() Yöntemleri
ÇAR getString()
VARCHAR getString()
INT getInt()
BATMADAN YÜZMEK getDouble()
CLOB getClob()
BLOB getBlob()
TARİH getDate()
ZAMAN getTime()
ZAMAN BİLGİSİ getTimestamp()

Konu, sanırım anladınız.

ResultSet hakkında farklı veriler elde etme

Geçerli satırdaki verileri nasıl okuyacağımızı bulduk: hem sütun numarasına hem de adına göre. Bu arada, sütun adını numarasına göre nasıl öğrenebilirim? Veya sonuçtaki sütun sayısı?

Bir yandan, bir istek yazarsanız, tüm bunları bilmeniz gerekiyor gibi görünüyor. Öte yandan, bir sorgunun sonucunu ekranda görüntüleyen bir program yazabiliriz: sorgu bize iletilir ve SQL sunucusunun döndürdüğü her şeyi ekranda (konsolda, web sayfasında) görüntülemek isteriz. bize.

JDBC'nin bunun için özel bir nesnesi vardır, ResultSetMetaData arabirimi . Bu türden bir nesne elde etmek oldukça basittir:

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

ResultSetMetaData arabiriminin bazı çok ilginç yöntemleri vardır. Aşağıda en popüler olanlar:

1 getColumnCount() Sonuç sütunlarının sayısını döndürür
2 getColumnName(int sütunu) Sütun adını döndürür
3 getColumnLabel(int sütunu) Sütunun açıklamasını döndürür
4 getColumnType() Sütun türünü döndürür: sayı (özel kod)
5 getColumnTypeName() Sütun türünü döndürür: dize
6 getColumnClassName() Sütun türü için java sınıf adını döndürür
7 getTableName() Tablo adını döndürür
8 getCatalogName() Sütunun dizin adını döndürür
9 getSchemaName() Veritabanının şema adını döndürür
10 isAutoIncrement(int sütunu) Sütun OTOMATİK ARTIŞ'ı destekliyor mu?
on bir Nullable() Bir sütun NULL içerebilir mi?

Tablomuz hakkında biraz bilgi edinmek için kullanalım:

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

Önemli! Bu arada sütunların da 1. satırdan başlayarak numaralandırıldığına dikkat edin. Bu ne kadar sıra dışı, değil mi?

Ve programı çalıştırdıktan sonra aldığım sonuç bu:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
İD java.lang.Tamsayı INT 4
isim java.lang.dize VARCHAR 12
seviye java.lang.Tamsayı INT 4
yaratılan_tarih java.sql.tarihi TARİH 91
İşlem, çıkış kodu 0 ile tamamlandı