2019. 8. 9. 23:07ㆍ카테고리 없음
마이 바티스로 1:N 관계의 테이블 처리
1 : N 관계의 테이블을 조회하는 방법으로 2개지 방법을 사용하고 있습니다.
첫 번째 방법은 RDBMS에 있는 outer JOIN을 사용하는 방법입니다. ( 자주 사용하는 방법 )
게시글을 조회하면서 해당 게시글에 포함되어 있는 파일들을 조회한다고 가정하면
<select id="selectBoard" resultMap="boardInfo">
select b.*,(select member_id from springmember m where b.member_no = m.member_no) member_id,f.* from (select * from springboard where board_no = #{boardNo}) b , springboardfile f where b.board_no = f.board_no(+)
</select>
<resultMap type="BoardWithReplyDTO" id="boardInfo">
<association property="board" javaType="BoardVO" autoMapping="true"/>
<collection property="files" javaType="FileVO" autoMapping="true"/>
</resultMap>
와 같은 방식으로 작성하면 됩니다.
association은 1에 해당하고
collection은 N에 해당합니다.
( 만약 해당 게시글 번호에 파일목록이 하나도 없다면 아무 결과도 출력되지 않기 때문에 inner join이 아닌 아우터 조인을 사용합니다. )
두 번째 방법
최근에 알게 된 기능입니다. 이미 작업한 결과가 있을 때 새로운 기능을 추가하거나 변경할 때 유용할 거 같습니다.
저 같은 경우는 게시판 작업이 끝난 후 남는 시간을 활용해서 파일 업로드 기능을 추가했습니다.
그래서 기존에 게시글을 조회했던 마이 바티스 select문이 이미 있었기 때문에
해당 코드를 건들지 않고 게시글을 조회하면서 해당 게시글의 파일목록도 같이 조회할 수 있도록 할 때 유용하게 사용했습니다.
<select id="selectBoard" resultMap="boardInfo">
select b.*,(select member_id from springmember m where b.member_no = m.member_no) member_id from springboard b where board_no = #{boardNo}
</select>
<resultMap type="BoardWithReplyDTO" id="boardInfo">
<association property="board" javaType="BoardVO" autoMapping="true"/>
<collection property="files" column="board_No" javaType="ArrayList" ofType="FileVO" select="selectFiles"/>
</resultMap>
<select id="selectFiles" resultType="FileVO">
select * from springboardfile where board_no = #{boardNo}
</select>
기존에 게시글을 조회했던 selectBoard라는 select문이 이미 있었던 상황에서 파일 첨부 기능을 추가하면서
게시글을 조회할 때 파일목록도 같이 조회해야 했습니다.
collection에 있는 select기능을 사용해서 먼저 selectBoard를 호출한 후 resultMap에 담을 때 방금 조회한 컬럼을 사용해서 selectFiles라는 쿼리문을 새로 호출할 수 있습니다.
private List<FileVO> files; 라는 변수에 담는 과정입니다.
마무리
게시판 프로젝트 최종 깃허브 주소