Les méthodes queryforInt / queryforLong dans JdbcTemplate sont obsolètes dans Spring 3.2. Je ne peux pas savoir pourquoi ni ce qui est considéré comme la meilleure pratique pour remplacer le code existant à l'aide de ces méthodes.
Une méthode typique:
int rowCount = jscoreJdbcTemplate.queryForInt(
"SELECT count(*) FROM _player WHERE nameKey = ? AND teamClub = ?",
playerNameKey.toUpperCase(),
teamNameKey.toUpperCase()
);
OK, la méthode ci-dessus doit être réécrite comme suit:
Object[] params = new Object[] {
playerNameKey.toUpperCase(),
teamNameKey.toUpperCase()
};
int rowCount = jscoreJdbcTemplate.queryForObject(
"SELECT count(*) FROM _player WHERE nameKey = ? AND teamClub = ?",
params, Integer.class);
De toute évidence, cette dépréciation rend la classe JdbcTemplate plus simple (ou est-ce le cas?). QueryForInt a toujours été une méthode pratique (je suppose) et existe depuis longtemps. Pourquoi a-t-il été supprimé. Le code devient par conséquent plus compliqué.
java
spring
jdbc
jdbctemplate
Dan MacBean
la source
la source
@Deprecated
null
(pas le cas dans votre exemple). Je n'ai trouvé d'autre moyen que de dupliquer maintenant le code de vérification nul de queryForInt / Long.Réponses:
Ce que je pense, c'est que quelqu'un s'est rendu compte que les méthodes queryForInt / Long ont une sémantique déroutante, c'est-à-dire qu'à partir du code source de JdbcTemplate, vous pouvez voir son implémentation actuelle:
ce qui peut vous amener à penser que si le jeu de résultats est vide, il renverra 0, mais il lève une exception:
org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
donc l'implémentation suivante est essentiellement équivalente à l'actuelle:
Et puis le code non obsolète doit maintenant être remplacé par le laid:
ou ceci (mieux):
la source
Je suis d'accord avec l'affiche originale que déconseiller la méthode de commodité queryForLong (sql) est un inconvénient.
J'avais développé une application utilisant Spring 3.1 et je venais de la mettre à jour avec la dernière version Spring (3.2.3) et j'ai remarqué qu'elle était obsolète.
Heureusement, c'était un changement d'une ligne pour moi:
a été changé en
Et quelques tests unitaires semblent indiquer que le changement ci-dessus fonctionne.
la source
Déconseillé au profit de
queryForObject(String, Class)
.la source
Remplacement de ce code:
Avec ce code:
est très dangereux car si la colonne a une valeur nulle, queryForObject renvoie null et comme nous le savons, les types primitifs ne peuvent pas être nuls et vous aurez NullPointerException. Le compilateur ne vous a pas averti à ce sujet. Vous connaîtrez cette erreur lors de l'exécution. La même erreur que vous aurez si vous avez une méthode qui renvoie le type primitif:
La méthode obsolète queryForLong dans JdbcTemplate dans Spring 3.2.2 a le corps suivant:
Vous voyez avant qu'ils ne retournent la valeur primitive, il est vérifié que ce n'est pas nul et s'il est nul, ils retournent 0. Au fait - Doit être 0L.
la source
JdbcTemplate#queryForInt
renvoie 0 si la valeur de la colonne est SQL NULL ou 0. Il n'y a aucun moyen de distinguer un cas de l'autre. Je pense que c'est la principale raison pour laquelle la méthode est obsolète. BTW,ResultSet#getInt
se comporte de la même manière. Cependant, nous pouvons distinguer ces deux cas parResultSet#wasNull
.la source
la source