[MyBatis] iBatis, MyBatis 비교 정리(Dynamic Query)
iBatis와 MyBatis
iBatis( ~ 2.3)의 버전이 변경되면서 MyBatis(2.5 ~)로 변경이 되었다.
Apache project팀에서 google code 팀으로 이동하면서 명칭이 변경
변경된 사항들을 정리해보면 아래와 같다.
Java 요구 버전
Java 요구버전도 iBATIS는 JDK 1.4 이상에서 사용 가능하지만, MyBatis는 JDK 1.5 이상에서 사용 가능하도록 변경되었다.
MyBatis 3.2 이상 버전은 JDK 1.6 이상 요구
패키지 내부 구조
패키지 내부구조도 변경되었는데 iBATIS의 패키지 구조 com.ibatis.*에서 MyBatis 패키지 구조org.apache.ibatis.*로 변경 되었다.
sqlMap.xml 내부 구조
sqlMap.xml도 Mapper.xml로 변경되며 내부구조도 바뀌었는데 기존의 parameterMap에서 parameterType으로 변경되었고, dtd역시 http://mybatis.org/dtd/mybatis-3-mapper.dtd로 변경 되었다.
사용 용어 역시 변경 되었는데, 기존의 iBatis와 MyBatis를 비교해보면 아래와 같다.
| iBatis | MyBatis |
|---|---|
| SqlMapConfig | Configration |
| sqlMap | Mapper |
| parameterMap | parameterType |
| resultClass | resultType |
| #var# | #{var} |
$var$ |
${var} |
Maven pom.xml 추가 방식
Maven 의존성 추가도 아래와 같이 변경 되었다.
<!-- iBATIS pom.xml -->
<dependency>
<groupid>org.apache.ibatis</groupid>
<artifactid>ibatis-sqlmap</artifactid>
<version>2.3.4.726</version>
</dependency>
<!-- -->
<!-- MyBatis pom.xml -->
<dependency>
<groupid>org.mybatis</groupid>
<artifactid>mybatis</artifactid>
<version>3.4.5</version>
</dependency>
<dependency>
<groupid>org.mybatis</groupid>
<artifactid>mybatis-spring</artifactid>
<version>1.3.1</version>
</dependency>
Annotation 도입
기존 iBatis에서 필요하던 sqlMapClient DI 설정이 필요 없어지고, Bean id sqlSessionFactory, sqlSessionTemplate만 지정해 주면 되도록 변경되었다.
NameSpace
기존 iBatis에서는 <sqlMap namespace = "ibatisDAO">와 같이 사용하였지만,
MyBatis에서는 <mapper namespace = "com.gil.log.MybatisMapper">과 같이 변경되었다.
Dynamic Query
iBatis와 MyBatis에서 지원하는 Dynamic Query는 상황에 따라 분기 처리를 통해 SQL을 동적으로 만드는 것이다.
iBatis와 MyBatis에서 Dynamic Query를 사용하기 위해 쓰는 tag들은 아래와 같다.
iBatis Dynamic Query Tag
iBatis Dynamic Query Tag에서 사용되는 속성들은 아래와 같다.
prepend : 태그 조건에 일치하여 sql문에 선행하여 붙을 속성
property : 매개 변수 명
compareProperty : 비교할 다른 매개 변수 명
compareValue : 비교 대상이 될 값
<isEqual>
property의 값이 같을때만 태그내 쿼리를 실행한다.
<!-- useYn 이 Y 일때만 EQUIP_TYPE =1 조건을 실행 -->
WHERE 1=1
<isEqual prepend="AND" property="useYn" compareValue="Y">
EQUIP_TYPE = 1
</isEqual>
<isNotEqual>
property의 값이 같지 않을 때만 태그내 쿼리를 실행한다.
<!-- useYn 이 N이 아닐 때만 EQUIP_TYPE=1 조건을 실행 -->
WHERE 1=1
<isNotEqul prepend="AND" property="useYn" compareValue="N">
EQUIP_TYPE = 1
</isNotEqual>
<isGreaterThan>
property의 값이 비교값 보다 클 경우 쿼리를 실행한다.
<!-- age의 값이 19보다 클 경우 JOIN_YN = 'Y' 조건을 실행 -->
WHERE 1=1
<isGreaterThan prepend="AND" property="age" compareValue="19">
JOIN_YN = 'Y'
</isGreaterThan>
<isGreaterEqual>
property의 값이 비교값보다 크거나 같을 경우 쿼리를 실행한다.
<!-- age 값이 18 이거나 이보다 클경우 JOIN_YN='Y' 조건을 실행 -->
WHERE 1=1
<isGreaterEqual prepend="AND" property="age" compareValue="18">
JOIN_YN = 'Y'
</isGreaterEqual>
<isLessEqaul>
property의 값이 비교값보다 작거나 같을 경우 쿼리를 실행한다.
<!-- age값이 18이거나 이보다 작을 경우 JOIN_YN = 'Y' 조건을 실행 -->
WHERE 1=1
<isLessEqual prepend="AND" property="age" compareValue="18">
JOIN_YN = 'N'
</isLessEqual>
그 외의 단일 조건 태그들은 아래와 같다.
| Tag | Note |
|---|---|
<isPropertyAvailable> |
property값이 유효할 경우 쿼리를 실행 |
| ` |
property값이 유효하지 않을 경우 쿼리를 실행 |
<isNull> |
property값이 null일 경우 쿼리를 실행 |
<isNotNull> |
property값이 null이 아닐 경우 쿼리를 실행 |
<isEmpty> |
property값이 비어있을경우 쿼리를 실행 |
<isNotEmpty> |
property값이 비어있지 않을 경우 쿼리를 실행 |
<isParameterPresent>
parameter가 있을 경우 쿼리를 실행한다.
<!-- parameter값이 넘어왔을 경우에만 WHERE 조건이 붙는다. -->
<isParameterPresent prepend="WHERE">
1=1
</isParameterPresent>
<isNotParameterPresent>
parameter가 없을 경우 쿼리를 실행한다.
<!-- parameter값이 없을 경우에만 TYPE = 'DEFAULT' 쿼리 실행 -->
WHERE 1=1
<isNotParameterPresent prepend="AND">
TYPE = 'DEFAULT'
<isNotParameterPresent>
<iterate>
Parameter로 배열을 받아 쿼리를 실행한다.
<!-- 배열의 값을 빼내어 콤마로 구분하여 괄호 '(' , ')'안에 넣는다.
ex) ('111', '222', 333', '444') -->
WHERE 1=1
<isNotEmpty prepend="AND" property="empIdArray">
EMP_ID IN
<iterate open="(" close=")" conjunction="," property="empIdArray">#empIdArray[]#</iterate>
</isNotEmpty>
<dynamic>
하위 tag에 일치되는 내용이 존재 할 경우 쿼리를 실행한다.
<!-- empId 파라메터 값 123이라면 <isEqual>태그의 prepend는 생략되고
WHERE 절이 붙어 WHERE VACATION = 'TRUE' 쿼리가 실행 -->
<dynamic prepend="WHERE">
<isEqual prepend="AND" property="empId" comapareValue="123">
VACATION = 'TRUE'
</isEqual>
</dynamic>
MyBatis Dynamic Query Tag
<if>
<if> tag는 iBatis에서 사용하던 isEqual, isNotEqual, isNull, isNotNull, isEmpty, isNotEmpty를 하나로 표현한다.
#### 문자열 비교 paraName1 이라는 파라미터가 null이 아니면서 값이 "test"와 동일한가? ```
trim은 속성이 많아서 복잡해보이지만 where의 단점을 극복할 수 있는 tag이다. trim에서 사용하는 속성들은 아래와 같다. `prefixOverrides`: 하위 엘리먼트 처리 후 내용의 맨 앞에 해당 문자열이 있다면 지워버림 `suffixOverrides`: 하위 엘리먼트 처리 후 내용의 맨 뒤에 해당 문자열이 있다면 지워버림 `prefix`: 하위 엘리먼트 처리 후 내용이 있다면 가장 앞에 붙일 내용 `suffix`: 하위 엘리먼트 처리 후 내용이 있다면 가장 뒤에 붙일 내용 ``` SELECT COUNT(*) FROM MST_USER
# 🙆♂️ 참고사이트 🙇♂️ [[iBATIS/MyBatis]iBATIS와 MyBatis의 차이[seon_u]](https://sdevstudy.tistory.com/18) [iBatis, myBatis 동적 태그 비교 정리 Dynamic SQL[알짜배기 프로그래머]](https://aljjabaegi.tistory.com/310) [04. MYBATIS - 동적 쿼리[은서파의 랜선 강의장]](https://goodteacher.tistory.com/249) [[MyBatis] 동적 쿼리 if문 문법 총 정리[.java의개발일기]](https://java119.tistory.com/42) []() []()
댓글남기기