[ibatis] sqlMap XML 파일의 기본 구조

2019. 10. 7. 17:02 Java 관련/MyBatis, iBatis

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 [개발이 하고 싶어요]