물에 살고싶은 개발자

메모용 jdbcTemplate.query 본문

Spring Framework

메모용 jdbcTemplate.query

돼지사랑 2016. 7. 5. 15:32

jdbcTemplate.query()는 인자값으로


List<T> query( String sql , RowMapper<T> rowMapper )

List<T> query( String sql , Object[] args , RowMapper<T> rowMapper )

List<T> query( String sql , RowMapper<T> rowMapper , Object...args )


이렇게 정의되어있다.


복잡해보이지만 간단하게 얘기하자면


sql이 말그대로 쿼리문이다.

DBA에서 쓰는 "SELECT *FROM 테이블명 WHERE 조건" 따위의 쿼리문들을 String 형식으로 인자값을 보내는것이라고 생각하면 된다.


두번째 인자값인 RowMapper 라는 임의클래스는 즉 실질적으로 쿼리를 DB에 날려 결과로 되돌아온 데이터들을 실질적으로 리턴시키는 클래스라고 생각하면 쉽다.


두번째 혹은 세번째 인자값인 오브젝트가 쿼리문에서의 핵심이라면 핵심인 부분인데,


만약 첫번째 인자값인 쿼리문이 "SELECT *FROM 테이블명 WHERE email = ?" 이런 형태로 

?라는 녀석이 들어가 있을 경우 object가 저 물음표에 순서대로 들어가게 된다


즉 query( "SELECT *FROM 테이블명 WHERE email = ?" , RowMapper(생략){생략} , email )


이렇게 작성했을 경우 쿼리문이


"SELECT *FROM 테이블명 WHERE email = email" 이렇게 작성되서 날아간다고 생각하면된다.


그럼 저 쿼리문으로 인해 DB에서 날아온 결과가 RowMapper의 인자값인 ResultSet으로 들어가고 RowMapper의 임의클래스에서 리턴되는 값이 query함수의 실질적인 리턴값이 된다는것이다.


내가 보고있는 책에 있는 예제 코드를 쓰자면


List results = jdbcTemplate.query(
"select * from MEMBER where EMAIL = ?",
new RowMapper() {
    @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"));
        member.setId(rs.getLong("ID"));
        return member;
    }
},
email);


이 코드에서


첫번째 인자값인 쿼리문의 ? 에는 마지막 인자값인 email이 들어가 쿼리를 날리고

쿼리로 인해 돌아온 값이 public Member mapRow(ResultSet rs, int rowNum)의 

rs로 들어가는것이다.



기본적인 형태이고 해서 일단 기록해 둔다.

(사실은 내가 쓸때마다 헷갈려서 ;;)



코드출처 : 초보 웹 개발자를 위한 Spring 4 프로그래밍 입문 / 최범균 지음 / 가메출판사





Comments