首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Spring3.2.2中弃用了JdbcTemplate queryForInt/Long。应该用什么来取代它呢?

Spring3.2.2中弃用了JdbcTemplate queryForInt/Long。应该用什么来取代它呢?
EN

Stack Overflow用户
提问于 2013-03-27 22:24:34
回答 6查看 94.2K关注 0票数 105

Spring3.2中不推荐使用JdbcTemplate中的queryforInt/queryforLong方法。我找不出为什么或者什么被认为是使用这些方法替换现有代码的最佳实践。

一个典型的方法:

代码语言:javascript
复制
int rowCount = jscoreJdbcTemplate.queryForInt(
    "SELECT count(*) FROM _player WHERE nameKey = ? AND teamClub = ?",
    playerNameKey.toUpperCase(),
    teamNameKey.toUpperCase()
);

好的,上面的方法需要重写如下:

代码语言:javascript
复制
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一直是一种方便的方法(我猜),并且已经存在很长时间了。为什么它会被移除。结果,代码变得更加复杂。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-04-06 00:40:02

我认为是有人意识到queryForInt/Long方法具有令人困惑的语义,也就是说,从JdbcTemplate源代码中可以看到它当前的实现:

代码语言:javascript
复制
@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

因此,以下实现实质上等同于当前的实现:

代码语言:javascript
复制
@Deprecated
public int queryForInt(String sql, Object... args) throws DataAccessException {
    return queryForObject(sql, args, Integer.class);
}

然后,现在必须用丑陋的代码替换不推荐使用的代码:

代码语言:javascript
复制
    queryForObject(sql, new Object { arg1, arg2, ...}, Integer.class);

或者这个(更好):

代码语言:javascript
复制
    queryForObject(sql, Integer.class, arg1, arg2, ...);
票数 111
EN

Stack Overflow用户

发布于 2013-07-25 23:09:51

我同意最初的发帖者的观点,即弃用便捷方法queryForLong(sql)是一种不便。

我使用Spring3.1开发了一个应用程序,刚刚更新到最新的Spring版本(3.2.3),并注意到它已被弃用。

幸运的是,对我来说这只是一行代码的改变:

代码语言:javascript
复制
return jdbcTemplate.queryForLong(sql);  // deprecated in Spring 3.2.x

已更改为

代码语言:javascript
复制
return jdbcTemplate.queryForObject(sql, Long.class);

几个单元测试似乎表明,上述更改是有效的。

票数 37
EN

Stack Overflow用户

发布于 2013-03-27 22:33:59

为支持queryForObject(String, Class)而弃用。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15661313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档