2010-05-05 12 views
5

Przy użyciu JDBC i uzyskiwania dostępu do prymitywnych typów poprzez zestaw wyników, tam jest bardziej eleganckim sposobem radzenia sobie z zerową/0 niż:Podczas uzyskiwania dostępu do ResultSets w JDBC, istnieje elegancki sposób na odróżnienie wartości zerowych od rzeczywistych wartości zerowych?

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

Osobiście warować kiedy widzę ten rodzaj kodu. Nie widzę powodu, dla którego ResultSet nie został zdefiniowany w celu zwrócenia pudełkowych typów całkowitych (z wyjątkiem, być może, wydajności) lub przynajmniej zapewnienia obu. Punkty premiowe, jeśli ktokolwiek może mnie przekonać, że aktualny projekt interfejsu API jest świetny :)

Moim osobistym rozwiązaniem było napisanie opakowania, które zwraca liczbę całkowitą (bardziej zależy mi na elegancji kodu klienta niż wydajności), ale zastanawiam się jeśli brakuje mi lepszego sposobu na zrobienie tego.

Dla wyjaśnienia, to, co przeszkadza mi w tym kodzie, nie jest długością, ale fakt, że tworzy zależność od stanu między kolejnymi wywołaniami, i to, co wygląda jak zwykły getter, faktycznie ma efekt uboczny w tym samym wierszu.

+1

Najwyraźniej osoby odpowiedzialne za zamianę> b na a.compare (b)> 0 nie mogły wyobrazić sobie świata, w którym nie chciałbyś używać getBigDecimal w miejsce jakiejkolwiek innej opcji! – Affe

+0

Nie odpowiedź, ale podpowiedź. Ten "dylemat" jest obsługiwany na stronie http://www.jooq.org, gdzie wszystkie typy liczbowe są traktowane jako obiekt, a ten "fakt" JDBC jest wyabstrahowany ... Więc z jOOQ, nie ma potrzeby pisania własnego opakowania dla Niedociągnięcia JDBC –

Odpowiedz

8

Interfejs API JDBC został zaprojektowany pod kątem wydajności. Pamiętaj, że pochodzi on z wersji Java 1.1, kiedy duży obrót obiektów był zabójcą JVM (nie było aż do maszyn JVM Hotspot w Javie 1.2+, które można by złagodzić tego rodzaju ograniczenia). Używanie typów pudełkowych zrujnowałoby wydajność wysokowydajnych aplikacji w tym czasie.

Teraz nie można go zmienić z powodu kompatybilności wstecznej. Więc nie, to już nie jest idealny, ale jest to trochę mniej ważne, aby obejść.

Jeśli chcesz uniknąć rodzaj kodu pan wspomniał, zawsze można użyć getObject() zamiast getInt(), która zwróci przedmiot jednego z podtypów java.lang.Number, prawdopodobnie Integer lub BigInteger, w zależności od konkretnego typu SQL.

+1

Szkoda, że ​​getObject() nie został wygenerowany jak Spring RowMapper, JdbcTemplate i tym podobne. To tylko cukier syntaktyczny, ale sprawia, że ​​kod wygląda znacznie lepiej bez obsady. – mdma

+0

@mdma: To byłby dobry pomysł. Ale trudno jest przejść przez proces JSR ... –

Powiązane problemy