Comment puis-je en JDBC lu une double valeur éventuellement nul de resultSet?
Question
J'ai une colonne dans ma base de données qui est tapé double
et je veux lire la valeur de l'aide d'un ResultSet JDBC, mais il peut être nulle. Quelle est la meilleure façon de le faire? Je peux penser à trois options dont aucun ne semble très bon.
Option 1: Mauvais parce que la gestion des exceptions verbeux et malodorante
double d;
try {
d = rs.getDouble(1);
// do something
} catch(SQLException ex) {
if(rs.wasNull()) {
// do something else
} else {
throw ex;
}
}
Option 2: Bad parce que deux récupérations
s = rs.getString(1); // or getObject()
if(s == null) {
// do something else
} else {
double d = rs.getDouble(1);
// do something
}
Option 3: Bad parce que Java plutôt que la conversion SQL
s = rs.getString(1); // or getObject()
if(s == null) {
// do something else
} else {
double d = Double.parseDouble(s);
// do something
}
Toutes les suggestions sur quelle manière est meilleure, ou est-il une autre façon supérieure? Et s'il vous plaît ne dites pas « Utiliser Hibernate », je suis limité au code JDBC seulement ici.
La solution
Option 1 est le plus proche:
double d = rs.getDouble(1);
if (rs.wasNull()) {
// do something
} else {
// use d
}
Il est pas très agréable, mais c'est JDBC. Si la colonne était nulle, la double valeur est considérée comme « mauvais », de sorte que vous devriez vérifier à l'aide wasNull()
à chaque fois que vous avez lu une primitive qui est annulable dans la base de données.
Autres conseils
En fonction de votre pilote JDBC et base de données, vous pourrez peut-être utiliser un type Boxé et casting:
Double doubleValueOrNull = (Double)rs.getObject(1); // or .getObject("columnName")
Il sera null
si la colonne a été NULL
.
Prenez soin de vérifier cela fonctionne toujours si vous changez la base de données.
Utilisation:
rs.getObject(1)==null?null:rs.getBigDecimal(1).doubleValue()
Ou avec java 8 que vous pouvez faire ceci:
Double dVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
.map(BigDecimal::doubleValue).orElse(null));
Version Kotlin pour récupérer un champ annulable:
val parentId = resultSet.getObject("parent_id") as Double?