티스토리 뷰

[JAVA]/Mybatis

[Mybatis] Dynamic SQL

춘햄 2021. 6. 30. 10:05

이전에 실습했던 글 목록을 불러오는 코드의 경우, 다음과 같이 검색할 내용에 따라 Controller 에서 if 문을 통해 값을 따로 저장받는 코드가 존재했었다. 

 

◎Controller

@RequestMapping(value="/getBoardList.do")
	public String getBoardList(BoardVO vo, Model model) {
		System.out.println("글 목록 검색 처리");

		// null Check
		if(vo.getSearchCondition() == null){
			vo.setSearchCondition("TITLE");
		}
		if(vo.getSearchKeyword() == null){
			vo.setSearchKeyword("");
		}
		
		//Model 정보 저장
		model.addAttribute("boardList", boardService.getBoardList(vo));
		return "getBoardList.jsp";
	}	

이후 searchKeyword 변수의 값에 따라 Mapping.xml 에서 select 문을 다음과 같이 따로 분기하여 실행했다.

 

◎DAO

public List<BoardVO> getBoardList(BoardVO vo) {
		if(vo.getSearchCondition().equals("TITLE")){
			return mybatis.selectList("BoardDAO.getBoardList_T", vo);
		} else if(vo.getSearchCondition().equals("CONTENT")){
			return mybatis.selectList("BoardDAO.getBoardList_C", vo);
		}
		return null;
	}

◎mapping.xml

<select id = "getBoardList_T" resultMap = "boardResult">
  <![CDATA[
  	SELECT * FROM BOARD WHERE TITLE LIKE '%' || #{searchKeyword}||'%' ORDER BY SEQ DESC
  ]]>
</select>

<select id = "getBoardList_C" resultMap = "boardResult">
  <![CDATA[
 	 SELECT * FROM BOARD WHERE CONTENT LIKE '%' || #{searchKeyword}||'%' ORDER BY SEQ DESC
  ]]>
</select>

그런데 이런 식으로 코드를 작성할 경우, 검색 조건이 많아지면 작성해야 할 select 문도 많아지고, 그럼 개발이나 유지보수 측면에서 번거로울 수 밖에 없다. 

 

Mybatis는 이런 번거로움을 줄일 수 있는 DynamicSQL 기능을 다음과 같이 사용할 수 있도록 지원한다.

 


▷Dynamic  SQL 사용 후

 

◎DAO

public List<BoardVO> getBoardList(BoardVO vo) {
	return mybatis.selectList("BoardDAO.getBoardList", vo);
}

 

◎mapping.xml

<select id="getBoardList" resultMap="boardResult">
  SELECT * FROM BOARD
  <if test = "searchCondition == 'TITLE'">
    <![CDATA[
    	WHERE TITLE LIKE '%'||#{searchKeyword}||'%'
    ]]>
  </if>
  <if test = "searchCondition == 'CONTENT'">
    <![CDATA[
    	WHERE CONTENT LIKE '%'||#{searchKeyword}||'%'
    ]]>
  </if>
  <if test = "searchCondition == 'WRITER'">
    <![CDATA[
    	WHERE  WRITER LIKE '%'||#{searchKeyword}||'%'
    ]]>
  </if>
  ORDER BY SEQ DESC
</select>

위와 같이 mapping 파일 내에서 조건문을 사용할 수 있다.

 

'[JAVA] > Mybatis' 카테고리의 다른 글

[Mybatis] SQL 쿼리문을 실행하는 두가지 방법  (0) 2021.07.01
[Mybatis] JavaORM plugin  (0) 2021.06.30
[Spring] Mybatis 사용  (0) 2021.06.29
[Mybatis] Mapper Elements  (0) 2021.06.29
[Mybatis] Mybatis 프레임워크 기초  (0) 2021.06.29
Comments