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