2010-05-05 7 views
5

Bei Verwendung von JDBC und Urtyp über eine Ergebnismenge zugreifen, ist es eine elegantere Art und Weise mit dem Null/0 als die Bewältigung folgender Situationen:Gibt es beim Zugriff auf ResultSets in JDBC eine elegante Möglichkeit, zwischen Nullwerten und tatsächlichen Nullwerten zu unterscheiden?

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

ich persönlich zusammenzucken, wenn ich diese Art von Code. Ich verstehe nicht, warum ResultSet nicht definiert wurde, um die Boxed Integer-Typen zurückzugeben (außer vielleicht Leistung) oder zumindest beides bereitzustellen. Bonuspunkte, wenn jemand mich davon überzeugen kann, dass das aktuelle API Design großartig ist :)

Meine persönliche Lösung war, einen Wrapper zu schreiben, der einen Integer zurückgibt (ich interessiere mich mehr für Eleganz des Client-Codes als Leistung), aber ich frage mich wenn ich einen besseren Weg vermisse, dies zu tun.

Nur um zu klären, was stört mich an diesem Code ist nicht die Länge, sondern die Tatsache, dass ein es schafft eine Abhängigkeit zwischen aufeinanderfolgenden Aufrufen, und was wie ein einfacher Getter aussieht hat tatsächlich einen Nebeneffekt innerhalb der gleichen Zeile.

+1

Offensichtlich konnten die Leute, die für das Ersetzen von a> b durch a.compare (b)> 0 verantwortlich waren, sich keine Welt vorstellen, in der Sie getBigDecimal anstelle einer der anderen Optionen verwenden wollten! – Affe

+0

Keine Antwort, aber ein Hinweis. Dieses "Dilemma" wird in http://www.jooq.org gehandhabt, wo alle numerischen Typen als Objekt behandelt werden und diese JDBC- "Tatsache" abstrahiert wird ... Mit jOOQ brauchen Sie also keinen eigenen Wrapper zu schreiben JDBC Unzulänglichkeiten –

Antwort

8

Die JDBC-API wurde auf Leistung ausgelegt. Denken Sie daran, dass es auf Java 1.1 zurückgeht, als ein großer Umsatz von Objekten ein JVM-Killer war (erst mit den Hotspot-JVMs in Java 1.2+ konnten Sie diese Art von Einschränkung lockern). Die Verwendung von Boxed-Typen hätte die Leistung von Anwendungen mit hohem Volumen zu diesem Zeitpunkt ruiniert.

Jetzt kann es wegen der Abwärtskompatibilität nicht geändert werden. Also nein, es ist nicht mehr ideal, aber es ist eine ziemlich kleine Sache, um Abhilfe zu schaffen.

Wenn Sie die Art von Code vermeiden wollen Sie erwähnt haben, können Sie immer getObject() anstelle von getInt(), die ein Objekt eines der Subtypen von java.lang.Number zurückkehren, wahrscheinlich Integer oder BigInteger, abhängig von der spezifischen SQL-Typ.

+1

Es ist schade, getObject() wurde nicht wie Spring RowMapper, JdbcTemplate und dergleichen generisch gemacht. Es ist nur syntaktischer Zucker, aber macht den Code viel schöner ohne die Casts. – mdma

+0

@mdma: Das wäre eine gute Idee. Aber diese Dinge sind schwer durch den JSR-Prozess zu bekommen ... –