Types de données

Jetons un œil au tableau :

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
identifiant java.lang.Integer INT 4
nom java.lang.string VARCHAR 12
niveau java.lang.Integer INT 4
date_de_création java.sql.date DATE 91
Processus terminé avec le code de sortie 0

Dans la troisième colonne, nous voyons les types : INT , VARCHAR , DATE . Ce sont des types de serveur SQL. Le moyen serveur fournit les données avec les types dont il a connaissance. Comment ces types sont-ils convertis en types Java ?

C'est exactement l'une des choses qui a été standardisée avec JDBC. Les créateurs de JDBC ont commencé par fixer une liste de types SQL. Il existe une classe spéciale avec des constantes :

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

Le numéro n'est pas un numéro de série dans la classe, mais un type d'ID dans la liste des types SQL de la spécification SQL. Ce sont les chiffres que vous avez vus dans l'exemple au début de la conférence.

Dans la classe ResultSet, il existe également des méthodes qui peuvent convertir un type de données en un autre. Tous les types ne peuvent pas être convertis les uns aux autres, mais la logique est suffisamment claire. Voici une bonne feuille de calcul pour vous :

Méthode Type de données SQL
int getInt() NUMÉRIQUE, ENTIER, DÉCIMAL
flotteur getFloat() NUMERIQUE, ENTIER, DECIMAL, FLOAT, REAL
double getDoublel() NUMERIQUE, ENTIER, DECIMAL, FLOAT, REAL
Date getDate() DATE, HEURE, HORODATAGE
Heure obtenirHeure() DATE, HEURE, HORODATAGE
Horodatage getTimestamp() DATE, HEURE, HORODATAGE
Chaîne getString() CHAR, VARCHAR

Parmi tous les types SQL, certains groupes peuvent être clairement distingués :

  • Nombres
  • temps
  • lignes
  • objets octets

Au fait, avez-vous remarqué la méthode getInt() ?

JDBC et NULL

Avez-vous remarqué ce qui ne va pas avec la méthode getInt() de la classe ResultSet ? Reprenons sa signature :

int getInt(column)

Cette méthode renvoie un int , pas un Integer. Parce qu'au moment où le type JDBC Integer a été créé, il n'existait pas encore. Bon, disons. Ensuite j'ai une question :

J'ai une table dans une base de données qui a une colonne INT NULL qui peut être INT mais peut aussi être NULL. Comment puis-je obtenir la valeur nulle de cette colonne ?

Ne vous inquiétez pas, tout a été pensé pour vous.

Solution un . Si le type SQL en Java est représenté par un type de référence tel que Date ou String, alors il n'y a pas de problème . Les variables de ce type peuvent prendre des valeurs nulles.

Solution deux . Les types primitifs ne peuvent pas être nuls, donc les méthodes comme getInt() renverront simplement une valeur par défaut . Pour int c'est 0, pour float = 0.0f, pour double = 0.0d et ainsi de suite.

Et comment alors comprendre ce qu'il y avait dans la colonne : 0 ou NULL ? Et le parti a une réponse à cette question.

Solution trois . La classe ResultSet a une méthode spéciale wasNull() qui renvoie true si la méthode vient de renvoyer une valeur différente au lieu de NULL .

Tout fonctionne exactement comme je l'ai écrit ici. Exemple:

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

S'il était censé renvoyer null lors de l'appel de la méthode getInt() , la méthode wasNull() renverrait true, sinon la méthode wasNull() renverrait false.

Cela fonctionne non seulement pour les types primitifs :

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

Il s'agit bien sûr d'une béquille. Mais pas de problème avec NullPointerException . Voir les points positifs dans tout :)

Quel est le problème avec les types de données dans JDBC ?

Continuons le test. Regardez attentivement la méthode getDate(column) ? Quel est le problème avec lui? Cette méthode a le type de résultat suivant :

java.sql.Date

Il peut stocker null, ce qui est suffisant. Mais encore, quelque chose ne va pas avec lui. Indice! Voici à quoi ressemble le type de date correct :

java.util.Date

Ils ont des forfaits différents! Il s'agit généralement de différents types de données. Et voici la raison...

Les bases de données depuis les années 70 du 20ème siècle supportent 3 types de données pour stocker le temps :

  • DATE - stocke la date : année, mois, jour.
  • TIME - stocke le temps : heures, minutes, secondes.
  • TIMESTAMP - stocke un point précis dans le temps : date, heure et millisecondes.

Le langage Java pendant les 10 premières années de son existence n'avait qu'un seul type de données, java.util.Date , qui stockait un point dans le temps au format UNIX TIME : le nombre de millisecondes depuis le début de 1970.

Par conséquent, les créateurs de la norme JDBC ont ajouté trois types de données supplémentaires à Java - spécifiquement pour JDBC :

  • java.sql.date
  • java.sql.Heure
  • java.sqlTimestamp

Ainsi, les méthodes de l' interface ResultSet contiennent des types de données fixes :

TYPE SQL TypeJava Méthode
DATE java.sql.date java.sql.date getDate()
TEMPS java.sql.Heure java.sql.Time getTime()
HORODATAGE java.sql.horodatage java.sql.Timestamp getTimestamp()

Et c'est le type que vous voyez ici:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
identifiant java.lang.Integer INT 4
nom java.lang.string VARCHAR 12
niveau java.lang.Integer INT 4
date_de_création java.sql.date DATE 91
Processus terminé avec le code de sortie 0

Devinez ce qui manque ici? Types de données apparus dans l'API Java DateTime :

  • DateLocale
  • Heure locale
  • DateHeureLocale