Verarbeitung von Null-Werten
- In Datenbanken kann man bei der Spaltendefinition angeben, dass NULL-Werte erlaubt sind. Das bedeutet, dass in einem bestimmten Datensatz "kein Wert" für dieses Attribut gesetzt ist.
- Im Beispiel rechts heißt das, dass für die Stadt Iraklion der Längen- und Breitengrad unbekannt ist - das entsprechende Attribut enthält keinen Wert.
- Man muss
NULL
hierbei von0
oder einem leeren String unterscheiden.0
wären gültige Koordinaten, ein leerer String wäre immer noch ein String,NULL
heißt jedoch der Wert ist nicht eingetragen, es liegt keine Information vor.
Verarbeitung mit Java
Bei der Iteration über ein ResultSet werden die Attributwerte mit entsprechenden get
-Methoden in passenden Java Variablen gepeichert:
Statement statement = DBConnection.createStatement(); ResultSet result = statement.executeQuery("SELECT * FROM schueler"); while(result.next()) { Integer klasse = result.getInt("SKlasse"); // get-Methode für Integer String vorname = result.getString("SVorname"); // get-Methode für String }
Wenn eine Spalte der Datenbank einen NULL
-Wert enthält, liefert die get-Methode von Java dort den Default-Wert des Datentyps zurück. Für Integer-Werte ist das 0, für Strings null
(das "Java" null
).
Man kann bei Integer Variablen also nicht mehr unterscheiden, ob das Datenbankfeld tatsächlich den Wert 0 enthalten hat oder in der Datenbank keine Daten vorhanden waren, also ein NULL-Wert ausgelesen wurde, der dann zu einer 0 in der Java Variablen wurde.
Um NULL von 0 unterscheiden zu können, gibt es in der Klasse ResultSet
die Methode wasNull(): boolean
. Sie gibt an, ob der zuletzt gelesene Wert ein NULL-Wert war oder nicht:
Man könnte jetzt also so etwas tun, um das Problem zu umgehen, und den NULL_wert aus der Datenbank in die Java-Variable zu überführen:
[...] int wert = rs.getInt(3); // → 0, aber in der DB NULL! boolean wasnull = rs.wasNull(); // → true if(wasnull) { wert = null; } [...]
Allerdings klappt das bei den primitiven Datentypen wie wie int
, char
, double
u.ä. nicht, da diese keine Objekte sind und darum nicht null
sein können.
Aus diesem Grund muss man bei den primitiven Datentypen die entsprechenden Wrapper-Klassen verwenden - also Integer
, Character
, Double
und Co.
Eine korrekte Variante sieht also so aus:
[...] Integer wert = rs.getInt(3); // → 0, aber in der DB NULL! if(rs.wasNull()) { wert = null; } [...]
Warum ist das wichtig?
Wenn man die Werte die in einer Datenbank gespeichert sind ausgeben oder verändern möchte, ist es wichtig, zu unterscheiden, ob ein Information nicht vorhanden war oder obn der Wert 0 in der Datenbank gespeichert war. wenn man beispielsweise die Textfelder einer GUI mit werten aus eine Datenbank befüllen möchte, könnte das so aussehen:
ResultSet rs = stm.executeQuery("…"); rs.next(); Integer x = rs.getInt(1); if (rs.wasNull()) x = null; […] if (x == null) { textBox1.setText("Kein Wert in der DB vorhanden"); } else { textBox1.setText(x.toString()); }