Wie kann ich in JDBC las einen möglicherweise null doppelten Wert von resultSet?
Frage
Ich habe eine Spalte in meiner Datenbank, die double
eingegeben wird, und ich mag den Wert aus es mit einem JDBC ResultSet lesen, aber es kann null sein. Was ist der beste Weg, dies zu tun? Ich kann mich drei Optionen von denen keine scheint sehr gut.
Option 1: Bad, weil die Ausnahmebehandlung ausführlich und stinkende
double d;
try {
d = rs.getDouble(1);
// do something
} catch(SQLException ex) {
if(rs.wasNull()) {
// do something else
} else {
throw ex;
}
}
Option 2: Schlecht, weil zwei Abholungen
s = rs.getString(1); // or getObject()
if(s == null) {
// do something else
} else {
double d = rs.getDouble(1);
// do something
}
Option 3: Bad, weil Java anstatt SQL Umwandlung
s = rs.getString(1); // or getObject()
if(s == null) {
// do something else
} else {
double d = Double.parseDouble(s);
// do something
}
Irgendwelche Vorschläge auf dem Weg ist besser, oder gibt es eine andere Art und Weise überlegen? Und bitte sagen Sie nicht „Use Hibernate“, ich JDBC-Code beschränkt bin nur hier.
Lösung
Option 1 am nächsten ist:
double d = rs.getDouble(1);
if (rs.wasNull()) {
// do something
} else {
// use d
}
Es ist nicht sehr schön, aber das ist JDBC. Wenn die Spalte null ist, wird der doppelte Wert „schlecht“ betrachtet, so sollten Sie wasNull()
jedes Mal überprüfen, indem Sie lesen ein primitiv, dass NULL festlegbare in der Datenbank ist.
Andere Tipps
Je nach JDBC-Treiber und Datenbank, können Sie in der Lage sein, einen Box-Typen und Guss zu verwenden:
Double doubleValueOrNull = (Double)rs.getObject(1); // or .getObject("columnName")
Es wird null
werden, wenn die Spalte NULL
wurde.
Achten Sie darauf, dies noch zu überprüfen funktioniert, wenn Sie Datenbank ändern.
Verwendung:
rs.getObject(1)==null?null:rs.getBigDecimal(1).doubleValue()
oder mit Java 8 Sie können dies tun:
Double dVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
.map(BigDecimal::doubleValue).orElse(null));
Kotlin Version ein Nullable-Feld abrufen
val parentId = resultSet.getObject("parent_id") as Double?