queryForObject 의 반환형은 데이터형만 가능하다.
하지만 말이 안되는게 있다
select * from user 구문으로 user 객체 자체를 반환받는건 포기해야 되나 ?
그걸 위해서 필요한 것이 바로 RowMapper 인터페이스이다.
1. RowMapper 란?
원하는 형태의 결과값을 반환할 수 있다.
SELECT로 나온 여러개의 값을 반환할 수 있을 뿐만 아니라 사용자가 원하는 형태로도 얼마든지 받을 수 있다.
즉 다음과 같이 가능하다는 것이다.
// UserMapper로 인해, User 형태로 반환 가능
List<User> userList = jdbcTemplate.queryForObject(
"SELECT * FROM USER WHERE id=?",
UserMapper,
1000L);
2. 과거로
우리가 순수 JDBC를 배울땐 이런 고민을 하지 않았는데
왜일까
그 이유는 우린 결과값을 ResultSet으로 반환 받았기 때문이다.
// 쿼리 날리기
ResultSet rs = stat.excuteQuery("SELECT * FROM USER");
// 결과값 가져오기
while(rs.next()) {
// user 객체에 값 저장
user = new User();
user.setId(rs.getInt(1));
user.setName(rs.getString(2));
user.setDescription(rs.getString(3));
// 리스트에 추가
userList.add(user);
}
아무런 생각없이 사용했지만 사실
ResultSet으로 먼저 값을 받고
그다음 User 객체에 담아서
반환하였다
이 3계단를 거쳤던 것이다.
그렇기 때문에 아무 고민없이 결과값을 받을 수 있었다.
3. RowMapper 사용법
RowMapper 의 mapRow메소드는 이러한 ResultSet를 사용한다.
사용법은
??? mapRow(ResultSet rs , int count)
ResultSet에 값을 담아와서 User 객체에 저장한다.
그리고 그것을 count만큼 반복한다는 뜻이다.
(반환형은 뭔지 잘 모르겠다. 확인해봐야겠지만 아마 List가 아닐까 싶다)
위에 것을 실제로 작성해보면
public User mapRow(ResultSet rs, int count) throws SQLException {
// ResultSet 값을 User 객체에 저장
User user = new User();
actor.setFirstName(resultSet.getString("name"));
actor.setLastName(resultSet.getString("description"));
// user 반환
return user;
};
count는 알아서 세어준다 작성할 필요없다
저것을 좀더 깔끔하게 람다식으로 작성할수있다.
(rs, count) -> new User(
rs.getString("name"),
rs.getString("description")
)
3. 향상된 queryForObject
우린 User 클래스도 반환 받을 수 있다.
// select 구문
String SELECT_BY_ID = "SELECT * FROM USER WHERE id=?";
// user 반환 받기
User user = jdbcTemplate.queryForObject(
SELECT_BY_ID,
(rs, count) -> new User(
rs.getString("name"),
rs.getString("description")
),
1000L);
짠~ : )
'BACKEND > 스프링 Spring' 카테고리의 다른 글
[spring3.0] 스프링3.0게시판 스프링 JDBC로 변경하기 (0) | 2022.03.29 |
---|---|
[spring3.0] 스프링3.0 과 마이바티스를 이용하여 게시판 만들기 (0) | 2022.03.29 |
[spring3.0] 롬 복(loombok) (0) | 2022.03.28 |
[spring3.0] AOP (0) | 2022.03.28 |
[spring3.0] 의존성주입 DI 어노테이션 GET,POST 방식 (0) | 2022.03.24 |