Adattípusok

Vessünk egy pillantást a táblázatra:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
id java.lang.Integer INT 4
név java.lang.string VARCHAR 12
szint java.lang.Integer INT 4
Létrehozás dátuma java.sql.date DÁTUM 91
A folyamat a 0 kilépési kóddal fejeződött be

A harmadik oszlopban típusokat látunk: INT , VARCHAR , DATE . Ezek SQL szervertípusok. A szerver azokkal a típusokkal adja az adatokat, amelyekről tud. Hogyan konvertálhatók ezek a típusok Java típusokká?

Pontosan ez az egyik olyan dolog, amelyet a JDBC szabványosított. A JDBC megalkotói az SQL típusok listájának javításával kezdték. Van egy speciális osztály konstansokkal:

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

A szám nem egy sorozatszám az osztályban, hanem egy azonosító típus az SQL specifikáció SQL típusainak listájában. Ezeket a számokat láttad az előadás elején a példában.

A ResultSet osztályban is vannak olyan módszerek, amelyek az egyik adattípust egy másikra konvertálják. Nem minden típus konvertálható egymásba, de a logika elég egyértelmű. Íme egy jó táblázat az Ön számára:

Módszer SQL adattípus
int getInt() SZÁM, EGÉSZ, Tizedes
float getFloat() SZÁM, EGÉSZ, Tizedes, lebegő, VALÓS
double getDoublel() SZÁM, EGÉSZ, Tizedes, lebegő, VALÓS
Dátum getDate() DATE, TIME, TIMESTAMP
Time getTime() DATE, TIME, TIMESTAMP
Időbélyeg getTimestamp() DATE, TIME, TIMESTAMP
String getString() CHAR, VARCHAR

Az összes SQL-típus között néhány csoport egyértelműen megkülönböztethető:

  • számok
  • idő
  • vonalak
  • bájt objektumok

Egyébként észrevetted a getInt() metódust ?

JDBC és NULL

Észrevetted, hogy mi a baj a ResultSet osztály getInt() metódusával ? Nézzük még egyszer az aláírását:

int getInt(column)

Ez a metódus int értéket ad vissza , nem egész számot. Mert a JDBC típusú Integer létrehozásakor még nem létezett. Oké, mondjuk. Akkor lenne egy kérdésem:

Van egy táblám egy adatbázisban, amelyben van egy INT NULL oszlop, amely lehet INT, de lehet NULL is. Hogyan kaphatom meg a null értéket ebből az oszlopból?

Ne aggódj, mindent átgondoltak helyetted.

Egyes megoldás . Ha a Java SQL-típusát egy referenciatípus, például a dátum vagy a karakterlánc képviseli, akkor nincs probléma . Az ilyen típusú változók null értéket vehetnek fel.

Második megoldás . A primitív típusok nem lehetnek nullak, így az olyan metódusok, mint a getInt() egyszerűen egy alapértelmezett értéket adnak vissza . Az intnél 0, a floatnál = 0.0f, a doublenál = 0.0d és hasonlók.

És hogyan lehet megérteni, hogy mi volt az oszlopban: 0 vagy NULL? A pártnak pedig van válasza erre a kérdésre.

Harmadik megoldás . A ResultSet osztálynak van egy speciális wasNull() metódusa , amely igazat ad vissza, ha a metódus éppen más értéket adott vissza a NULL helyett .

Minden pontosan úgy működik, ahogy itt leírtam. Példa:

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

Ha a getInt() metódus hívásakor null értékkel tér vissza , akkor a wasNull() metódus igazat adna vissza, ellenkező esetben a wasNull() metódus hamis értéket adna vissza.

Ez nem csak a primitív típusoknál működik:

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

Ez természetesen egy mankó. De nincs probléma a NullPointerExceptionnel . Láss mindenben a pozitívumot :)

Mi a baj az adattípusokkal a JDBC-ben?

Folytassuk a tesztet. Nézze meg alaposan a getDate(oszlop) metódust ? Mi a gond vele? Ez a módszer a következő típusú eredményekkel rendelkezik:

java.sql.Date

A nullát képes tárolni, ami elég jó. De mégis valami nincs rendben vele. Nyom! Így néz ki a helyes dátumtípus:

java.util.Date

Különböző csomagjaik vannak! Ezek általában különböző típusú adatok. És itt az ok...

Az adatbázisok a 20. század 70-es évei óta 3 típusú adatot támogatnak az idő tárolására:

  • DÁTUM – tárolja a dátumot: év, hónap, nap.
  • IDŐ – tárolja az időt: órák, percek, másodpercek.
  • TIMESTAMP – egy adott időpontot tárol: dátum, idő és ezredmásodperc.

A Java nyelvnek fennállásának első 10 évében egyetlen adattípusa volt, a java.util.Date , amely UNIX TIME formátumban tárolt egy időpontot: ez az 1970 eleje óta eltelt ezredmásodpercek száma.

Ezért a JDBC szabvány megalkotói három további adattípust adtak a Java-hoz - kifejezetten a JDBC számára:

  • java.sql.date
  • java.sql.Time
  • java.sqlTimestamp

Így a ResultSet interfész metódusai rögzített adattípusokat tartalmaznak:

SQL TÍPUS Java típus Módszer
DÁTUM java.sql.date java.sql.date getDate()
IDŐ java.sql.Time java.sql.Time getTime()
IDŐBÉLYEG java.sql.timestamp java.sql.Timestamp getTimestamp()

És ez az itt látható típus:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
id java.lang.Integer INT 4
név java.lang.string VARCHAR 12
szint java.lang.Integer INT 4
Létrehozás dátuma java.sql.date DÁTUM 91
A folyamat a 0 kilépési kóddal fejeződött be

Képzeld, mi hiányzik innen? A Java DateTime API-ban megjelent adattípusok:

  • LocalDate
  • Helyi idő
  • LocalDateTime