项目场景:
前人写的定时任务的服务。我接手,其中用到了JdbcTemplate中的queryForObject。
问题描述
idea产生提示
'queryForObject(java.lang.String, java.lang.Object[], org.springframework.jdbc.core.RowMapper<T>)' 已弃用
原因分析:
查看了源码发现参数发生了变化,其他的什么都没变(@Deprecated代表已经弃用)
参数由 @Nullable Object[] args
变成了 @Nullable Object... args
实际核心问题在于jdk1.5添加了Object… args这个可变参数的功能
/** @deprecated */
@Deprecated
@Nullable
public <T> T queryForObject(String sql, @Nullable Object[] args, RowMapper<T> rowMapper) throws DataAccessException {
List<T> results = (List)this.query((String)sql, (Object[])args, (ResultSetExtractor)(new RowMapperResultSetExtractor(rowMapper, 1)));
return DataAccessUtils.nullableSingleResult(results);
}
@Nullable
public <T> T queryForObject(String sql, RowMapper<T> rowMapper, @Nullable Object... args) throws DataAccessException {
List<T> results = (List)this.query((String)sql, (Object[])args, (ResultSetExtractor)(new RowMapperResultSetExtractor(rowMapper, 1)));
return DataAccessUtils.nullableSingleResult(results);
}
解决方案:
更换参数的位置,并且将@Nullable Object[] args
替换成 @Nullable Object... args
。在使用中,其实没有什么区别,方法里还是拿可变参数当一个数组用。只是省去了我们自己将多个对象封装成数组的步骤
因为可变参数不确定有多少个,所以传参不适合放到中间,就顺便把位置改了一下放到了后边
下边是几个示例供大家参考调用方式:
//过时的调用方式,需要手动拼接数组
String sql = "select id, name from t_student where id = ?";
SqlInfo sqlInfo1 = (SqlInfo) this.jdbcTemplate.queryForObject(sql, new Object[] { id }, new BeanPropertyRowMapper<>(SqlInfo.class));
//新的调用方式,直接传参数
String sql = "select id, name from t_student where id = ?";
SqlInfo sqlInfo = this.jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(SqlInfo.class), id);
//新的调用方式,多个参数的时候
String sql = "select id, name from t_student where id = ? and name = ?";
SqlInfo sqlInfo = this.jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(SqlInfo.class), id, name);