Paging 2
쿼리문을 boardQuery.xml에 적용해야지.
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> <sqlMap> <!-- resultClass,parameterClass에 매번 "board.model.BoardDto"쓰기 귀찮아 --> <typeAlias alias="boardDto" type= "board.model.BoardDto"/> <cacheModel id="boardcache" type="LRU"> <!-- LRU알고리즘사용 --> <flushInterval hours="24" /> <!-- 기존의 cache를 24시간 유지 --> <property name="reference-type" value="WEAK" /> <!-- 데이터가 변경 될 경우 메모리를 비우겠다 --> <flushOnExecute statement="insertBoard" /> <flushOnExecute statement="updateBoard" /> <flushOnExecute statement="deleteBoard" /> </cacheModel> <select id="getList" resultClass="boardDto" cacheModel="boardcache"> <![CDATA[ SELECT A.* FROM ( SELECT ROWNUM AS rnum, seq, title, name, TO_CHAR(writeday,'YYYY/MM/DD') AS writeday, readcount FROM board ORDER BY seq DESC) A WHERE #startRow# <= rnum AND rnum <= #endRow# ]]> </select> <insert id="insertBoard" parameterClass="boardDto" > INSERT INTO board(seq, title, name, password, content) VALUES(boardseq.nextval, #title#,#name#, #password#, #content#) <!-- #name# : iBatis에서 자체적으로 getter를 호출하는거야 --> <!-- 주의! 쿼리문 마지막에 ';'넣으면 에러남 --> </insert> <select id="getView" resultClass="boardDto" parameterClass="int"> SELECT seq, title, name, writeday, readcount, content FROM board WHERE seq = #seq# </select> <update id="updateBoard" parameterClass="boardDto" > UPDATE board SET title=#title#, name=#name#, content=#content# WHERE seq=#seq# AND password=#password# </update> <update id="updateReadCount" parameterClass="int" > UPDATE board SET readcount = readcount+1 WHERE seq = #seq# </update> <delete id="deleteBoard" parameterClass="boardDto"> DELETE FROM board WHERE seq=#seq# AND password=#password# </delete> <select id="isView" parameterClass="int" resultClass="int"> <![CDATA[ SELECT count(*) FROM board WHERE seq=#seq# ]]> </select> </sqlMap>
iBatis에서 두개 이상의 값을 넘길 때는 클래스에 집어넣으랬잖아. startRow, endRow넘기기 위한 Page class 만들어
package ibatis; public class Page { private int startRow; //실전에선 long으로 바꾸는게 낫겠지. private int endRow; public int getStartRow() { return startRow; } public void setStartRow(int startRow) { this.startRow = startRow; } public int getEndRow() { return endRow; } public void setEndRow(int endRow) { this.endRow = endRow; } }
BoardAction클래스 Paging 기능 구현
get방식으로 받아 온 pg로 startRow, endRow생성 후 board.getList에 넘겨줘.
package controller; import ibatis.Page; import java.util.List; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; import board.model.BoardDao; import board.model.BoardDto; @Controller public class BoardAction { private BoardDao boardDao; public void setBoardDao(BoardDao boardDao) { this.boardDao = boardDao; } @RequestMapping("BoardList.do") public ModelAndView boardList(@RequestParam(value="pg", defaultValue="1") int pg) { //get방식으로 넘겨받기. pg값이 안넘어오면 에러가 나는것을 //전에는 request.getParameter로 받아서 값이 안넘어오면 처리하는 부분을 구현했지만 //이제 이렇게 defaultValue를 이용해서 간단하게 처리할 수도 있어. //Page구현 int pageSize = 10; int startRow = (pg-1)*pageSize + 1; int endRow = pg*pageSize; //iBatis에서 두개 이상의 값을 넘길 때는 클래스에 집어넣으라고 했지. //그래서 만든게 Page클래스야 Page p = new Page(); p.setStartRow(startRow); p.setEndRow(endRow); List<BoardDto> list = boardDao.getList(p); ModelAndView mav = new ModelAndView(); mav.setViewName("view/list"); mav.addObject("list", list); return mav; } /* 생략 */
연쇄적으로 BoardDao, QueryHandler, boardQuery.xml(parameterClass추가)까지 수정
package board.model; import ibatis.Page; import ibatis.QueryHandler; import java.sql.SQLException; import java.util.List; public class BoardDao { public boolean insertBoard(BoardDto boardDto) { try { QueryHandler.insertBoard(boardDto); // insert는 에러나면 예외처리로 빠지겠지. return true; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } } public List<BoardDto> getList(Page p) { try { return QueryHandler.getList(p); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } /* 생략 */
package ibatis; import java.io.IOException; import java.io.Reader; import java.sql.SQLException; import java.util.List; import user.model.UserDto; import board.model.BoardDto; import com.ibatis.common.resources.Resources; import com.ibatis.sqlmap.client.SqlMapClient; import com.ibatis.sqlmap.client.SqlMapClientBuilder; public class QueryHandler { private static SqlMapClient sqlMapper; static { try { Reader reader = Resources .getResourceAsReader("ibatis/SqlMapConfig.xml"); // 파일스트림으로 파일을 읽어 저장하고있어. sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader); // 자원을 파싱해서 sqlMapper가 가지고 있어. reader.close(); } catch (IOException e) { // Fail fast. throw new RuntimeException( "Something bad happened while building the SqlMapClient instance." + e, e); } } @SuppressWarnings("unchecked") public static List<BoardDto> getList(Page p) throws SQLException { // TODO Auto-generated method stub return sqlMapper.queryForList("getList", p); // select는 queryForList } public static void insertBoard(BoardDto boardDto) throws SQLException { // TODO Auto-generated method stub sqlMapper.insert("insertBoard", boardDto); } /* 생략 */
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> <sqlMap> <!-- resultClass,parameterClass에 매번 "board.model.BoardDto"쓰기 귀찮아 --> <typeAlias alias="boardDto" type= "board.model.BoardDto"/> <cacheModel id="boardcache" type="LRU"> <!-- LRU알고리즘사용 --> <flushInterval hours="24" /> <!-- 기존의 cache를 24시간 유지 --> <property name="reference-type" value="WEAK" /> <!-- 데이터가 변경 될 경우 메모리를 비우겠다 --> <flushOnExecute statement="insertBoard" /> <flushOnExecute statement="updateBoard" /> <flushOnExecute statement="deleteBoard" /> </cacheModel> <select id="getList" parameterClass="ibatis.Page" resultClass="boardDto" cacheModel="boardcache"> <![CDATA[ SELECT A.* FROM ( SELECT ROWNUM AS rnum, seq, title, name, TO_CHAR(writeday,'YYYY/MM/DD') AS writeday, readcount FROM board ORDER BY seq DESC) A WHERE #startRow# <= rnum AND rnum <= #endRow# ]]> </select> <insert id="insertBoard" parameterClass="boardDto" > INSERT INTO board(seq, title, name, password, content) VALUES(boardseq.nextval, #title#,#name#, #password#, #content#) <!-- #name# : iBatis에서 자체적으로 getter를 호출하는거야 --> <!-- 주의! 쿼리문 마지막에 ';'넣으면 에러남 --> </insert> <!-- 생략 -->
http://localhost/spring3ibatisboard/BoardList.do
http://localhost/spring3ibatisboard/BoardList..do?pg=3
http://localhost/spring3ibatisboard/BoardList..do?pg=40
이런 식으로 테스트해 볼 수 있다.
.
.
.
.
.
'Java, Spring > 20일' 카테고리의 다른 글
20일차 2 (0) | 2012.09.20 |
---|