Tipuri de date

Să aruncăm o privire la tabel:

„C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
id java.lang.Integer INT 4
Nume java.lang.string VARCHAR 12
nivel java.lang.Integer INT 4
data creata java.sql.date DATA 91
Procesul s-a încheiat cu codul de ieșire 0

În a treia coloană vedem tipuri: INT , VARCHAR , DATE . Acestea sunt tipuri de server SQL. Serverul înseamnă că oferă datele cu acele tipuri despre care știe. Cum sunt convertite aceste tipuri în tipuri Java?

Acesta este exact unul dintre lucrurile care au fost standardizate cu JDBC. Creatorii JDBC au început prin a stabili o listă de tipuri SQL. Există o clasă specială cu constante:

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

Numărul nu este un număr de serie în clasă, ci un tip de ID în lista de tipuri SQL din specificația SQL. Acestea sunt numerele pe care le-ați văzut în exemplul de la începutul prelegerii.

De asemenea, în clasa ResultSet există metode care pot converti un tip de date în altul. Nu toate tipurile pot fi convertite unele în altele, dar logica este suficient de clară. Iată o foaie de calcul bună pentru tine:

Metodă tip de date SQL
int getInt() NUMERICE, INTEGER, DECIMAL
float getFloat() NUMERICE, INTEGER, DECIMAL, FLOTANT, REAL
double getDoublel() NUMERICE, INTEGER, DECIMAL, FLOTANT, REAL
Data getDate() DATA, ORA, TIMESTAMP
Time getTime() DATA, ORA, TIMESTAMP
Timestamp getTimestamp() DATA, ORA, TIMESTAMP
String getString() CHAR, VARCHAR

Dintre toate tipurile SQL, unele grupuri pot fi distinse clar:

  • numere
  • timp
  • linii
  • obiecte octet

Apropo, ați observat metoda getInt() ?

JDBC și NULL

Ați observat ce este în neregulă cu metoda getInt() a clasei ResultSet ? Să ne uităm din nou la semnătura sa:

int getInt(column)

Această metodă returnează un int , nu un Integer. Deoarece la momentul în care a fost creat tipul JDBC Integer, acesta nu exista încă. Bine, să zicem. Atunci am o intrebare:

Am un tabel într-o bază de date care are o coloană INT NULL care poate fi INT, dar poate fi și NULL. Cum pot obține valoarea nulă din această coloană?

Nu-ți face griji, totul a fost gândit pentru tine.

Soluția unu . Dacă tipul SQL în Java este reprezentat de un tip de referință, cum ar fi Date sau String, atunci nu există nicio problemă . Variabilele de acest tip pot lua valori nule.

Soluția a doua . Tipurile primitive nu pot fi nule, așa că metode precum getInt() vor returna pur și simplu o valoare implicită . Pentru int este 0, pentru float = 0.0f, pentru double = 0.0d și altele asemenea.

Și atunci cum să înțelegem ce era în coloană: 0 sau NULL? Și partidul are un răspuns la această întrebare.

Soluția trei . Clasa ResultSet are o metodă specială wasNull() care returnează true dacă metoda tocmai a returnat o valoare diferită în loc de NULL .

Totul funcționează exact așa cum am scris aici. Exemplu:

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

Dacă ar fi trebuit să returneze null la apelarea metodei getInt() , atunci metoda wasNull() ar returna true, în caz contrar metoda wasNull() ar returna false.

Acest lucru funcționează nu numai pentru tipurile primitive:

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

Aceasta este desigur o cârjă. Dar nicio problemă cu NullPointerException . Vezi aspectele pozitive din toate :)

Ce este în neregulă cu tipurile de date în JDBC?

Să continuăm cu testul. Priviți cu atenție metoda getDate(coloană) ? Ce-i în neregulă cu el? Această metodă are următorul tip de rezultat:

java.sql.Date

Poate stoca null, ceea ce este suficient de bun. Dar totuși, ceva este în neregulă cu el. Cheie! Iată cum arată tipul corect de dată:

java.util.Date

Au pachete diferite! Acestea sunt în general diferite tipuri de date. Și iată motivul...

Bazele de date din anii 70 ai secolului XX acceptă 3 tipuri de date pentru stocarea timpului:

  • DATA - stochează data: an, lună, zi.
  • TIME - stochează timpul: ore, minute, secunde.
  • TIMESTAMP - stochează un anumit punct de timp: data, ora și milisecunde.

Limbajul Java pentru primii 10 ani de existență a avut un singur tip de date, java.util.Date , care a stocat un punct de timp în format UNIX TIME: numărul de milisecunde de la începutul anului 1970.

Prin urmare, creatorii standardului JDBC au adăugat încă trei tipuri de date la Java - în special pentru JDBC:

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

Și astfel, metodele interfeței ResultSet conțin tipuri de date fixe:

TIP SQL Tipul Java Metodă
DATA java.sql.date java.sql.date getDate()
TIMP java.sql.Time java.sql.Time getTime()
TIMESTAMP-UL java.sql.timestamp java.sql.Timestamp getTimestamp()

Și acesta este tipul pe care îl vedeți aici:

„C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
id java.lang.Integer INT 4
Nume java.lang.string VARCHAR 12
nivel java.lang.Integer INT 4
data creata java.sql.date DATA 91
Procesul s-a încheiat cu codul de ieșire 0

Ghici ce lipsește aici? Tipuri de date care au apărut în API-ul Java DateTime:

  • LocalDate
  • Ora locala
  • LocalDateTime