티스토리 뷰


Spring JDBC Template - Query statement


API 읽기를 생활 화 하세요!! ( 나도 영어 못해.. )


http://docs.spring.io/spring/docs/3.2.9.BUILD-SNAPSHOT/javadoc-api/


1. QueryForInt - 쿼리를 통해 수치 값을 반환 받을 때 사용





















게시판 DB에서 게시판 글의 글의 개수를 가져오는 쿼리입니다. (오타...board = bbs)

위 소스는 자바에서 사용했던 것인데 직접 Connection을 구현하고, Connection 을 통해서

쿼리를 날리고 그 결과 값을 rs에 저장하여, rs의 저장된 값을 리턴하는 형태 입니다.

리턴하는 소스 외에도, close() 와 예외 처리 등의 소스코드가 더 추가 됩니다.


스프링에서 jdbcTemplate을 사용해서, 쿼리를 날리면 스프링 자체에서 예외 처리도 진행하고, 쿼리도 위와 같이 간결하게 사용할 수 있습니다.


2. query


복수의 레코드를 읽어 오기 위해서 API 의 query 중 하나를 사용해 보겠습니다.






저는 지금 게시판에서 글을 읽어오기 위해 쿼리를 사용할 것 입니다.



jdbcTemplate.query(...) 문의 리턴 값은 List 입니다. 원래 소스를 List 로 변경해도 되지만

귀차니즘이 발동하였으므로, List 를 부모로 갖는 ArrayList 로 DownCasting 하여 사용하겠습니다.  ;) - 문제가 있었으면 List로 바꾸었겟죠!?


여기서 query 의 세 번째 인수는 RowMapper 입니다!! API를 꼭 읽어 보세요

RowMapper 인터페이스는 mapRow(ResultSet rs, int rowNum) 함수를 하나 가지고 있습니다. 스프링에서 자동으로 쿼리를 통해 레코드의 개수를 파악하여, 반복하여 List에 저장한답니다!! ( 오오 신세계!!!! ) 기존의 사용하던 소스에 비해 대폭 라인의 수가 줄어듭니다!!


RowMapper 를 Implements한 클래스 를 보여드리겠습니다!!



ResultSet을 직접 구현하여서 하나하나 대입하여 넣었던 문과 별 다르지 않지만,

인수로 사용하기 위해서 RowMapper로 확장하여 사용한 것 입니다. 

스프링의 똑똑한 처리를 사용하기 위해서 번거롭더라도 Class를 따로 만드는 것이 좋습니다. 직접 query의 인수 자리에 위 소스를 모두 입력해도 되지만, 가독성을 위해 추천하지 않습니다.


쿼리로 넘어 올 때 필요한 값에 따라서 RowMapper를 작성하면 성능에 좋습니다.

예를 들어, 목록, 자세한 내용, 수정, 답글 용 등등 DB에서 가져오는 테이블은 같지만

필요로 하는 속성들이 조금씩 다르기 때문에 이에 따른 RowMapper를 따로 작성해주시면 좋습니다. RowMapperForList, RowMapperForContent ...


3. queryForObject - 문자열이나 날짜 형을 반환 받을 때



 인수의 첫째 값은 쿼리, 둘째는 리턴 타입, 셋째 는 ? 에 심을 값입니다.


4. queryForList 



 List 의 형태로 레코드의 정보를 읽어옵니다. 

 조건에 따라 여러 값이 List 형태로 반환 될 수 있습니다.


국가 공공 기간에서는 JDBC Template 을 사용하지 않습니다. 실무에서는 Mybatis를 사용하지요.

Mybatis 를 사용하면 JDBC Template 을 쓰지 않아요~!


댓글