본문 바로가기

Back-end/JAVA

Mybatis Mapper XML <select> 정리

Mybatis Mapper XML <select> 알짜만 빼먹기

<select> 구분은 데이터를 조회 때 사용하는 구문입니다.

<select> 와 </select> 내에 SELECT QUERY를 작성하면 됩니다.

 

<select>
    SELECT * FROM DUAL
<select>

 

<select> 태그 내에는 몇가지 속성값들이 존재합니다.

id는 기본 태그로 Mapper와 xml 구문을 연결해주죠. 그럼 속성에 대해 알아보겠습니다.

 

속성 설명
id 구문을 찾기위한 유일한 구분자
parameterType 구문에 전달되는 파라메터의 alias나 풀 클래스명
resultType 구문의 결과를 받을 alias나 풀 클래스명
resultMap resultType과 다르게 xml 내 선언해서 사용하는 커스텀 맵
flushCache 기본값은 false, true 설정 시 로컬 및 2nd 캐쉬가 삭제된다.
useCache 기본값은 true, 로컬 및 2nd 캐쉬 사용
timeout 최대 대기시간 설정, 드라이버에서 따라 지원이 되지 않을 수 있음.
fetchSize 지정된 수만큼 결과를 리턴할 떄 사용. 드라이버에 따라 지원하지 않을 수 있음.
statementType STATEMENT, PREPARED 또는 CALLABLE 중 하나를 선택할 수 있다. 마이바티스에게 Statement, PreparedStatement 또는 CallableStatement를 사용하게 한다. 디폴트는 PREPARED이다.
resultSetType FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE|DEFAULT(same as unset)중 하나를 선택할 수 있다. 드라이버에 따라 지원하지 않을 수 있음.
databaseId 설정된 databaseIdProvider가 있는 경우 마이바티스는 databaseId 속성이 없는 모든 구문을 로드하거나 일치하는 databaseId와 함께 로드될 것이다. 같은 구문에서 databaseId가 있거나 없는 경우 모두 있다면 뒤에 나온 것이 무시된다.
resultOrdered 기본은 false, 이 설정은 내포된 결과를 조회하는 구문에서만 적용이 가능하다. true로 설정하면 내포된 결과를 가져오거나 새로운 주요 결과 레코드를 리턴할때 함께 가져오도록 한다. 이전의 결과 레코드에 대한 참조는 더 이상 발생하지 않는다. 이 설정은 내포된 결과를 처리할때 조금 더 많은 메모리를 채운다.
parameterMap 외부 파라미터 맵을 찾기위한 접근방법. 비권장. parameterType 사용을 권장.

 

보통의 경우 id와 resultType, parameterMap을 사용하고, 특수한 경우 위의 옵션들을 사용합니다.

resultType, parameterType의 경우 클래스의 alias나 풀 패키지를 포함한 클래스명으로 설정하고, 변수의 기본형으로도 사용할 수 있습니다.

 

<select id="getDate" resultType="java.lang.String" parameterType="java.lang.String">
    SELECT id
     FROM MEMBER 
    WHERE id = #{id}
<select>
 

resultType은 SELECT 구문의 id 값의 타입, parameterType은 매개변수로 전달되는 #{id}의 타입을 말합니다.

 

여기서 주의 하셔야 할 것이 있는데요, parameterType을 기본형으로 사용 시 다이나믹쿼리의 태그 내에서는 접근이 되지 않습니다.

 

예를 들어,

 

<select id="getDate" resultType="java.lang.String" parameterType="java.lang.String">
    SELECT id
     FROM MEMBER 
    <if test="id!=null and id!=''">
        WHERE id = ${id}
    </if>
<select>

 

위와 같이 <if> 태그를 사용하여 id 값에 접근하려 하지만, 이는 에러가 발생합니다.

 

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: 

There is no getter for property named 'id' in 'class java.lang.String'

 

java.lang.String 클래스에 id 속성을 위한 getter가 없다. 라는 말인데요, 기본적으로 Mybatis는 접근과 설정에 getter, setter 메소드를 사용하기 떄문에 java.lang.String에 getId 메소드가 없어 에러가 나는 것 입니다.

 

이럴 경우에는 단순히 #{value}를 사용하여 파라메터를 전달 할 수 있습니다.

 

<select id="getId" resultType="java.lang.String" parameterType="java.lang.String">
    SELECT id
     FROM MEMBER 
    <if test="value!=null and value!=''">
        WHERE id = #{value}
    </if>
<select>

 

Mybatis 동적태그에 대한 내용은 아래의 Link를 참고하세요.

 

Link : iBatis, myBatis 동적 태그 비교 정리 Dynamic SQL

출처: https://aljjabaegi.tistory.com/457 [알짜배기 프로그래머:티스토리]

'Back-end > JAVA' 카테고리의 다른 글

JAVA Annotation 정리  (0) 2022.09.05
JSP 게시판 만들기 - 3  (0) 2022.08.22
JSP 게시판 만들기 - 2  (0) 2022.08.20
JSP 게시판 만들기 - 1  (0) 2022.08.20
Spring Bean Scopes and Lifecycle 정리  (0) 2020.11.25