Metody queryforInt / queryforLong w JdbcTemplate są przestarzałe w wersji Spring 3.2. Nie mogę dowiedzieć się, dlaczego lub co jest uważane za najlepszą praktykę zastępowania istniejącego kodu przy użyciu tych metod.
Typowa metoda:
int rowCount = jscoreJdbcTemplate.queryForInt(
"SELECT count(*) FROM _player WHERE nameKey = ? AND teamClub = ?",
playerNameKey.toUpperCase(),
teamNameKey.toUpperCase()
);
OK powyższą metodę należy przepisać w następujący sposób:
Object[] params = new Object[] {
playerNameKey.toUpperCase(),
teamNameKey.toUpperCase()
};
int rowCount = jscoreJdbcTemplate.queryForObject(
"SELECT count(*) FROM _player WHERE nameKey = ? AND teamClub = ?",
params, Integer.class);
Oczywiście to wycofanie sprawia, że klasa JdbcTemplate jest prostsza (czy też robi?). QueryForInt zawsze była wygodną metodą (chyba) i istnieje od dawna. Dlaczego został usunięty. W rezultacie kod staje się bardziej skomplikowany.
java
spring
jdbc
jdbctemplate
Dan MacBean
źródło
źródło
@Deprecated
null
(nie ma to miejsca w Twoim przykładzie). Nie znalazłem innego sposobu niż zduplikowanie teraz zerowego kodu kontrolnego z queryForInt / Long.Odpowiedzi:
Myślę, że ktoś zdał sobie sprawę, że metody queryForInt / Long mają mylącą semantykę, to znaczy z kodu źródłowego JdbcTemplate widać jego aktualną implementację:
co może sprawić, że pomyślisz, że jeśli zestaw wyników jest pusty, zwróci 0, jednak zgłasza wyjątek:
org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
więc następująca implementacja jest zasadniczo równoważna z obecną:
A potem nieaktualny kod musi teraz zostać zastąpiony brzydkim:
lub to (ładniej):
źródło
Zgadzam się z oryginalnym postem, że rezygnacja z wygodnej metody queryForLong (sql) jest niedogodnością.
Napisałem aplikację przy użyciu Spring 3.1 i właśnie zaktualizowałem do najnowszej wersji Spring (3.2.3) i zauważyłem, że jest przestarzała.
Na szczęście była to dla mnie zmiana w jednym wierszu:
został zmieniony na
Kilka testów jednostkowych wydaje się wskazywać, że powyższa zmiana działa.
źródło
Przestarzałe na rzecz
queryForObject(String, Class)
.źródło
Zastąpienie takiego kodu:
Za pomocą tego kodu:
jest bardzo niebezpieczne, ponieważ jeśli kolumna ma wartość null, queryForObject zwraca wartość null, a jak wiemy, typy pierwotne nie mogą być puste i otrzymasz NullPointerException. Kompilator Cię o tym nie ostrzegł. Dowiesz się o tym błędzie w czasie wykonywania. Ten sam błąd, który będziesz miał, jeśli masz metodę zwracającą typ pierwotny:
Przestarzała metoda queryForLong w JdbcTemplate w Spring 3.2.2 ma następującą treść:
Widzisz, zanim zwrócą wartość pierwotną, sprawdź, czy nie jest to null, a jeśli jest zerowe, zwracają 0. Nawiasem mówiąc - powinno być 0L.
źródło
JdbcTemplate#queryForInt
zwraca 0, jeśli wartością kolumny jest SQL NULL lub 0. Nie ma sposobu, aby odróżnić jedną wielkość liter od drugiej. Myślę, że jest to główny powód, dla którego metoda jest przestarzała. BTW,ResultSet#getInt
zachowuje się podobnie. Chociaż możemy rozróżnić te dwa przypadki wedługResultSet#wasNull
.źródło
źródło