Tipi di dati

Diamo un'occhiata alla tabella:

"C:\Programmi\Java\jdk-17.0.3.1\bin\java.exe...
id java.lang.Intero INT 4
nome java.lang.stringa VARCHAR 12
livello java.lang.Intero INT 4
Data di Creazione java.sql.data DATA 91
Processo terminato con codice di uscita 0

Nella terza colonna vediamo i tipi: INT , VARCHAR , DATE . Questi sono tipi di server SQL. Il server significa che fornisce i dati con quei tipi di cui è a conoscenza. Come vengono convertiti questi tipi in tipi Java?

Questa è esattamente una delle cose che è stata standardizzata con JDBC. I creatori di JDBC hanno iniziato fissando un elenco di tipi SQL. C'è una classe speciale con costanti:

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

Il numero non è un numero di serie nella classe, ma un tipo di ID nell'elenco dei tipi SQL nella specifica SQL. Questi sono i numeri che hai visto nell'esempio all'inizio della lezione.

Anche nella classe ResultSet sono presenti metodi che possono convertire un tipo di dati in un altro. Non tutti i tipi possono essere convertiti l'uno nell'altro, ma la logica è abbastanza chiara. Ecco un buon foglio di calcolo per te:

Metodo Tipo di dati SQL
int getInt() NUMERICO, INTERO, DECIMALE
float getFloat() NUMERICO, INTERO, DECIMALE, FLOAT, REALE
double getDoublel() NUMERICO, INTERO, DECIMALE, FLOAT, REALE
Data getDate() DATA, ORA, TIMESTAMP
Tempo getTime() DATA, ORA, TIMESTAMP
Timestamp getTimestamp() DATA, ORA, TIMESTAMP
String getString() CHAR, VARCHAR

Tra tutti i tipi SQL, alcuni gruppi possono essere chiaramente distinti:

  • numeri
  • tempo
  • linee
  • oggetti byte

A proposito, hai notato il metodo getInt() ?

JDBC e NULL

Hai notato cosa c'è che non va nel metodo getInt() della classe ResultSet ? Diamo un'occhiata di nuovo alla sua firma:

int getInt(column)

Questo metodo restituisce un int , non un Integer. Perché al momento della creazione del tipo JDBC Integer, non esisteva ancora. Ok, diciamo. Allora ho una domanda:

Ho una tabella in un database che ha una colonna INT NULL che può essere INT ma può anche essere NULL. Come posso ottenere il valore nullo da questa colonna?

Non preoccuparti, tutto è stato pensato per te.

Soluzione uno . Se il tipo SQL in Java è rappresentato da un tipo di riferimento come Date o String, allora non ci sono problemi . Le variabili di questo tipo possono assumere valori nulli.

Soluzione due . I tipi primitivi non possono essere nulli, quindi metodi come getInt() restituiranno semplicemente un valore predefinito . Per int è 0, per float = 0.0f, per double = 0.0d e simili.

E allora come capire cosa c'era nella colonna: 0 o NULL? E il partito ha una risposta a questa domanda.

Soluzione tre . La classe ResultSet ha uno speciale metodo wasNull() che restituisce true se il metodo ha appena restituito un valore diverso invece di NULL .

Tutto funziona esattamente come ho scritto qui. Esempio:

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

Se doveva restituire null quando si chiama il metodo getInt() , allora il metodo wasNull() restituirebbe true, altrimenti il ​​metodo wasNull() restituirebbe false.

Questo funziona non solo per i tipi primitivi:

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

Questa è ovviamente una stampella. Ma nessun problema con NullPointerException . Vedi i lati positivi in ​​ogni cosa :)

Cosa c'è di sbagliato nei tipi di dati in JDBC?

Continuiamo con la prova. Guarda da vicino il metodo getDate(column) ? Cosa c'è che non va in lui? Questo metodo ha il seguente tipo di risultato:

java.sql.Date

Può memorizzare null, il che è abbastanza buono. Tuttavia, qualcosa non va in lui. Traccia! Ecco come appare il tipo di data corretto:

java.util.Date

Hanno pacchetti diversi! Questi sono generalmente diversi tipi di dati. Ed ecco il motivo...

I database dagli anni '70 del XX secolo supportano 3 tipi di dati per l'archiviazione del tempo:

  • DATE - memorizza la data: anno, mese, giorno.
  • TIME - memorizza il tempo: ore, minuti, secondi.
  • TIMESTAMP - memorizza un punto specifico nel tempo: data, ora e millisecondi.

Il linguaggio Java per i primi 10 anni della sua esistenza aveva un solo tipo di dati, java.util.Date , che memorizzava un punto nel tempo nel formato UNIX TIME: il numero di millisecondi dall'inizio del 1970.

Pertanto, i creatori dello standard JDBC hanno aggiunto altri tre tipi di dati a Java, in particolare per JDBC:

  • java.sql.data
  • java.sql.Time
  • java.sqlTimestamp

E così i metodi dell'interfaccia ResultSet contengono tipi di dati fissi:

TIPO SQL Tipo Java Metodo
DATA java.sql.data java.sql.date getDate()
TEMPO java.sql.Time java.sql.Time getTime()
TIMESTAMP java.sql.timestamp java.sql.Timestamp getTimestamp()

E questo è il tipo che vedi qui:

"C:\Programmi\Java\jdk-17.0.3.1\bin\java.exe...
id java.lang.Intero INT 4
nome java.lang.stringa VARCHAR 12
livello java.lang.Intero INT 4
Data di Creazione java.sql.data DATA 91
Processo terminato con codice di uscita 0

Indovina cosa manca qui? Tipi di dati che sono apparsi nell'API Java DateTime:

  • Data locale
  • Ora locale
  • LocalDateTime