MyBatis Hierarchical Query
MyBatis 계층구조 질의 작성 예
boardRead.jsp
<s:url id="replyUrl" action="boardReply">
<s:param name="num">${board.num}</s:param>
</s:url>
<s:a href="%{replyUrl}"><input type="button" value="답글쓰기"></s:a>
struts.xml
<action name="Login" class="login.LoginAction" method="login">
<interceptor-ref name="prepare"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="params"/>
<result name="input">login/loginForm.jsp</result>
<result>login/loginForm.jsp</result>
</action>
<action name="boardInput" class="board.BoardAction" method="boardInput">
<interceptor-ref name="prepare"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="params"/>
<result>board/boardInputForm.jsp</result>
<result name="login" type="redirectAction">
<param name="actionName">Login</param>
<param name="namespace">/</param>
</result>
</action>
<action name="boardList" class="board.BoardAction" method="boardList">
<interceptor-ref name="params"/>
<result>board/boardList.jsp</result>
</action>
<action name="boardRead" class="board.BoardAction" method="boardRead">
<interceptor-ref name="params"/>
<result>board/boardRead.jsp</result>
<result name="login" type="redirectAction">
<param name="actionName">Login</param>
<param name="namespace">/</param>
</result>
</action>
<action name="boardModify" class="board.BoardAction" method="boardModify">
<interceptor-ref name="prepare"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="params"/>
<result>board/boardUpdateForm.jsp</result>
<result name="login" type="redirectAction">
<param name="actionName">Login</param>
<param name="namespace">/</param>
</result>
</action>
<action name="boardDelete" class="board.BoardAction" method="boardDelete">
<interceptor-ref name="params"/>
<result>board/boardRead.jsp</result>
<result name="login" type="redirectAction">
<param name="actionName">Login</param>
<param name="namespace">/</param>
</result>
</action>
<action name="boardReply" class="board.BoardAction" method="boardReply">
<interceptor-ref name="prepare"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="params"/>
<result name="input">board/boardReplyForm.jsp</result>
<result name="success">board/boardReplyForm.jsp</result>
<result name="login" type="redirectAction">
<param name="actionName">Login</param>
<param name="namespace">/</param>
</result>
</action>
BoardAction.java
public String boardReply() throws Exception {
BoardService service = new BoardService();
if(!service.isLogon()){
return LOGIN;
}
if(board==null || board.getSubject()==null){
return INPUT;
}
boolean saved = service.save(board);
if(saved) resultMsg = "saved";
return SUCCESS;
}
BoardMapper.xml
<select id="boardListPg" resultType="Board">
SELECT num, subject, writer, reg_date, pageNo, totalPages, totalCnt FROM
(
SELECT T1.*,
CEIL(ROWNUM/#{rowsPerPage}) AS pageNo,
CEIL(totalCnt/#{rowsPerPage}) AS totalPages FROM
(
SELECT num, ref, LPAD(' ', (LEVEL-1)*2, ' ')||DECODE(LEVEL,1,'','└')||subject as subject, writer, reg_date, totalCnt FROM
(
SELECT num, ref, subject, writer, reg_date, COUNT(*)OVER() AS totalCnt
FROM board
)
START WITH ref=0 CONNECT BY PRIOR num=ref
ORDER SIBLINGS BY num DESC
) T1
)
WHERE pageNo=#{pageNo}
</select>
위의 SQL 문장 중에서 LPAD(' ', (LEVEL-1)*2, ' ') 의 끝 부분에 있는 공백(적색으로 표시된 부분)은 키보드의 [스페이스] 키를 눌러 입력한 것이 아니고 특수문자인데, 입력하는 방법은 메모장을 실행하고 한글 'ㄱ' 을 입력한 후에 입력된 'ㄱ' 문자를 선택하고 [한자] 키를 눌러서 나타나는 첫번째 특수문자를 선택하면 된다. 이문자를 공백문자로 선택하면 메모장이나 웹브라우저에서 모두 공백으로 표시된다. 키보드에서 바로 입력하는 [스페이스] 문자는 웹브라우저에서 출력될 때 2개 이상의 공백은 효과가 없다.
└ --> 이 문자는 'ㅂ' 을 메모장에 입력하고 선택한 후, 한자 키를 눌러 나타나는 첫번째 문자를 사용한 것이다
위의 2개 문자를 사용하면 웹브라우저에서 들여쓰기 효과와 계층구조를 테스트할 때 유용하다.