결과가 1행인 경우 사용할 수 있는 qureyForObject 메서드에 대해 알아봅시다.
결과가 1행인 경우 사용할 수 있는 qureyForObject() 메서드
다음은 query() 메서드를 사용한 코드입니다.
public int count(){
List<Integer> results = jdbcTemplate.query(
"select count(*) from MEMBER",
new RowMapper<Integer>(){
@Override
public Integer mapRow(Resultset rs, int rowNum) throws SQLException{
return rs.getInt(1);
}
});
return results.get(0);
}
count(*) 쿼리는 결과가 한 행뿐이니 쿼리 결과를 List로 받기보다는 Integer와 같은 정수 타입으로 받으면 편리합니다. 이를 위한 메서드가 바로 qureyForObject() 메서드입니다. 이것만 사용하면 count(*) 쿼리 실행코드를 다음처럼 구현할 수 있습니다.
public int count() {
Integer count = jdbcTemplate.queryForObject("select count(*) from MEMBER", Integer.class);
return count;
}
qureyForObject의 두 번째 파라미터는 칼럼을 읽어올 때 사용할 타입을 지정합니다.
평균을 구할 때 예시
double avg = qureyForObject(
"select avg(height) from FURNITURE where TYPE = ? and STATUS = ?",
Double.class,
100, "S");
위 코드에서 qureyForObject() 메서드도 쿼리에 인덱스 파라미터(?) 를 사용할 수 있습니다. 인덱스 파라미터가 존재하면 파라미터의 값을 가변 인자로 전달합니다.
실행 결과 칼럼이 두 개 이상이면 RowMapper를 파라미터로 전달해서 결과를 생성할 수 있습니다. 예를 들어 특정 ID를 갖는 회원 데이터를 qureyForObject()로 읽어오고 싶다면 다음과 같이 작성할 수 있습니다.
Member member = jdbcTemplate.qurey(
"select * from MEMBER where ID = ?",
new RowMapper<Member>(){
@Override
public Member mapRow(ResultSet rs, int rowNum) throws SQLException{
Member member = new Member(rs.getString("EMAIL"),
rs.getString("PASSWORD"),
rs.getString("NAME"),
rs.getTimeStamp("REGDATE").toLocalDateTime());
member.setId(rs.getLong("ID"));
return member;
}
}, 100);
queryForObject() 메서드를 사용한 위 코드와 기존의 qurey() 메서드를 사용한 코드의 차이점은 리턴 타입이 List가 아니라 RowMapper로 변환해 주는 타입(Member)입니다.
주요 qureyForObject() 메서드
* T qureyForObject(String sql, Class <T> requiredType)
* T qureyForObject(String sql, Class<T> requiredType, Object... args)
* T qureyForObject(String sql, RowMapper <T> rowMapper)
* T qureyForObject(String sql, RowMapper<T> rowMapper, Object... args)
qureyForObject() 메서드를 사용하려면 쿼리 실행 결과는 반드시 한 행이어야만 합니다.
만약 쿼리 실행 결과 행이 없거나 두 개 이상이면 IncorrectResultSizeDataAccessException이 발생합니다.
행의 개수가 0이면 하위 클래스인 EmptyResultDataAccessException이 발생합니다.
따라서 결과 행이 정확히 한 개가 아니면 queryForObject() 메서드 대신 qurey() 메서드를 사용해야 합니다.
'Spring' 카테고리의 다른 글
[Spring] Spring DB - 쿼리 실행 테스트 (1) | 2024.02.25 |
---|---|
[Spring] Spring DB - 쿼리실행 (0) | 2024.02.21 |
[Spring] Spring JDBCTemplate 쿼리실행 (0) | 2024.02.19 |
[Spring] Spring DB 연동 - Tomcat JDBC의 프로퍼티 (0) | 2024.02.18 |
[Spring] Spring JDBC - DB 연결해보기 (1) | 2024.02.17 |