2010-05-05 5 views
5

Quando si utilizza JDBC e accedere ad alcuni tipi primitivi tramite un set di risultati, c'è un modo più elegante per affrontare il nulla/0 al massimo i seguenti:Quando si accede a ResultSet in JDBC, esiste un modo elegante per distinguere tra valori nulli e valori zero effettivi?

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

io personalmente rabbrividire ogni volta che vedo questo tipo di codice. Non riesco a capire perché ResultSet non sia stato definito per restituire i tipi interi in scatola (tranne, forse, le prestazioni) o almeno fornire entrambi. Punti bonus se qualcuno può convincermi che l'attuale design dell'API è fantastico :)

La mia soluzione personale era scrivere un wrapper che restituisce un intero (mi interessa più dell'eleganza del codice client che delle prestazioni), ma mi chiedo se mi manca un modo migliore per farlo.

Giusto per chiarire, ciò che mi infastidisce di questo codice non è la lunghezza, ma il fatto che a crea una dipendenza di stato tra le chiamate successive, e ciò che appare come un semplice getter ha effettivamente un effetto collaterale all'interno della stessa riga.

+1

Chiaramente le persone responsabili della sostituzione di a> b con a.compare (b)> 0 non potevano immaginare un mondo in cui non si desidera utilizzare getBigDecimal al posto di nessuna delle altre opzioni! – Affe

+0

Non una risposta, ma un suggerimento. Questo "dilemma" è gestito in http://www.jooq.org, dove tutti i tipi numerici sono trattati come oggetto, e questo "fatto" JDBC è astratto ... Quindi con jOOQ, non c'è bisogno di scrivere il proprio wrapper per Mancanze di JDBC –

risposta

8

L'API JDBC è stata progettata per le prestazioni. Ricorda che risale a Java 1.1, quando un grande turnover di oggetti era un killer JVM (non è stato fino a quando le JVM Hotspot in Java 1.2+ non sono riuscite a rilassare questo tipo di limitazione). L'uso di tipi in scatola avrebbe rovinato le prestazioni di applicazioni ad alto volume al momento.

Ora, non può essere modificato a causa della retrocompatibilità. Quindi no, non è più l'ideale, ma è una cosa piuttosto piccola da risolvere.

Se si vuole evitare il tipo di codice che lei ha citato, si può sempre usare getObject() invece di getInt(), che restituirà un oggetto di uno dei sottotipi di java.lang.Number, probabilmente Integer o BigInteger, a seconda del tipo SQL specifica.

+1

È un peccato che getObject() non sia stato generato come Spring's RowMapper, JdbcTemplate e simili. È solo zucchero sintattico, ma rende il codice molto più bello senza i calchi. – mdma

+0

@mdma: sarebbe una buona idea. Ma queste cose sono difficili da ottenere attraverso il processo JSR ... –