DAY-82 myBatis 동적 쿼리 (if, trim)

2 minute read

💻2022-06-30

❗ 수업을 듣고, 개인이 공부한 내용을 적은 것 이기에 오류가 많을 수도 있음

1️⃣ keyword 검색

<!-- search1 -->
<select id="search1" parameterType="String" resultType="kh.message.dto.MessageDTO">
	select * from msg where nickname = #{nickname}
</select>
  • 해당 코드는 keyword가 정확히 일치해야만 검색이 된다.
<!-- search1 -->
<select id="search1" parameterType="String" resultType="kh.message.dto.MessageDTO">
	select * from msg where nickname like '%' || #{keyword} || '%'
</select>
  • 한 글자라도 같으면 출력

2️⃣ select를 활용해 결과값 얻어오기

outputList.jsp

HomeController

MessageService

MessageDAO

  • selectList는 두개의 인자만 받기 때문에 key와 value로 얻어 올 수 있는 Map을 이용한다.

message-mapper

<!-- if test 조건문 안에는 dao에서 넘겨주는 변수명/키값을 그대로 사용함. -->
<!-- search2 -->
<select id="search2" parameterType="map" resultType="kh.message.dto.MessageDTO">
	select * from msg where
		<if test="category == 'all'">
			select * from msg where no like '%' || #{keyword} || '%'
			or nickname like '%' || #{keyword} || '%'
			or message  like '%' || #{keyword} || '%'
		</if>
		<if test="category != 'all'">
			${category} like '%' || #{keyword} || '%'
		</if>
</select>
  • parameterType은 map이 된다.
  • category 부분에서 $를 사용한 이유
    1. #를 사용하면 ‘’ 으로 감싸지기 때문에 쿼리 실행이 안된다
    2. 동적 쿼리 사용을 위해서
  • category가 all이 들어오면 쿼리 실행 (테이블에는 all이라는 컬럼이 없기 때문에 조건문으로 여러개의 쿼리를 실행시켜서 결과를 받아야 한다)
  • all이 아니라면 category로 들어오는 값에 따라 쿼리 실행

3️⃣ 체크박스를 활용해 결과값 얻어오기

outputList.jsp

message-mapper.xml

<!-- mybatis에서 문자열 빈값 여부 비교할때는 != null 그리고 '' 모두 크로스체크 해야함(둘다 해야함) -->
<!-- search3 -->
<select id="search3" parameterType="map" resultType="kh.message.dto.MessageDTO">
	select * from msg where
	<trim prefixOverrides="or"> <!-- or가 써있으면 없애준다 -->
		<!-- 전체 선택으로 들어왔을 경우 -->
		<if test="no != null and no != ''"> <!-- 번호를 체크  경우 -->
			no like '%' || #{keyword} || '%'
		</if>
		<if test="nickname != null and nickname != ''"> <!-- 닉네임 체크  경우 -->
			or nickname like '%' || #{keyword} || '%'
		</if>
		<if test="message != null and message != ''"> <!-- 메세지 체크  경우 -->
			or message like '%' || #{keyword} || '%'
		</if>
	</trim>
</select>
  • mybatis에서 문자열 빈값 여부 비교할때는 != null 그리고 ‘ ‘를 모두 크로스 체크 해야함(둘 다 해야함)
  • trim을 사용한 이유는 전체 조회가 아닌 하나씩 조회가 될 때도 사용되어야 하기 때문에 trim으로 조건을 준것
  • prefix와 prefixOverrides가 함께 존재한다면 prefixOverrides가 먼저 실행된다.

🔔 trim 태그

  • trim 태그 안쪽의 if문이 true라고 한다면 trim이 실행되고 false라고 한다면 실행 x
  • 안쪽의 if문이 실행된다면 내가 미리 설정해둔 문자열을 쿼리문에 동적으로 추가하거나 쿼리문에서 동적으로 삭제하는 것이 가능
  1. prefix 접두사 : 쿼리문 가장 앞쪽에다가 prefix 속성에 준 문자열을 붙여줄 수 있음.
  2. prefixOverrides 접두사 제거 : 쿼리문 가장 앞쪽에 있는 문자열을 제거해주는 속성
  3. suffix 접미사 : 쿼리문의 가장 뒤쪽에다 문자열을 붙여준다.
  4. suffixOverrides 접미사 제거 : 쿼리문 가장 뒤쪽의 문자열을 제거해주는 속성

Categories:

Updated:

Leave a comment