TODAY TOTAL
[Spring] 검색 처리

 

검색 할때는 특정 키워드를 입력 시 게시판에 있는 그  키워드에 맞게 나와야 한다.

 

그전에 먼저 알아야 할 동적 태그들이 있다 (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
  Comments,     Trackbacks