2009-07-09 11 views
29

Tôi có một cột trong cơ sở dữ liệu của mình được nhập double và tôi muốn đọc giá trị từ nó bằng cách sử dụng một JDBC ResultSet, nhưng nó có thể là null. Cách nào là tốt nhất để thực hiện việc này? Tôi có thể nghĩ đến ba lựa chọn mà không có lựa chọn nào trong số đó có vẻ rất tốt.Làm thế nào để tôi trong JDBC đọc một giá trị có thể null gấp đôi từ resultSet?

Lựa chọn 1: Xấu vì xử lý ngoại lệ tiết và mùi

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

Phương án 2: Xấu vì hai fetches

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

Lựa chọn 3: Bad vì Java chứ không phải là SQL chuyển đổi

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

Bất kỳ đề xuất nào về cách nào tốt hơn, hoặc có cách nào vượt trội hơn không? Và xin vui lòng không nói "Sử dụng Hibernate", tôi bị giới hạn mã JDBC chỉ ở đây.

Trả lời

43

Lựa chọn 1 là gần nhất:

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

Đó là không phải là rất tốt đẹp, nhưng đó là JDBC. Nếu cột là null, giá trị kép được coi là "xấu", vì vậy bạn nên kiểm tra bằng cách sử dụng wasNull() mỗi khi bạn đọc một nguyên thủy không có giá trị trong cơ sở dữ liệu.

+9

omg. cảm ơn mặc dù –

+2

lưu ý rằng không có sqlexception khi lấy null nguyên thủy từ một tập kết quả. giá trị mặc định cho nguyên thủy đó được trả về trong các trường hợp như vậy (0 cho int, 0.0 cho double, etc ....). Do đó tại sao .wasNull() là một điều ác cần thiết. – Matt

+1

Tôi đã có phản ứng giống hệt như @JosefPfleger khi tôi nhận ra cách JDBC vani hoạt động liên quan đến null. Nếu bạn muốn tiếp tục sử dụng SQL thuần túy, mặc dù (trái ngược với việc áp dụng ORM) và tránh sự thất bại này, tôi khuyên bạn nên sử dụng 'JdbcTemplate' của Spring, nó sẽ kiểm tra tất cả các kiểm tra rỗng cho bạn. –

11

Tùy thuộc vào trình điều khiển JDBC của bạn và cơ sở dữ liệu, bạn có thể sử dụng một loại đóng hộp và dàn diễn viên:

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

Sẽ null nếu cột là NULL.

Hãy cẩn thận để kiểm tra điều này vẫn hoạt động nếu bạn thay đổi cơ sở dữ liệu.

+0

Điều này không hoạt động đối với tôi khi truy vấn HSQLDB với cú pháp oracle cho các bài kiểm tra. – sravanreddy001

+0

Điều này làm việc tốt cho tôi cho MySQL, và đẹp hơn trên mắt hơn .wasNull() –

+0

cũng không làm việc trên Oracle XE. – mdarwin

3

Sử dụng:

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

Hoặc với java 8 bạn có thể làm điều này:

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