Spring 3.2中不推荐使用JdbcTemplate中的queryforInt / queryforLong方法。我找不到使用这些方法替换现有代码的最佳实践的理由或理由。
典型方法:
int rowCount = jscoreJdbcTemplate.queryForInt( "SELECT count(*) FROM _player WHERE nameKey = ? AND teamClub = ?", playerNameKey.toUpperCase(), teamNameKey.toUpperCase() );
确定以上方法需要重新编写如下:
Object[] params = new Object[] { playerNameKey.toUpperCase(), teamNameKey.toUpperCase() }; int rowCount = jscoreJdbcTemplate.queryForObject( "SELECT count(*) FROM _player WHERE nameKey = ? AND teamClub = ?", params, Integer.class);
显然,这种弃用使JdbcTemplate类更简单(或者呢?)。QueryForInt一直是一种便捷的方法(我想),并且已经存在了很长时间。为什么将其删除。结果,代码变得更加复杂。
我认为,有人意识到queryForInt / Long方法具有令人困惑的语义,也就是说,从JdbcTemplate源代码中可以看到其当前实现:
@Deprecated public int queryForInt(String sql, Object... args) throws DataAccessException { Number number = queryForObject(sql, args, Integer.class); return (number != null ? number.intValue() : 0); }
这可能会导致您认为如果结果集为空,则将返回0,但是会引发异常:
org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
因此,以下实现实质上与当前实现等效:
@Deprecated public int queryForInt(String sql, Object... args) throws DataAccessException { return queryForObject(sql, args, Integer.class); }
然后,现在必须将不推荐使用的代码替换为丑陋的代码:
queryForObject(sql, new Object { arg1, arg2, ...}, Integer.class);
或这个(更细):
queryForObject(sql, Integer.class, arg1, arg2, ...);