ibatis # $차이 동적 테이블, 동적 컬럼을 사용해보자.
ibatis # $차이 동적 테이블, 동적 컬럼을 사용해보자.
개발을 하다보면 같은 쿼리문인데 컬럼이나 테이블명만 다른 경우가 있다.
이럴때 동적으로 컬럼과 테이블만 매핑해주면
쿼리의 양을 줄일 수 있다.
그럼 그 사용방법을 알아보자.
보통 iBatis를 활용해 값을 바인딩 할때 #value# 를 사용했을 것이다.
예를 들면
SELECT *
FROM TABLE1
WHERE COLUME1 = #value#
이런식으로.
위와 같이 #을 사용하면
SELECT *
FROM TABLE1
WHERE COLUME1 = ?
와 같은 쿼리의 ? 에 해당 #value# 값이 바인딩 되는 것이다.
테이블이나 컬럼위치에 값을 바인딩해서 사용하면
SELECT #COLUME1#
FROM TABLE1
java.sql.SQLException: ORA-01747: 열명을 올바르게 지정해 주십시오
위와 같은 에러를 보게 될 것이다.
이를 해결하기 위해 사용하는 것이 $ 이다.
위의 예에서 #만 $으로 바꾸어 사용하게 되면
SELECT $COLUME1$
FROM TABLE1
원하는 값이 나오게 된다.
table도 마찮가지 이다.
SELECT COLUME1
FROM $TABLE1$
이렇게 $를 사용하면 직접 그 값을 불러와 사용할 수 있다.
하지만 여기에도 주의점이 있다. 여러군데서 동적으로 쿼리문을 사용할 경우
iBatis 에 저장된 캐쉬에 의해 자꾸 전에 사용된 컬럼이나 테이블 값이 매핑된다.
이전 테이블에서 사용한 키나 테이블이 매핑이 되니 오류는 자연스럽게 발생한다.
java.sql.SQLException: 부적합한 열 이름
이를 해결하는 옵션이 remapResults="true" 이다.
<select id="CmmnDao.getMaxId" remapResults="true" parameterClass="searchVO" resultClass="java.lang.String">
SELECT MAX(T1.$keyName$) KEEP(DENSE_RANK FIRST ORDER BY REG_DTM DESC)
FROM $tableName$ T1
</select>
위와 같이 사용하면 동적 테이블이나 컬럼을 활용할 수 있다.
위의 예에서 사용된 Oracle KEEP() 함수의 사용법은 아래의 Link를 참조한다.
Link : Oracle 오라클 KEEP()함수 사용법 그룹함수로 조회한 행 중에 다른 컬럼 가져오는 방법