2009-07-09 72 views
29

我在我的數據庫中有一列是鍵入double,我想使用JDBC ResultSet從中讀取值,但它可能爲空。這樣做的最好方法是什麼?我可以想到三個選項,其中沒有一個看起來很好。我如何在JDBC中讀取resultSet中可能爲空的double值?

選項1:糟糕,因爲異常處理冗長又臭

double d; 
try { 
    d = rs.getDouble(1); 
    // do something 
} catch(SQLException ex) { 
    if(rs.wasNull()) { 
     // do something else 
    } else { 
    throw ex; 
    } 
} 

選項2:不好,因爲兩次存取

s = rs.getString(1); // or getObject() 
if(s == null) { 
    // do something else 
} else { 
    double d = rs.getDouble(1); 
    // do something 
} 

方案3:不好,因爲Java的,而不是SQL轉換

s = rs.getString(1); // or getObject() 
if(s == null) { 
    // do something else 
} else { 
    double d = Double.parseDouble(s); 
    // do something 
} 

任何建議哪個方向更好,還是有另一種更好的方法?並且請不要說「使用Hibernate」,我只限於JDBC代碼。

回答

43

選項1是最接近:

double d = rs.getDouble(1); 
if (rs.wasNull()) { 
    // do something 
} else { 
    // use d 
} 

這是不是很漂亮,但是這是JDBC。如果該列爲空,則double值被認爲是「不好」,因此每次讀取數據庫中可空的原語時應使用wasNull()進行檢查。

+9

OMG。謝謝 – 2010-08-22 20:07:55

+2

注意,從結果集中檢索空基元時沒有sqlexception。在這種情況下返回該原語的默認值(0代表int,0.0代表double等)。因此,爲什麼.wasNull()是必要的罪惡。 – Matt 2012-08-31 12:42:08

11

根據您的JDBC驅動程序和數據庫,您可以使用盒裝型和投:

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

這將是null如果列是NULL

如果您更改數據庫,請仔細檢查此項仍然有效。

3

用途:

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

或者與Java 8,你可以這樣做:

Double dVal = Optional.ofNullable(resultSet.getBigDecimal("col_name")) 
       .map(BigDecimal::doubleValue).orElse(null)); 
相關問題