[ibatis] sqlMap XML 파일의 기본 구조
sqlMap XML 파일의 기본 구조
* sqmMap XML 파일의 예제
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd"> <sqlMap namespace="Product"> <cacheModel id="productCache" type="LRU"> <flushInterval hours="24"/> <property name="size" value="1000" /> </cacheModel> <typeAlias alias="product" type="com.ibatis.example.Product"/> <parameterMap id="productParam" class="product"> <parameter property="id"/> </parameterMap> <resultMap id="productResult" class="product"> <result property="id" column="PRD_ID"/> <result property="description" column="PRD_DESCRIPTION"/> </resultMap> <select id="getProduct" parameterMap="productParam" resultMap="productResult" cacheMode="product-cache"> <![CDATA[ SELECT * FROM PRODUCT WHERE PRD_ID = ? ]]> </select> </sqlMap> |
sqlMapConfig.xml 에서 <sqlMap>으로 SQL MAP XML 파일을 포함시켰다.
[ibatis] sqlMapConfig.xml 파일 설정 및 정리
이 포함시킨 <sqlMap> 파일에 실제 매핑되어 사용될 쿼리문들을 작성해야 한다.
위의 예제를 보면 SELECT * FROM PRODUCT WHERE PRD_ID = #id# 와 같은 간단한 쿼리를 작성하기 위해 많은 내용들이 작성되어있다.
위의 예는 작성할 수 있는 여러 옵션들을 구구절절 달아놓은 것이고, 간단한 방식으로는 아래와 같이 작성해도 같은 SQL 결과가 나온다.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd"> <sqlMap namespace="Product"> <select id="getProduct" parameterClass="com.ibatis.example.Product" resultClass="com.ibatis.example.Product"> <![CDATA[ SELECT PRD_ID as id, PRD_DESCRIPTION as description FROM PRODUCT WHERE PRD_ID = #id# ]]> </select> </sqlMap> |
위의 두 SQL MAP XML 파일은 SQL 호출 및 결과 값은 같지만 내부적으로 동작하는 statement는 몇가지 다른 점을 보인다.
(1) 두번째 statement는 캐쉬를 명시하지 않아 매번 요청시 데이터베이스에 직접 요청한다.
(2) 두번째 statement는 또한 약간의 부하를 야기할 수 있는 프레임워크의 자동 Mapping 기능을 사용한다.
( 당연히 필요한 변수만 매핑하도록 직접 선언한 것과, 객체 전체를 매핑 대상으로 지정하는 것에는 효율성 및 성능에 차이가 있을 수 있다.)
1. <statement> 타입
<statement> 타입에는 SQL 문이 작성되어 있으며, SQL 사용을 위해 호출되는 요소이다.
타입의 종류로는 <statement>, <insert>, <update>, <delete>, <select>, <procedure> 가 있다.
statement 요소 | 속성 | 하위요소 | 메소드 | 설명 |
<statement> | id parameterClass resultClass parameterMap resultMap cacheModel resultSetType fetchSize xmlResultName remapResults
| 모든 동적 요소 | insert update delete 모든 쿼리 메소드 | 모든 타입의 SQL 문을 사용할 수 있는 "catch all" statement 이다. 기본 타입이며, 모든 속성을 사용할 수 있다. |
<insert> | id parametertClass parameterMap | 모든 동적 요소 <selectKey> | insert update delete | 기본적으로 insert를 위한 statement 타입이며, insert, update, delete SQL 문만 지원한다. 특이사항으로 하위 요소로 <selectKey>사용 가능 |
<update> | id parameterClass parameterMap | 모든 동적 요소 | insert update delete | update 를 위한 statement 타입이며, insert, update, delete SQL문을 지원한다. |
<delete> | id parameterClass parameterMap | 모든 동적 요소 | insert update
| delete 를 위한 statement 타입이며, insert, update, delete SQL문을 지원한다. |
<select> | id parameterClass resultClass parameterMap resultMap cacheModel resultSetType fetchSize xmlResultName remapResults
| 모든 동적 요소 | 모든 쿼리 메소드 | select 조회를 위한 statement 타입이며, <statement>와 같이 모든 속성을 가질 수 있으며, 모든 쿼리 메소드를 가질 수 있다. |
<procedure> | id parameterClass resultClass parameterMap resultMap cacheModel xmlResultName remapResults | 모든 동적 요소 | insert update delete 모든 쿼리 메소드 | 프로시저를 위한 statement 이다. 프로시저 사용을 명시적으로 나타낼때 사용한다. |
위에서도 언급했듯이 기본적으로 <statement> 를 사용하면 전체적인 것들을 사용할 수 있다. 하지만 좀 더 명시적이고 직접적 어떤 종류의 쿼리를 사용할 것인지 알려주기 위해 세부 타입을 사용한다.
2. Statement 타입 매핑 방식
<statement> 는 모든 SQL 문을 사용할 수 있고 파라미터도 모든 형식을 가질 수 있다. 캐쉬 모델 역시 설정할 수 있다.
<statement id="statementName"
[parameterClass="some.class.Name"]
[resultClass="some.class.Name"]
[parameterMap="nameOfParameterMap"]
[resultMap="nameOfResultMap"]
[cacheModel="nameOfCache"]
>
select * form PRODUCT where PRD_ID = [? | #propertyName#]
order by [$simpleDynamic$]
</statement>
위의 <statement> 사용 형식에서 [] 부분은 옵션이다.
3. SQL 문 작성
SQL은 map의 가장 중요한 부분이다. 하지만 SQL과 XML을 혼합하기 때문에 특수문자의 충돌이 생길 수 있다. 대부분의 경우가 크다, 작다를 나타내는 '>' ,'<' 가 될 수 있다. 이러한 혼동을 줄 수 있는 특수문자들을 SQL 문으로 인식할 수 있게 XML CDATA 섹션을 사용한다.
<statement id="getPersonsByAge" parameterClass="int" resultClass="exaples.domain.Person">
<![CDATA[
SELECT *
FROM PERSON
WHERE AGE > #value#
]]>
</statement>
<![CDATA[ ]]> 로 SQL문을 묶어주면 특수문자 '>' '<' 와 같은 XML 문서의 예약어를 SQL 문으로 인식할 수 있다.
출처: https://hyeonstorage.tistory.com/279?category=549765 [개발이 하고 싶어요]
'Java 관련 > MyBatis, iBatis' 카테고리의 다른 글
[ibatis] resultMap의 property 속성 옵션 정리 (0) | 2019.10.07 |
---|---|
[ibatis] parameterMap의 property 속성 옵션 정리 (0) | 2019.10.07 |
[ibatis] resultClass, resultMap 사용 기본 (0) | 2019.10.07 |
[ibatis] parameterClass, parameterMap 사용 기본 (0) | 2019.10.07 |
[ibatis] <procedure> call 사용 (0) | 2019.10.07 |
[ibatis] 자동생성키 <selectKey> 사용 정리 (채번, Sequence) (0) | 2019.10.07 |
[ibatis] sqlMapConfig.xml 파일 설정 및 정리 (0) | 2019.10.07 |
[ibatis] iBATIS Data Mapper 프레임워크 소개 (0) | 2019.10.07 |