当前位置: 首页 > 面试题库 >

JdbcTemplate queryForInt / Long在Spring 3.2.2中已弃用。应该用什么代替?

颜经艺
2023-03-14
问题内容

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


 类似资料:
  • 在Spring 3.2中,JdbcTemplate中的queryforInt/queryforLong方法被弃用。我不知道为什么或者什么是使用这些方法替换现有代码的最佳实践。 典型方法: OK以上方法需要重写如下: 显然,这种不赞成使JdbcTemplate类更简单(或者是这样吗?)。QueryForInt一直是一种方便的方法(我想),而且已经存在很长时间了。为什么要删除它。因此,代码变得更加复杂

  • 问题内容: 我正在使用apache-httpclient-4.3。我将分析一个HTTP请求,尤其是查询字符串参数,但是 我不确定这意味着什么。我应该使用某些配置API的构造函数参数(那是什么?HostConfiguration作为类不再可用)。但是在构建阶段,我直接通过url传递查询参数: 我找不到不使用不推荐使用的方法从我的 请求 对象读回参数( var1,var2 )的方法,这种方法应该很简单

  • 问题内容: 使用时收到以下警告: 我应该改用什么? 问题答案: 使用URLEncoder中的其他方法: 第一个参数是要编码的文本。第二个是要使用的字符编码的名称(例如)。例如:

  • 问题内容: 一次又一次,我看到Bash在Stack Overflow上使用了答案,而答案被猛烈抨击了,旨在使用这种“邪恶的”构造。为什么这么邪恶? 如果不能安全使用,我应该怎么用呢? 问题答案: 这个问题比眼前的问题还重要。我们将从显而易见的内容开始:具有执行“脏”数据的潜力。脏数据是指尚未重写为XYZ的任何数据;在我们的例子中,它是未格式化的任何字符串,以确保评估安全。 乍看之下,对数据进行消毒

  • 本文向大家介绍为什么在Bash中应该避免eval,我应该用什么来代替呢?,包括了为什么在Bash中应该避免eval,我应该用什么来代替呢?的使用技巧和注意事项,需要的朋友参考一下 eval是Bash shell的内置命令,它将其参数连接为单个字符串。然后,它将参数与空格连接起来,然后将该字符串作为bash命令执行。以下是其工作方式的示例。 eval示例 在下面的示例中,我们使用一个字符串,该字符串

  • 原始关闭原因未解决 既然getToken()已弃用,我想知道获得Firebase令牌以发送消息推送的正确方法是什么。