DAY-82 myBatis 동적 쿼리 (if, trim)
💻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 부분에서 $를 사용한 이유
- #를 사용하면 ‘’ 으로 감싸지기 때문에 쿼리 실행이 안된다
- 동적 쿼리 사용을 위해서
- 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문이 실행된다면 내가 미리 설정해둔 문자열을 쿼리문에 동적으로 추가하거나 쿼리문에서 동적으로 삭제하는 것이 가능
- prefix 접두사 : 쿼리문 가장 앞쪽에다가 prefix 속성에 준 문자열을 붙여줄 수 있음.
- prefixOverrides 접두사 제거 : 쿼리문 가장 앞쪽에 있는 문자열을 제거해주는 속성
- suffix 접미사 : 쿼리문의 가장 뒤쪽에다 문자열을 붙여준다.
- suffixOverrides 접미사 제거 : 쿼리문 가장 뒤쪽의 문자열을 제거해주는 속성
Leave a comment