[java] JdbcTemplate queryForInt / Long은 Spring 3.2.2에서 더 이상 사용되지 않습니다. 무엇으로 교체해야합니까?
JdbcTemplate의 queryforInt / queryforLong 메소드는 Spring 3.2에서 더 이상 사용되지 않습니다. 이러한 방법을 사용하여 기존 코드를 대체하는 가장 좋은 방법이 무엇인지 이유를 알 수 없습니다.
일반적인 방법 :
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, ...);
답변
편의 메소드 queryForLong (sql)을 사용하지 않는 것이 불편하다는 원래 포스터에 동의합니다.
저는 Spring 3.1을 사용하여 앱을 개발했고 방금 최신 Spring 버전 (3.2.3)으로 업데이트했으며 더 이상 사용되지 않는 것으로 나타났습니다.
다행히도 한 줄 변경되었습니다.
return jdbcTemplate.queryForLong(sql); // deprecated in Spring 3.2.x
변경되었습니다
return jdbcTemplate.queryForObject(sql, Long.class);
그리고 두 개의 단위 테스트는 위의 변경 사항이 작동 함을 나타내는 것 같습니다.
답변
대신 사용되지 않습니다 queryForObject(String, Class)
.
답변
이러한 코드 교체 :
long num = jdbcTemplate.queryForLong(sql);
이 코드로 :
long num = jdbcTemplate.queryForObject(sql, Long.class);
열에 null 값이 있으면 queryForObject가 null을 반환하고 기본 유형은 null이 될 수 없으며 NullPointerException이 발생하기 때문에 매우 위험합니다. 컴파일러는 이것에 대해 경고하지 않았습니다. 런타임시이 오류에 대해 알게됩니다. 기본 유형을 반환하는 메서드가있는 경우에도 동일한 오류가 발생합니다.
public long getValue(String sql) {
return = jdbcTemplate.queryForObject(sql, Long.class);
}
Spring 3.2.2의 JdbcTemplate에서 더 이상 사용되지 않는 메소드 queryForLong은 다음 본문을 갖습니다.
@Deprecated
public long queryForLong(String sql) throws DataAccessException {
Number number = queryForObject(sql, Long.class);
return (number != null ? number.longValue() : 0);
}
프리미티브 값을 반환하기 전에 이것이 null이 아닌지 확인하고 null이면 0을 반환합니다. 그런데-0L이어야합니다.
답변
JdbcTemplate#queryForInt
열 값이 SQL NULL 또는 0이면 0을 반환합니다. 한 대소 문자를 구별 할 방법이 없습니다. 이것이 방법이 더 이상 사용되지 않는 주된 이유라고 생각합니다. BTW는 ResultSet#getInt
비슷하게 작동합니다. 그러나 우리는 ResultSet#wasNull
.
답변
public int getCircleCount() {
Object param = "1";
String sql = "select count(*) from circle where id = ? ";
jdbcTemplate.setDataSource(getDataSource());
int result = getJdbcTemplate().queryForObject(sql, new Object[] { param }, Integer.class);
return result;
}