[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) []() []()
댓글남기기