2010-05-05 30 views
5

Khi sử dụng JDBC và truy cập vào các kiểu dữ liệu thông qua một tập hợp kết quả, là có một cách thanh lịch hơn để đối phó với null/0 so với sau:Khi truy cập ResultSets trong JDBC, có cách nào thanh lịch để phân biệt giữa giá trị null và giá trị 0 không?

int myInt = rs.getInt(columnNumber) 
if(rs.wasNull())? 
{ 
// Treat as null 
} else 
{ 
// Treat as 0 
} 

Cá nhân tôi co rúm người lại bất cứ khi nào tôi nhìn thấy loại mã này. Tôi không thấy tại sao ResultSet không được định nghĩa để trả về các kiểu số nguyên được đóng hộp (ngoại trừ, có lẽ, hiệu năng) hoặc ít nhất là cung cấp cả hai. Điểm thưởng nếu bất kỳ ai cũng có thể thuyết phục tôi rằng thiết kế API hiện tại thật tuyệt vời :)

Giải pháp cá nhân của tôi là viết một trình bao trả về số nguyên (Tôi quan tâm nhiều hơn đến mã khách hàng hơn hiệu suất), nhưng tôi tự hỏi nếu tôi thiếu một cách tốt hơn để làm điều này.

Chỉ cần làm rõ, những gì làm phiền tôi về mã này không phải là chiều dài, mà thực tế là nó tạo ra sự phụ thuộc của nhà nước giữa các cuộc gọi tiếp theo và những gì xuất hiện như một getter đơn giản thực sự có tác dụng phụ trong cùng một hàng.

+1

Rõ ràng những người chịu trách nhiệm thay thế a> b bằng a.compare (b)> 0 không thể tưởng tượng ra một thế giới mà bạn không muốn sử dụng getBigDecimal thay cho bất kỳ tùy chọn nào khác! – Affe

+0

Không phải là câu trả lời mà là một gợi ý. "Tiến thoái lưỡng nan" này được xử lý trong http://www.jooq.org, nơi tất cả các kiểu số được coi là đối tượng, và "thực tế" JDBC này được tóm tắt ... Vì vậy, với jOOQ, không cần phải viết trình bao bọc của riêng bạn cho Những thiếu sót JDBC –

Trả lời

8

API JDBC được thiết kế để thực hiện. Hãy nhớ rằng nó ngày trở lại Java 1.1, khi một doanh thu lớn của các đối tượng là một kẻ giết người JVM (nó không phải cho đến khi các JVM Hotspot trong Java 1.2+ mà bạn có thể thư giãn kiểu giới hạn này). Sử dụng các kiểu đóng hộp sẽ làm hỏng hiệu suất của các ứng dụng âm lượng cao vào thời điểm đó.

Hiện tại, không thể thay đổi vì tính tương thích ngược. Vì vậy, không, nó không lý tưởng nữa, nhưng đó là một điều khá nhỏ để giải quyết.

Nếu bạn muốn tránh các loại mã mà bạn đề cập, bạn luôn có thể sử dụng getObject() thay vì getInt(), mà sẽ trả về một đối tượng của một trong những phân nhóm của java.lang.Number, có lẽ Integer hoặc BigInteger, tùy thuộc vào loại SQL cụ thể.

+1

Thật đáng tiếc getObject() đã không được phổ biến như RowMapper của Spring, JdbcTemplate và những thứ tương tự. Nó chỉ là cú pháp, nhưng làm cho mã trông đẹp hơn nhiều mà không có phôi. – mdma

+0

@mdma: Đó sẽ là một ý tưởng hay. Nhưng những thứ này khó có thể vượt qua được quá trình JSR ... –

Các vấn đề liên quan