2009-07-09 12 views
29

Ich habe eine Spalte in meiner Datenbank, die double eingegeben wird, und ich möchte den Wert von es mit einem JDBC ResultSet lesen, aber es kann null sein. Was ist der beste Weg, dies zu tun? Ich kann mir drei Möglichkeiten vorstellen, von denen keine sehr gut zu sein scheint.Wie lese ich in JDBC einen möglichen Nulldoppelwert von resultSet?

Option 1: Bad, weil Ausnahme 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 Handhabung: Bad, 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 welchem ​​Weg ist besser, oder gibt es einen anderen überlegenen Weg? Und bitte sagen Sie nicht "Use Hibernate", ich bin nur hier auf JDBC-Code beschränkt.

Antwort

43

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 war, wird der doppelte Wert als "schlecht" betrachtet. Daher sollten Sie jedes Mal, wenn Sie ein primitives Nullfeld in der Datenbank lesen, wasNull() überprüfen.

+9

omg. danke, obwohl –

+2

beachten Sie, dass es keine sqlexception beim Abrufen von Null-Primitiven aus einer Ergebnismenge gibt. In solchen Fällen wird der Standardwert für dieses Primitiv zurückgegeben (0 für int, 0.0 für double usw.). Daher ist .wasNull() ein notwendiges Übel. – Matt

+1

Ich hatte genau die gleiche Reaktion wie @JosefPfleger, als ich erkannte, wie Vanille JDBC in Bezug auf Nullen funktioniert. Wenn Sie jedoch weiterhin normales SQL verwenden (im Gegensatz zur Übernahme eines ORM) und dieses Debakel ganz vermeiden möchten, empfehle ich Spring ''JdbcTemplate'', das sich um all diese lästigen Null-Checks kümmert. –

11

Je nach JDBC-Treiber und Datenbank, können Sie in der Lage sein, einen Box-Typen zu verwenden und Guss:

Double doubleValueOrNull = (Double)rs.getObject(1); // or .getObject("columnName") 

Es null sein wird, wenn die Spalte NULL ist.

Achten Sie darauf, dass dies immer noch funktioniert, wenn Sie die Datenbank ändern.

+0

Dies funktioniert nicht für mich, wenn HSQLDB mit Oracle-Syntax für Tests abgefragt wird. – sravanreddy001

+0

Dies funktionierte gut für MySQL und schöner für die Augen als .wasNull() –

+0

auch nicht auf Oracle XE. – mdarwin

3

Verwendung:

rs.getObject(1)==null?null:rs.getBigDecimal(1).doubleValue() 
3

Oder mit Java 8 Sie können dies tun:

Double dVal = Optional.ofNullable(resultSet.getBigDecimal("col_name")) 
       .map(BigDecimal::doubleValue).orElse(null)); 
Verwandte Themen