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