Die queryforInt / queryforLong-Methoden in JdbcTemplate sind in Spring 3.2 veraltet. Ich kann nicht herausfinden, warum oder was als die beste Vorgehensweise angesehen wird, um vorhandenen Code mit diesen Methoden zu ersetzen.
Eine typische Methode:
int rowCount = jscoreJdbcTemplate.queryForInt(
"SELECT count(*) FROM _player WHERE nameKey = ? AND teamClub = ?",
playerNameKey.toUpperCase(),
teamNameKey.toUpperCase()
);
OK, die obige Methode muss wie folgt neu geschrieben werden:
Object[] params = new Object[] {
playerNameKey.toUpperCase(),
teamNameKey.toUpperCase()
};
int rowCount = jscoreJdbcTemplate.queryForObject(
"SELECT count(*) FROM _player WHERE nameKey = ? AND teamClub = ?",
params, Integer.class);
Offensichtlich macht diese Ablehnung die JdbcTemplate-Klasse einfacher (oder doch?). QueryForInt war immer eine bequeme Methode (denke ich) und gibt es schon lange. Warum wurde es entfernt? Der Code wird dadurch komplizierter.
java
spring
jdbc
jdbctemplate
Dan MacBean
quelle
quelle
@Deprecated
null
(in Ihrem Beispiel nicht der Fall). Ich habe keine andere Möglichkeit gefunden, als jetzt den Nullprüfcode von queryForInt / Long zu duplizieren.Antworten:
Was ich denke ist, dass jemand erkannt hat, dass die queryForInt / Long-Methoden eine verwirrende Semantik haben, dh aus dem JdbcTemplate-Quellcode können Sie die aktuelle Implementierung sehen:
Dies kann zu der Annahme führen, dass die leere Ergebnismenge 0 zurückgibt, jedoch eine Ausnahme auslöst:
org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
Die folgende Implementierung entspricht also im Wesentlichen der aktuellen:
Und dann muss der nicht veraltete Code jetzt durch den hässlichen ersetzt werden:
oder das (schöner):
quelle
Ich stimme dem Originalposter zu, dass die Ablehnung der Convenience-Methode queryForLong (sql) eine Unannehmlichkeit darstellt.
Ich hatte eine App mit Spring 3.1 entwickelt und gerade auf die neueste Spring-Version (3.2.3) aktualisiert und festgestellt, dass sie veraltet war.
Zum Glück war es eine einzeilige Änderung für mich:
wurde geändert in
Und ein paar Unit-Tests scheinen darauf hinzudeuten, dass die obige Änderung funktioniert.
quelle
Veraltet zugunsten von
queryForObject(String, Class)
.quelle
Ersetzen eines solchen Codes:
Mit diesem Code:
ist sehr gefährlich, denn wenn die Spalte einen Nullwert hat, gibt queryForObject null zurück und wie wir wissen, können primitive Typen nicht null sein, und Sie haben eine NullPointerException. Der Compiler hat Sie nicht davor gewarnt. Sie werden diesen Fehler zur Laufzeit kennen. Der gleiche Fehler, den Sie haben, wenn Sie eine Methode haben, die den primitiven Typ zurückgibt:
Die veraltete Methode queryForLong in JdbcTemplate in Spring 3.2.2 hat den folgenden Text:
Sie sehen, bevor sie den primitiven Wert zurückgeben, wird überprüft, ob dies nicht null ist, und wenn es null ist, geben sie 0 zurück. Übrigens - Sollte 0L sein.
quelle
JdbcTemplate#queryForInt
Gibt 0 zurück, wenn der Spaltenwert SQL NULL oder 0 ist. Es gibt keine Möglichkeit, einen Fall vom anderen zu unterscheiden. Ich denke, dies ist der Hauptgrund, warum die Methode veraltet ist. ÜbrigensResultSet#getInt
verhält sich ähnlich. Wir können diese beiden Fälle jedoch durch unterscheidenResultSet#wasNull
.quelle
quelle