Datentypen

Werfen wir einen Blick auf die Tabelle:

„C:\Programme\Java\jdk-17.0.3.1\bin\java.exe...“
Ausweis java.lang.Integer INT 4
Name java.lang.string VARCHAR 12
eben java.lang.Integer INT 4
erstelltes_Datum java.sql.date DATUM 91
Prozess mit Exit-Code 0 beendet

In der dritten Spalte sehen wir Typen: INT , VARCHAR , DATE . Dies sind SQL-Servertypen. Der Server gibt die Daten mit den ihm bekannten Typen weiter. Wie werden diese Typen in Java-Typen konvertiert?

Genau das ist eines der Dinge, die mit JDBC standardisiert wurden. Die Entwickler von JDBC begannen mit der Korrektur einer Liste von SQL-Typen. Es gibt eine spezielle Klasse mit Konstanten:

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

Die Nummer ist keine fortlaufende Nummer in der Klasse, sondern ein ID-Typ in der Liste der SQL-Typen in der SQL-Spezifikation. Dies sind die Zahlen, die Sie im Beispiel zu Beginn der Vorlesung gesehen haben.

Auch in der ResultSet-Klasse gibt es Methoden, die einen Datentyp in einen anderen konvertieren können. Nicht alle Typen können ineinander umgewandelt werden, aber die Logik ist klar genug. Hier ist eine gute Tabelle für Sie:

Methode SQL-Datentyp
int getInt() NUMERISCH, INTEGER, DEZIMAL
float getFloat() NUMERISCH, INTEGER, DEZIMAL, FLOAT, REAL
double getDoubl() NUMERISCH, INTEGER, DEZIMAL, FLOAT, REAL
Datum getDate() DATUM, ZEIT, ZEITSTEMPEL
Zeit getTime() DATUM, ZEIT, ZEITSTEMPEL
Zeitstempel getTimestamp() DATUM, ZEIT, ZEITSTEMPEL
String getString() CHAR, VARCHAR

Unter allen SQL-Typen lassen sich einige Gruppen klar unterscheiden:

  • Zahlen
  • Zeit
  • Linien
  • Byte-Objekte

Ist Ihnen übrigens die Methode getInt() aufgefallen ?

JDBC und NULL

Ist Ihnen aufgefallen, was mit der getInt() -Methode der ResultSet- Klasse nicht stimmt ? Schauen wir uns noch einmal die Signatur an:

int getInt(column)

Diese Methode gibt einen int zurück , keinen Integer. Denn zum Zeitpunkt der Erstellung des JDBC-Typs Integer existierte dieser noch nicht. Okay, sagen wir mal. Dann habe ich eine Frage:

Ich habe eine Tabelle in einer Datenbank mit einer INT NULL-Spalte, die INT, aber auch NULL sein kann. Wie kann ich den Nullwert aus dieser Spalte erhalten?

Machen Sie sich keine Sorgen, es wurde an alles für Sie gedacht.

Lösung eins . Wenn der SQL-Typ in Java durch einen Referenztyp wie Date oder String dargestellt wird, gibt es kein Problem . Variablen dieses Typs können Nullwerte annehmen.

Lösung zwei . Primitive Typen können nicht null sein, daher geben Methoden wie getInt() einfach einen Standardwert zurück . Für int ist es 0, für float = 0.0f, für double = 0.0d und dergleichen.

Und wie kann man dann verstehen, was in der Spalte stand: 0 oder NULL? Und auf diese Frage hat die Partei eine Antwort.

Lösung drei . Die ResultSet-Klasse verfügt über eine spezielle wasNull()- Methode , die true zurückgibt, wenn die Methode gerade einen anderen Wert anstelle von NULL zurückgegeben hat .

Alles funktioniert genau so, wie ich es hier geschrieben habe. Beispiel:

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

Wenn beim Aufruf der Methode getInt() Null zurückgegeben werden sollte , würde die Methode wasNull() true zurückgeben, andernfalls würde die Methode wasNull() false zurückgeben.

Dies funktioniert nicht nur für primitive Typen:

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

Das ist natürlich eine Krücke. Aber kein Problem mit NullPointerException . Sehen Sie in allem das Positive :)

Was stimmt mit den Datentypen in JDBC nicht?

Fahren wir mit dem Test fort. Schauen Sie sich die Methode getDate(column) genau an ? Was stimmt nicht mit ihm? Diese Methode hat die folgende Art von Ergebnis:

java.sql.Date

Es kann null speichern, was gut genug ist. Aber trotzdem stimmt etwas mit ihm nicht. Hinweis! So sieht der richtige Datumstyp aus:

java.util.Date

Sie haben verschiedene Pakete! Dabei handelt es sich im Allgemeinen um unterschiedliche Arten von Daten. Und hier ist der Grund...

Datenbanken unterstützen seit den 70er Jahren des 20. Jahrhunderts drei Arten von Daten zur Zeitspeicherung:

  • DATUM – speichert das Datum: Jahr, Monat, Tag.
  • ZEIT – speichert die Zeit: Stunden, Minuten, Sekunden.
  • TIMESTAMP – speichert einen bestimmten Zeitpunkt: Datum, Uhrzeit und Millisekunden.

Die Java-Sprache hatte in den ersten 10 Jahren ihres Bestehens nur einen Datentyp, java.util.Date , der einen Zeitpunkt im UNIX-TIME-Format speicherte: die Anzahl der Millisekunden seit Anfang 1970.

Daher haben die Ersteller des JDBC-Standards drei weitere Datentypen zu Java hinzugefügt – speziell für JDBC:

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

Und so enthalten die Methoden der ResultSet- Schnittstelle feste Datentypen:

SQL-TYP Java-Typ Methode
DATUM java.sql.date java.sql.date getDate()
ZEIT java.sql.Time java.sql.Time getTime()
ZEITSTEMPEL java.sql.timestamp java.sql.Timestamp getTimestamp()

Und das ist der Typ, den Sie hier sehen:

„C:\Programme\Java\jdk-17.0.3.1\bin\java.exe...“
Ausweis java.lang.Integer INT 4
Name java.lang.string VARCHAR 12
eben java.lang.Integer INT 4
erstelltes_Datum java.sql.date DATUM 91
Prozess mit Exit-Code 0 beendet

Ratet mal, was hier fehlt? Datentypen, die in der Java DateTime API erschienen sind:

  • Lokales Datum
  • Ortszeit
  • LocalDateTime