Datatyper
Låt oss ta en titt på tabellen:
"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe... | |||
id | java.lang.Integer | INT | 4 |
namn | java.lang.string | VARCHAR | 12 |
nivå | java.lang.Integer | INT | 4 |
Skapat Datum | java.sql.date | DATUM | 91 |
Processen avslutad med utgångskod 0 |
I den tredje kolumnen ser vi typerna: INT , VARCHAR , DATE . Dessa är SQL-servertyper. Servern ger data med de typer som han känner till. Hur konverteras dessa typer till Java-typer?
Detta är precis en av de saker som har standardiserats med JDBC. Skaparna av JDBC började med att fixa en lista med SQL-typer. Det finns en specialklass med konstanter:
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;
…
}
Numret är inte ett serienummer i klassen, utan en ID-typ i listan över SQL-typer i SQL-specifikationen. Det här är siffrorna du såg i exemplet i början av föreläsningen.
Även i klassen ResultSet finns det metoder som kan konvertera en datatyp till en annan. Alla typer kan inte konverteras till varandra, men logiken är tillräckligt tydlig. Här är ett bra kalkylblad för dig:
Metod | SQL-datatyp |
---|---|
int getInt() | NUMERISKT, HELTAL, DECIMAL |
float getFloat() | NUMERISKT, HELTAL, DECIMAL, FLYTANDE, REAL |
double getDoublel() | NUMERISKT, HELTAL, DECIMAL, FLYTANDE, REAL |
Datum getDate() | DATUM, TID, TIDSTÄMPEL |
Time getTime() | DATUM, TID, TIDSTÄMPEL |
Tidsstämpel getTimestamp() | DATUM, TID, TIDSTÄMPEL |
String getString() | CHAR, VARCHAR |
Bland alla SQL-typer kan vissa grupper tydligt urskiljas:
- tal
- tid
- rader
- byte-objekt
Förresten, har du lagt märke till metoden getInt() ?
JDBC och NULL
Har du märkt vad som är fel med metoden getInt() i klassen ResultSet ? Låt oss titta på dess signatur igen:
int getInt(column)
Denna metod returnerar ett int , inte ett heltal. För vid den tidpunkt då JDBC-typen Integer skapades fanns det inte ännu. Okej, låt oss säga. Sen har jag en fråga:
Jag har en tabell i en databas som har en INT NULL kolumn som kan vara INT men kan också vara NULL. Hur kan jag få nollvärdet från den här kolumnen?
Oroa dig inte, allt har tänkts på för dig.
Lösning ett . Om SQL-typen i Java representeras av en referenstyp som datum eller sträng, är det inga problem . Variabler av denna typ kan ha nollvärden.
Lösning två . Primitiva typer kan inte vara null, så metoder som getInt() returnerar helt enkelt ett standardvärde . För int är det 0, för float = 0,0f, för dubbel = 0,0d och liknande.
Och hur ska man då förstå vad som stod i kolumnen: 0 eller NULL? Och partiet har ett svar på denna fråga.
Lösning tre . Klassen ResultSet har en speciell wasNull() -metod som returnerar true om metoden bara returnerade ett annat värde istället för NULL .
Allt fungerar precis som jag skrev här. Exempel:
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);
}
Om det var tänkt att returnera null när metoden getInt() anropades , skulle metoden wasNull() returnera true, annars skulle metoden wasNull() returnera false.
Detta fungerar inte bara för primitiva typer:
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);
}
Detta är naturligtvis en krycka. Men inga problem med NullPointerException . Se det positiva i allt :)
Vad är det för fel på datatyper i JDBC?
Låt oss fortsätta med testet. Titta noga på metoden getDate(column) ? Vad är fel med honom? Denna metod har följande typ av resultat:
java.sql.Date
Den kan lagra null, vilket är bra nog. Men ändå är det något fel på honom. Ledtråd! Så här ser den korrekta datumtypen ut:
java.util.Date
De har olika paket! Dessa är i allmänhet olika typer av data. Och här är anledningen...
Databaser sedan 70-talet av 1900-talet stöder tre typer av data för lagring av tid:
- DATUM - lagrar datum: år, månad, dag.
- TID - lagrar tid: timmar, minuter, sekunder.
- TIMESTAMP - lagrar en specifik tidpunkt: datum, tid och millisekunder.
Java-språket under de första 10 åren av dess existens hade bara en datatyp, java.util.Date , som lagrade en tidpunkt i UNIX TIME-format: antalet millisekunder sedan början av 1970.
Därför har skaparna av JDBC-standarden lagt till ytterligare tre datatyper till Java - specifikt för JDBC:
- java.sql.date
- java.sql.Time
- java.sqlTimestamp
Och så innehåller metoderna för ResultSet- gränssnittet fasta datatyper:
SQL TYP | Java typ | Metod |
---|---|---|
DATUM | java.sql.date | java.sql.date getDate() |
TID | java.sql.Time | java.sql.Time getTime() |
TIDSSTÄMPEL | java.sql.timestamp | java.sql.Timestamp getTimestamp() |
Och det här är typen du ser här:
"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe... | |||
id | java.lang.Integer | INT | 4 |
namn | java.lang.string | VARCHAR | 12 |
nivå | java.lang.Integer | INT | 4 |
Skapat Datum | java.sql.date | DATUM | 91 |
Processen avslutad med utgångskod 0 |
Gissa vad som saknas här? Datatyper som har dykt upp i Java DateTime API:
- LocalDate
- Lokal tid
- LocalDateTime
GO TO FULL VERSION