Spring3.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一直是一种方便的方法(我猜),并且已经存在很长时间了。为什么它会被移除。结果,代码变得更加复杂。
发布于 2013-04-06 00:40:02
我认为是有人意识到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, ...);
发布于 2013-07-25 23:09:51
我同意最初的发帖者的观点,即弃用便捷方法queryForLong(sql)是一种不便。
我使用Spring3.1开发了一个应用程序,刚刚更新到最新的Spring版本(3.2.3),并注意到它已被弃用。
幸运的是,对我来说这只是一行代码的改变:
return jdbcTemplate.queryForLong(sql); // deprecated in Spring 3.2.x
已更改为
return jdbcTemplate.queryForObject(sql, Long.class);
几个单元测试似乎表明,上述更改是有效的。
发布于 2013-03-27 22:33:59
为支持queryForObject(String, Class)
而弃用。
https://stackoverflow.com/questions/15661313
复制相似问题