카테고리 없음

MyBatis Hierarchical Query

Soul-Learner 2014. 4. 4. 11:46

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개 문자를 사용하면 웹브라우저에서 들여쓰기 효과와 계층구조를 테스트할 때 유용하다.