검색 할때는 특정 키워드를 입력 시 게시판에 있는 그 키워드에 맞게 나와야 한다.
그전에 먼저 알아야 할 동적 태그들이 있다 (MyBatis)
if
<if test="key == 'T'.toString()">
title like #{val}
</if>
test에 조건을 쓰고 그 조건이 true일 때.. 출력 (key가 T면 title lie #{val})
trim
<trim prefix="(" suffix=") AND">
<foreach collection="typeArr" item="type" separator="OR">
<if test="type == 'T'.toString()">
title like '%'||#{keyword}||'%'
</if>
trim은 단독으로 절대 사용안한다. if나 forEach,choose랑 같이 쓰인다.
prefix :: 쿼리 가장 앞에 붙여준다.
그러면 suffix는? -> 가장 뒤에 붙여준다.
trim 밑에 foreach는 리스트나 맵 배열 등 루프를 돌 때 사용
collection :: 전달받은 인자, 리스트나 배열 형태만 가능
item :: 배열은 키가 필요하지 않고 item에 별칭 즉 루프돌때 쓸 변수명 쓰기
separator :: 반복 되는 사이에 출력할 문자열 ( 루프돌 때마다 OR 붙이기)
<sql id="criteria">
<trim prefix="(" suffix=") AND">
<foreach collection="typeArr" item="type" separator="OR">
<if test="type == 'T'.toString()">
title like '%'||#{keyword}||'%'
</if>
<if test="type == 'C'.toString()">
content like '%'||#{keyword}||'%'
</if>
<if test="type == 'W'.toString()">
writer like '%'||#{keyword}||'%'
</if>
</foreach>
</trim>
</sql>
그렇게 해서 BoardMapper.xml에 SQL 검색 구문은 다음과 같은데
여기서 제일 위에 있는 sql태그 좀 생소한데
조각이라고 하는거 같다.
sql 태그 안에 검색 구문을 넣고
기존 검색 구문 자리에
<include refid="criteria"></include>
써주면 조각이 불러온다.
이러면 코드가 간결해지고 중복되는 쿼리는 좀 더 편해진다.
태그 정리를 하다보니 먼저 해야하는데 깜빡했다.
Criteria.java
private String type;
private String keyword;
여기서 중요한게 String타입이다 하지만 forEach로 돌릴려면 배열이나 리스트,맵,셋 으로 해야 하는데...
어떻게 해야할까?
public String[] getTypeArr() {
return type == null? new String[] {}: type.split("");
String[] 타입에 getTypeArr() 추가하면 해결 된다. (검색조건은 한글자)
split :: 문자열 자르기
'Back-End > Spring' 카테고리의 다른 글
[Spring] 댓글 구현 (0) | 2021.08.29 |
---|---|
[Spring] 검색 화면 처리 (0) | 2021.08.11 |
[Spring] 페이징 처리 및 번호 출력 (0) | 2021.08.06 |
[Spring] 인덱스,힌트와 ROWNM (0) | 2021.08.05 |
[Spring] 조회 처리 및 페이지 이동 (0) | 2021.08.04 |