태그 보관물: jdbc

jdbc

JdbcTemplate queryForInt / Long은 Spring 3.2.2에서 더 이상 사용되지 않습니다. 무엇으로 교체해야합니까? = jscoreJdbcTemplate.queryForInt(

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;
}


답변