CodeGym /Java kursus /All lectures for DA purposes /Datatypeforhandling i JDBC

Datatypeforhandling i JDBC

All lectures for DA purposes
Niveau , Lektie
Ledig

Datatyper

Lad os tage et kig 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
niveau java.lang.Integer INT 4
oprettet_dato java.sql.date DATO 91
Processen afsluttet med udgangskode 0

I den tredje kolonne ser vi typer: INT , VARCHAR , DATE . Disse er SQL-servertyper. Servermidlet giver dataene med de typer, som han kender til. Hvordan konverteres disse typer til Java-typer?

Det er netop en af ​​de ting, der er blevet standardiseret med JDBC. Skaberne af JDBC startede med at rette en liste over SQL-typer. Der er en speciel 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-specifikationen. Det er de tal, du så i eksemplet i begyndelsen af ​​forelæsningen.

Også i ResultSet-klassen er der metoder, der kan konvertere en datatype til en anden. Ikke alle typer kan konverteres til hinanden, men logikken er klar nok. Her er et godt regneark til dig:

Metode SQL datatype
int getInt() NUMERISK, HELTAL, DECIMAL
float getFloat() NUMERISK, HELTAL, DECIMAL, FLØD, REAL
double getDoublel() NUMERISK, HELTAL, DECIMAL, FLØD, REAL
Dato getDate() DATO, TID, TIDSSTIMPEL
Tid getTime() DATO, TID, TIDSSTIMPEL
Tidsstempel getTimestamp() DATO, TID, TIDSSTIMPEL
String getString() CHAR, VARCHAR

Blandt alle SQL-typer kan nogle grupper tydeligt skelnes:

  • tal
  • tid
  • linjer
  • byte objekter

Har du forresten lagt mærke til getInt() metoden ?

JDBC og NULL

Har du lagt mærke til, hvad der er galt med getInt() -metoden i klassen ResultSet ? Lad os se på dens signatur igen:

int getInt(column)

Denne metode returnerer en int , ikke et heltal. For på det tidspunkt, hvor JDBC-typen Integer blev oprettet, eksisterede den ikke endnu. Okay, lad os sige. Så har jeg et spørgsmål:

Jeg har en tabel i en database, der har en INT NULL kolonne, der kan være INT, men også kan være NULL. Hvordan får jeg null-værdien fra denne kolonne?

Bare rolig, alt er tænkt på for dig.

Løsning et . Hvis SQL-typen i Java er repræsenteret af en referencetype såsom Dato eller String, er der ikke noget problem . Variabler af denne type kan have null-værdier.

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

Og hvordan skal man så forstå, hvad der stod i kolonnen: 0 eller NULL? Og det spørgsmål har partiet svar på.

Løsning tre . ResultSet-klassen har en speciel wasNull()- metode , der returnerer sand, hvis metoden netop returnerede en anden værdi i stedet for NULL .

Alt fungerer præcis 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 det skulle returnere null, når metoden getInt() blev kaldt, ville wasNull()- metoden returnere true, ellers ville wasNull() -metoden returnere falsk.

Dette virker ikke kun 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 intet problem med NullPointerException . Se det positive i alt :)

Hvad er der galt med datatyper i JDBC?

Lad os fortsætte med testen. Se nøje på getDate(column) -metoden ? Hvad der er galt med ham? Denne metode har følgende type resultat:

java.sql.Date

Den kan lagre null, hvilket er godt nok. Men alligevel er der noget galt med ham. Nøgle! Sådan ser den korrekte datotype ud:

java.util.Date

De har forskellige pakker! Disse er generelt forskellige typer data. Og her er grunden...

Databaser siden 70'erne af det 20. århundrede understøtter 3 typer data til lagring af tid:

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

Java-sproget i de første 10 år af dets eksistens havde kun én datatype, java.util.Date , som lagrede et tidspunkt i UNIX TIME-format: antallet af millisekunder siden begyndelsen af ​​1970.

Derfor tilføjede skaberne af JDBC-standarden yderligere tre datatyper til Java - specifikt til JDBC:

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

Og så indeholder metoderne til ResultSet- grænsefladen faste datatyper:

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

Og det er den type 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
niveau java.lang.Integer INT 4
oprettet_dato java.sql.date DATO 91
Processen afsluttet med udgangskode 0

Gæt hvad der mangler her? Datatyper, der er dukket op i Java DateTime API:

  • LocalDate
  • Lokal tid
  • LocalDateTime
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION