2009-07-09 8 views
29

Veritabanımda double yazılan bir sütunu var ve bir JDBC ResultSet kullanarak değeri okumak istiyorum, ancak boş olabilir. Bunu yapmanın en iyi yolu nedir? Hiçbiri pek iyi görünmeyen üç seçenek düşünebilirim.JDBC'de resultSet'den null bir çift değer okuyabilir miyim?

Seçenek 1: Kötü istisna ayrıntılı ve kötü kokulu

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

Seçenek 2 taşıma çünkü: Kötü çünkü iki getirmelere

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

Seçenek 3: Kötü Java yerine SQL dönüşüm nedeniyle

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

Hangi yolla daha iyi bir öneride bulunulur, yoksa başka bir üstünlük var mı? Ve lütfen "Hazırda Beklet" seçeneğini söyleme, sadece burada JDBC koduyla sınırlıyım.

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

Çok hoş bir şey değil, ama bu JDBC var:

cevap

43

Seçenek 1 en yakın zamandır. Sütun boşsa, çift değer "kötü" olarak kabul edilir, bu nedenle veritabanında geçersiz olan bir ilkel okuduğunuz her zaman wasNull() kullanarak kontrol etmelisiniz.

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

O null olacak sütun NULL olsaydı:

+9

OMG. –

+2

olmasına rağmen, sonuç kümesindeki boş ilkelleri alırken hiçbir sqlexception bulunmadığını unutmayın. Bu ilkel için varsayılan değer bu gibi durumlarda iade edilir (int için 0, çift için 0,0, vb ....). Bu yüzden neden. WasNull() gerekli bir kötülüktür. – Matt

+1

Vanilya JDBC'nin null değerleriyle nasıl çalıştığını farkettiğimde, bir kez daha @JosefPfleger ile aynı tepkiyi verdim. Eğer düz SQL kullanmaya devam etmek istiyorsanız (bir ORM'yi benimsemenin aksine) ve bu debacle'ı tamamen ortadan kaldırmak istiyorsanız, Spring'in JdbcTemplate'ünü kullanmanızı tavsiye ederim, ki bu sizin için tüm bu sinir bozucu çekleri halleder. –

11

JDBC sürücü ve veritabanı bağlı olarak, bir kutulu türünü ve döküm kullanmak mümkün olabilir.

Veritabanını değiştirirseniz, bunun hala çalıştığını kontrol etmeyi unutmayın.

+0

Testler için oracle sözdizimi ile HSQLDB sorgulanırken bu benim için çalışmıyor. – sravanreddy001

+0

Bu, MySQL için benim için gayet iyi çalıştı ve gözlerden daha güzel .wasNull() –

+0

da Oracle XE'de çalışmıyor. – mdarwin

3

Kullanım:

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

Ya java 8 ile bunu yapabilirsiniz:

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