105 votes

JdbcTemplate queryForInt/Long est déconseillée au printemps 3.2.2. Ce qui devait être remplacée par ?

Le queryforInt/queryforLong méthodes de JdbcTemplate sont obsolètes au Printemps 3.2. Je ne peux pas savoir pourquoi ou ce qui est considéré comme la meilleure pratique pour remplacer le code existant à l'aide de ces méthodes.

Une méthode classique:

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);

Évidemment, cette dépréciation fait l'JdbcTemplate classe simple (ou si?). QueryForInt a toujours été une méthode de convenance (je suppose) et a été autour d'un long temps. Pourquoi il a été supprimé. Le code devient plus compliqué.

111voto

Ce que je pense, c'est que quelqu'un a réalisé que la queryForInt/Long méthodes a confusion sémantique, qui est, de JdbcTemplate code source, vous pouvez voir son application actuelle:

@Deprecated
public int queryForInt(String sql, Object... args) throws DataAccessException {
    Number number = queryForObject(sql, args, Integer.class);
    return (number != null ? number.intValue() : 0);
}

qui peut vous amener à penser que si l'ensemble est vide, il sera de retour 0, mais il déclenche une exception:

org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0

donc, la suite de la mise en œuvre est essentiellement équivalent à l'actuel:

@Deprecated
public int queryForInt(String sql, Object... args) throws DataAccessException {
    return queryForObject(sql, args, Integer.class);
}

Et puis la non obsolète actuellement, le code doit être remplacé par le laid:

    queryForObject(sql, new Object { arg1, arg2, ...}, Integer.class);

ou ce (plus sympa):

    queryForObject(sql, Integer.class, arg1, arg2, ...);

37voto

SGB Points 269

Je suis d’accord avec l’affiche originale que de dénigrer la queryForLong(sql) méthode de convenance est un inconvénient.

J’avais mis au point une application à l’aide de printemps 3.1 et juste mis à jour vers la dernière version de printemps (3.2.3) et remarqué qu’il a été désapprouvé.

Heureusement, c’était un changement d’une seule ligne pour moi :

a été changé pour

Et un couple de Tests unitaires semblent indiquer, précède changer des œuvres.

14voto

vertti Points 2069

Désapprouvé en faveur de `` .

13voto

Marcin Points 369

Remplacement de ce code:

long num = jdbcTemplate.queryForLong(sql);

Avec ce code:

long num = jdbcTemplate.queryForObject(sql, Long.class);

est très dangereux parce que si la colonne ont la valeur null queryForObject retourner la valeur null et comme nous le savons, les types primitifs ne peut pas être null et Vous aurez NullPointerException. Le compilateur ne Vous avais pas prévenu à ce sujet. Vous savez à propos de cette erreur à l'exécution. La même erreur, Vous devrez si Vous avez de la méthode de retour de type primitif:

public long getValue(String sql) {
    return = jdbcTemplate.queryForObject(sql, Long.class);
}

La méthode dépréciée queryForLong dans JdbcTemplate au Printemps 3.2.2 ont du corps suivantes:

@Deprecated
public long queryForLong(String sql) throws DataAccessException {
    Number number = queryForObject(sql, Long.class);
    return (number != null ? number.longValue() : 0);
}

Vous voir avant le retour à la valeur primitive, il est de vérifier que ce n'est pas null, et si elle est nulle, ils retournent 0. En passant, Devrait être 0L.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X