<isEqual property="pageType" compareValue="base">
SELECT B_ID||'@'||XML FROM IBS_BASE_MASTER WHERE CODE_ID = #id#
</isEqual>
<isEqual property="pageType" compareValue="space">
SELECT S_ID||'@'||XML FROM IBS_SPACE_MASTER WHERE S_ID = #id#
</isEqual>
<isEqual property="pageType" compareValue="device">
SELECT D_ID||'@'||XML FROM IBS_DEVICE_MASTER WHERE D_ID = #id#
</isEqual>
</select>
iBatis를 사용해서 쿼리작업을 하면 아래와같은 장점이 있다.
1. xml로 sql을 관리하므로 가독성이 높아진다.
2. db연결 정보도 conf로 관리하므로 수정하기 쉬워지며
3. 그래서 코드내에서 여러개의 db에 선택적으로 접근하기도 수월하다.(테스트/실장비 자유롭게 왔다갔다~)
4.ORMap을 해주기때문에 결과를 가져올때도 사용하기가 쉽다.
ibatis는 최초 쿼리를 조회 한후 조회 결과의 메타(Meta Data- 컬럼리스트, 테이블명)를 캐쉬에 저장하여 놓아
다음 동일 쿼리 호출시 해당 컬럼으로 데이타 결과를 보여 주어 성능 향상을 꾀하고 있다. 그러나 동적쿼리 사용시 문제가 발생 할 수 있다.
예) 정적: select a, b, c from 테이블명;
동적: select $컬럼목록변수$ from 테이블명;
위의 예문에서 정적쿼리로 컬럼명이 a, b, c 같이 고정 되어 있을 경우는 잇점이되나
$컬럼목록변수$ 와 같이 테이블 컬럼이 변경 될 수 있을 경우는 최초 조회결과의 컬럼명이 캐쉬에 저장된다. 따라서 $컬럼목록변수$ -> ‘a, b, c’ 컬럼을 지정하여 결과를 얻은 후
$컬럼목록변수$ -> ‘d, e, f’로 변수값을 변경하면 최초 ‘a, b, c’ 메타 캐쉬로 저장 되어 있기 때문에 ‘d, e, f’ 컬럼들을 찾을 수 없다는 아래와 같은 오류가 발생한다.
— The error occurred while applying a parameter map.
— Check the queryMap.inserTest-InlineParameterMap.
— Check the parameter mapping for the ‘keyCode’ property.
이럴때 메타데이터를 캐쉬에 저장 하지 말고 항상 쿼리조회시 컬럼을 맵핑하여 가져 오게 할 수 있는데 remapResults = true로 지정하여 주면 된다.
remapResults = true를 정적쿼리에 사용해도 되나 매번 매핑을 사용 하므로 메타데이터를 캐쉬에 저장 할 때 보다는 성능이 약간 저하 될 수 있다.
http://briele.tistory.com/61
다른 설명
<select id="selectFilename" parameterClass="Map" resultClass="String">
SELECT
위와 같이 작성된 쿼리를 처음 호출 했을 경우엔 정상적으로 작동한다.
예를 들어 column에 'name1'이란 값을 넣었다고 하면
select name1 from TABLE_NAME WHERE seq = 111
이란 쿼리가 실행된다.
문제는 두번째 호출했을 경우 발생한다.
두번째 호출에서 column에 'name2'란 값을 넣게되면
로그엔 정상적으로
select name2 from TABLE_NAME WHERE seq = 111
이렇게 실행되지만, 실제론 에러가 발생하면서
'com.microsoft.sqlserver.jdbc.SQLServerException: 열 이름 name1이(가) 잘못되었습니다.'
라는 에러내용이 뜬다.
이런 경우가 발생하는 이유는
<select> 일 경우 반환되는 칼럼의 값이 동일하다고 가정하기 때문이다.
즉 동일한 id의 <select> 에서 발생하는 칼럼의 결과를 ResultSetMetaData에 저장하게 된다.
위의 경우라면 첫번째 호출된 결과로 metadata엔 'name1'이란 칼럼명이 저장되어 있게 된다는 것이다.
그런데 두번째 호출이 왔을 땐 호출의 결과가 'name2'이고 iBatis는 이 컬럼명을 metadata에서 검색하게 되는데,
저장되어 있는 컬럼이 name1이기 때문에 제대로 mapping 시키지 못하고 에러를 발생시키는 것이다.
이럴 경우엔 remapResults="true" 란 속성을 추가하게 되면
metadata에서 결과를 비교하는 게 아니라 새로운 쿼리를 작성하게 된다.
그래서 위의 에러는 해결할 수가 있다.
하지만 매번 새로운 쿼리를 작성하게 됨으로, 메모리에 부하가 걸리는 문제가 발생하게 된다.
'Language > Java' 카테고리의 다른 글
[Java/Spring Framework] Eclipse 스프링 연동하기 (0) | 2019.03.14 |
---|---|
[Java/POI/엑셀출력] POI 라이브러리를 이용한 엑셀 출력 - POI-3.16 (0) | 2019.03.07 |
[Java/Date/Format] Java date생성 format 설정하기 (0) | 2019.02.08 |
[Java/jdk 다운로드] jdk 다운로드 및 설치 (0) | 2019.02.08 |
댓글