2010-05-05 18 views
5

當使用JDBC,並通過結果集訪問原始類型,是否有一個更優雅的方式來處理與空/ 0比下面在JDBC中訪問ResultSet時,有沒有一種方法可以區分零值和實際零值?

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

我個人畏縮,每當我看到這種代碼。我不明白爲什麼ResultSet沒有被定義爲返回盒裝整數類型(可能除外,性能)或至少提供這兩種類型。獎金積分,如果任何人都可以說服我,目前的API設計是偉大的:)

我個人的解決方案是編寫一個封裝,返回一個Integer(我更關心優雅的客戶端代碼比性能),但我想知道如果我錯過了一個更好的方法來做到這一點。

只是爲了澄清一下,關於此代碼的困擾不是長度,而是它在隨後的調用之間創建了狀態依賴關係,並且看起來像是一個簡單的getter實際上在同一行內有副作用。

+1

很明顯,負責用a.compare(b)> 0替換a> b的人無法想象一個你不想用getBigDecimal代替任何其他選項的世界! – Affe 2010-05-05 22:49:59

+0

不是一個答案,而是一個提示。這個「困境」在http://www.jooq.org中處理,所有的數字類型都被當作對象來處理,並且這個JDBC「事實」被抽象化了......因此,使用jOOQ,不需要編寫自己的包裝器JDBC的缺點 – 2011-07-11 06:01:04

回答

8

JDBC API是爲性能而設計的。請記住,它可以追溯到Java 1.1,當時大量的對象是一個JVM殺手(直到Java 1.2或更高版本的熱點JVM才能放鬆這種限制)。使用盒裝類型會破壞當時大量應用程序的性能。

現在,由於向後兼容性而無法更改。所以不行,這不再理想,但這是一個很小的事情來解決。

如果你想避免你提到代碼的類型,你可以隨時使用getObject()代替getInt(),這將返回java.lang.Number亞型之一,大概IntegerBigInteger的對象,這取決於具體的SQL類型。

+1

很遺憾getObject()並沒有像Spring的RowMapper,JdbcTemplate等那樣被泛化。它只是語法糖,但是如果沒有強制轉換,代碼看起來會更好。 – mdma 2010-05-08 23:31:17

+0

@mdma:這將是一個好主意。但是這些事情很難通過JSR流程來實現...... – 2011-07-11 05:58:45

相關問題