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ı |