Veri tipleri

Tabloya bir göz atalım:

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

Üçüncü sütunda türleri görüyoruz: INT , VARCHAR , DATE . Bunlar SQL sunucu türleridir. Sunucu, bildiği türlerle verileri verir. Bu türler Java türlerine nasıl dönüştürülür?

Bu tam olarak JDBC ile standardize edilen şeylerden biridir. JDBC'nin yaratıcıları işe SQL türlerinin bir listesini düzelterek başladılar. Sabitleri olan özel bir sınıf var:

class java.sql.Types {
   public static final int CHAR         =   1;
   public static final int NUMERIC    	=   2;
   public static final int DECIMAL     	=   3;
   public static final int INTEGER      =   4;
   public static final int FLOAT        =   6;
   public static final int REAL         =   7;}

Sayı, sınıftaki bir seri numarası değil, SQL belirtimindeki SQL türleri listesindeki bir kimlik türüdür. Bunlar dersin başında örnekte gördüğünüz sayılardır.

Ayrıca ResultSet sınıfında bir veri türünü diğerine dönüştürebilen yöntemler vardır. Tüm türler birbirine dönüştürülemez, ancak mantık yeterince açıktır. İşte size iyi bir e-tablo:

Yöntem SQL veri türü
int getInt() SAYISAL, TAM SAYI, ONDALIK
getFloat() SAYISAL, TAM SAYI, ONDALIK, FLOAT, GERÇEK
çift ​​getDoublel() SAYISAL, TAM SAYI, ONDALIK, FLOAT, GERÇEK
Tarih getDate() TARİH, ZAMAN, ZAMAN BİLGİSİ
Zaman getTime() TARİH, ZAMAN, ZAMAN BİLGİSİ
Zaman Damgası getTimestamp() TARİH, ZAMAN, ZAMAN BİLGİSİ
Dize getString() ÇAR, VARÇAR

Tüm SQL türleri arasında bazı gruplar açıkça ayırt edilebilir:

  • sayılar
  • zaman
  • çizgiler
  • bayt nesneleri

Bu arada, getInt() yöntemini fark ettiniz mi ?

JDBC ve BOŞ

ResultSet sınıfının getInt() yönteminde neyin yanlış olduğunu fark ettiniz mi ? İmzasına tekrar bakalım:

int getInt(column)

Bu yöntem , bir Tamsayı değil, bir int döndürür . Çünkü JDBC türü Tamsayı oluşturulduğunda henüz mevcut değildi. Tamam diyelim. O zaman bir sorum var:

INT olabilen ancak NULL da olabilen bir INT NULL sütununa sahip bir veritabanında bir tablom var. Bu sütundan boş değeri nasıl alabilirim?

Merak etmeyin her şey sizin için düşünüldü.

Çözüm bir . Java'daki SQL türü, Date veya String gibi bir başvuru türüyle temsil ediliyorsa, o zaman sorun yoktur . Bu tip değişkenler boş değerler alabilir.

Çözüm iki . İlkel türler boş olamaz, bu nedenle getInt() gibi yöntemler varsayılan bir değer döndürür . int için 0, float = 0.0f için, double = 0.0d için ve benzeri.

Ve o zaman sütunda ne olduğunu nasıl anlayabilirim: 0 veya NULL? Ve partinin bu soruya bir cevabı var.

Çözüm üç . ResultSet sınıfı, yöntem NULL yerine farklı bir değer döndürdüyse true değerini döndüren özel bir wasNull() yöntemine sahiptir .

Her şey tam olarak burada yazdığım gibi çalışıyor. Örnek:

ResultSet results = staatement.executeQuery("SELECT * FROM user");
    int level = results.getInt("level");

if (results.wasNull()) {
    System.out.println("Level is null");
} else {
   System.out.println("Level is " + level);
    }

getInt() yöntemi çağrılırken null döndürmesi gerekiyorsa , wasNull() yöntemi true döndürür, aksi takdirde wasNull() yöntemi false döndürür.

Bu yalnızca ilkel türler için işe yaramaz:

ResultSet results = staatement.executeQuery("SELECT * FROM user");
    String name = results.getString("name");

 	if (results.wasNull()) {
 	    System.out.println("Name is null");
 	} else {
 	   System.out.println("User name is " + name);
    }

Bu tabii ki bir koltuk değneği. Ancak NullPointerException ile sorun yok . Her şeyde bir hayır gör :)

JDBC'deki veri türlerinin nesi yanlış?

Teste devam edelim. getDate(column) yöntemine yakından bakın ? O'nun nesi var? Bu yöntem aşağıdaki türde sonuçlara sahiptir:

java.sql.Date

Yeterince iyi olan boş değeri saklayabilir. Ama yine de, onunla ilgili bir sorun var. İpucu! Doğru Tarih türü şöyle görünür:

java.util.Date

Farklı paketleri var! Bunlar genellikle farklı veri türleridir. Ve işte nedeni...

20. yüzyılın 70'lerinden beri veritabanları, depolama süresi için 3 tür veriyi destekler:

  • TARİH - tarihi saklar: yıl, ay, gün.
  • TIME - zamanı saklar: saat, dakika, saniye.
  • TIMESTAMP - zamanda belirli bir noktayı saklar: tarih, saat ve milisaniye.

Varlığının ilk 10 yılında Java dili, UNIX TIME biçiminde bir zaman noktasını depolayan java.util.Date adlı tek bir veri türüne sahipti: 1970'in başından bu yana geçen milisaniye sayısı.

Bu nedenle, JDBC standardının yaratıcıları Java'ya üç veri türü daha ekledi - özellikle JDBC için:

  • java.sql.tarihi
  • java.sql.Zaman
  • Java.sqlZaman Damgası

Ve ResultSet arabiriminin yöntemleri sabit veri türleri içerir:

SQL TÜRÜ Java Tipi Yöntem
TARİH java.sql.tarihi java.sql.date getDate()
ZAMAN java.sql.Zaman java.sql.Time getTime()
ZAMAN BİLGİSİ java.sql.timestamp java.sql.Timestamp getTimestamp()

Ve burada gördüğünüz tip 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ı

Bilin bakalım burada ne eksik? Java DateTime API'sinde görünen veri türleri:

  • Yerel Tarih
  • Yerel zaman
  • LocalDateTime