본문 바로가기
개발자 전향 프로젝트

[마이바티스+오라클] 검색할 때 종종 막히는 바인딩 변수

by 샘오리 2022. 11. 7.
728x90
반응형

오라클 DB와 MyBatis 를 사용하면서 검색 로직을 구현하려고 하면

  • 어떻게 사용자가 입력한 값을 파라미터에 담아 매퍼에 넘기고 매퍼가 그걸 어떻게 받는지
  • 어떻게 대소문자 구분 없이 (Case Insensitive) 값을 찾게 설정하는지
  • 어떻게 파라미터를 포함하는 모든 값을 조회할 수 있게 % 를 넣을 수 있는지

요 3가지를 주로 고민하게 된다

오늘은 초보자들이 이러한 고민의 해답을

다른 블로그에서 찾기가 어려워서 이 글에서 쉽게 설명해볼까 한다.


먼저 컨트롤러에서 서비스로 제대로 호출했다고 가정하고 서비스는 아래와 같이 진행되어야 한다.

public List<DTO 이름> findBySearchValue(파라미터 타입 파라미터 이름) {

	// Map으로 파라미터를 담아서 보내주는 방법
    Map<데이터 타입(키), 데이터 타입(밸류)> 참조변수 = new HashMap<데이터 타입(키), 데이터 타입(밸류)>();
    param.put("파라미터 이름", 파라미터 이름);
    
    SqlSession sqlSession = CmmUtil.getSqlSession(false);
    List<DTO 이름> Sessionlist = sqlSession.selectList("매퍼명.ID", 참조변수);
    
    sqlSession.close();
    return Sessionlist;
}

아래는 BIND SYNTAX이다.

사용자가 입력한 값을 담은 파라미터가 pattern이라는 바인드 신택스에 담기게 되고 나중에 이 파라미터 값을 불러오고 싶을 때 이 pattern이라는 녀석만 잘 호출해주면 되는 것이다.

이 신택스는 재활용이 가능하며 커스터마이징도 용이하다.

<bind name="pattern" value="'%' + 파라미터 이름 + '%'" />

아래는 예시이다.

<mapper namespace="매퍼이름">

	<select id="ID명" parameterType="hashMap" resultType="DTO 경로">
        	<bind name="pattern" value="'%' + 파라미터 이름 + '%'" />
        	SELECT * FROM 테이블 이름 WHERE UPPER(칼럼명) LIKE UPPER(#{pattern})
	</select>

 

참고로 파라미터 타입이 위 예시에는 hashMap이었기 때문에 아래도 hashMap인 것이지 

사용자의 입맛에 따라 바뀔 수 있다.

 

그 말은 위 service의 예시 처럼 map을 사용하지 않아서 선언 및 초기화도 하지 않으며

매개변수를 받은 그대로 매퍼로 바로 넘겨 줄 수 있다는 것이다.

 

아래는 예시이다.

public List<DTO 이름> findBySearchValue(String 파라미터 이름) {
    SqlSession sqlSession = CmmUtil.getSqlSession(false);
    List<DTO 이름> Sessionlist = sqlSession.selectList("매퍼명.ID", 파라미터 이름);
    sqlSession.close();
    return Sessionlist;
}

아래 보이는 것 처럼 파라미터 타입이 String으로 설정된 것을 확인할 수 있다.

<mapper namespace="매퍼이름">

	<select id="ID명" parameterType="String" resultType="DTO 경로">
        	<bind name="pattern" value="'%' + 파라미터 이름 + '%'" />
        	SELECT * FROM 테이블 이름 WHERE UPPER(칼럼명) LIKE UPPER(#{pattern})
	</select>

 

728x90
반응형