Datatyper

La oss ta en titt på tabellen:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
id java.lang.Integer INT 4
Navn java.lang.string VARCHAR 12
nivå java.lang.Integer INT 4
opprettet dato java.sql.date DATO 91
Prosessen avsluttet med utgangskode 0

I den tredje kolonnen ser vi typer: INT , VARCHAR , DATE . Dette er SQL-servertyper. Serveren betyr å gi dataene med de typene han vet om. Hvordan konverteres disse typene til Java-typer?

Dette er akkurat en av tingene som har blitt standardisert med JDBC. Skaperne av JDBC startet med å fikse en liste over SQL-typer. Det er en spesiell klasse 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;}

Nummeret er ikke et serienummer i klassen, men en ID-type i listen over SQL-typer i SQL-spesifikasjonen. Dette er tallene du så i eksempelet i begynnelsen av forelesningen.

Også i ResultSet-klassen er det metoder som kan konvertere en datatype til en annen. Ikke alle typer kan konverteres til hverandre, men logikken er klar nok. Her er et godt regneark for deg:

Metode SQL-datatype
int getInt() NUMERISK, HELTAL, DESIMAL
float getFloat() NUMERISK, HELTAL, DESIMAL, FLYT, REAL
dobbel getDoublel() NUMERISK, HELTAL, DESIMAL, FLYT, REAL
Dato getDate() DATO, TID, TIDSSTIMP
Tid getTime() DATO, TID, TIDSSTIMP
Tidsstempel getTimestamp() DATO, TID, TIDSSTIMP
String getString() CHAR, VARCHAR

Blant alle SQL-typer kan noen grupper tydelig skilles:

  • tall
  • tid
  • linjer
  • byte-objekter

Har du forresten lagt merke til getInt() -metoden ?

JDBC og NULL

Har du lagt merke til hva som er galt med getInt()- metoden til ResultSet- klassen ? La oss se på signaturen igjen:

int getInt(column)

Denne metoden returnerer en int , ikke et heltall. For på det tidspunktet JDBC-typen Integer ble opprettet, eksisterte den ikke ennå. Ok, la oss si. Da har jeg et spørsmål:

Jeg har en tabell i en database som har en INT NULL-kolonne som kan være INT, men som også kan være NULL. Hvordan kan jeg få nullverdien fra denne kolonnen?

Ikke bekymre deg, alt er tenkt på for deg.

Løsning en . Hvis SQL-typen i Java er representert av en referansetype som Dato eller String, er det ikke noe problem . Variabler av denne typen kan ha nullverdier.

Løsning to . Primitive typer kan ikke være null, så metoder som getInt() vil ganske enkelt returnere en standardverdi . For int er det 0, for float = 0,0f, for dobbel = 0,0d og lignende.

Og hvordan forstå da hva som sto i kolonnen: 0 eller NULL? Og partiet har svar på dette spørsmålet.

Løsning tre . ResultSet-klassen har en spesiell wasNull() -metode som returnerer true hvis metoden nettopp returnerte en annen verdi i stedet for NULL .

Alt fungerer akkurat som jeg skrev her. Eksempel:

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

Hvis den skulle returnere null når du kaller getInt()- metoden, ville wasNull()- metoden returnert true, ellers ville wasNull()- metoden returnert false.

Dette fungerer ikke bare for primitive 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);
    }

Dette er selvfølgelig en krykke. Men ikke noe problem med NullPointerException . Se det positive i alt :)

Hva er galt med datatyper i JDBC?

La oss fortsette med testen. Se nøye på getDate(column) -metoden ? Hva er galt med ham? Denne metoden har følgende type resultat:

java.sql.Date

Den kan lagre null, noe som er bra nok. Men likevel er det noe galt med ham. Clue! Slik ser den riktige datotypen ut:

java.util.Date

De har forskjellige pakker! Dette er generelt forskjellige typer data. Og her er grunnen...

Databaser siden 70-tallet av det 20. århundre støtter 3 typer data for lagring av tid:

  • DATO - lagrer datoen: år, måned, dag.
  • TID - lagrer tid: timer, minutter, sekunder.
  • TIMESTAMP - lagrer et bestemt tidspunkt: dato, klokkeslett og millisekunder.

Java-språket de første 10 årene av dets eksistens hadde bare én datatype, java.util.Date , som lagret et tidspunkt i UNIX TIME-format: antall millisekunder siden begynnelsen av 1970.

Derfor la skaperne av JDBC-standarden ytterligere tre datatyper til Java - spesielt for JDBC:

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

Og så inneholder metodene til ResultSet- grensesnittet faste datatyper:

SQL TYPE Java Type Metode
DATO java.sql.date java.sql.date getDate()
TID java.sql.Time java.sql.Time getTime()
TIDSSTIMPEL java.sql.tidsstempel java.sql.Timestamp getTimestamp()

Og dette er typen du ser her:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
id java.lang.Integer INT 4
Navn java.lang.string VARCHAR 12
nivå java.lang.Integer INT 4
opprettet dato java.sql.date DATO 91
Prosessen avsluttet med utgangskode 0

Gjett hva som mangler her? Datatyper som har dukket opp i Java DateTime API:

  • LocalDate
  • Lokal tid
  • LocalDateTime