backend/iBatis

[iBATIS] 4. How to

버리야 2008. 8. 29. 10:07
반응형

4. How to 

< 실행절차 >

1. 객체를   파라미터로   전달

JavaBeans, Map or primitive wrapper
 

2. 매핑되는  SQL 문장을   수행

SQL Maps 프레임워크는 PreparedStatment 인스턴스 생성

객체로부터 제공되는 값들을 파라미터로 세팅

 
3. SQL 문장을   수행하고  ResultSet 으로부터   결과   객체를   생성 .

Update 경우에는 영향을 받은 rows 수가 반환

쿼리의 경우 하나 혹은 여러 객체들이 반환

결과객체는 자바빈즈 , Map 원시타입래퍼 또는 XML 있다 .


SQL Maps 설정파일 -SqlMapConfig.xml


<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMapConfig    

    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"    

    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

 

<sqlMapConfig>

    <settings

    cacheModelsEnabled="true"

    enhancementEnabled="true"

    lazyLoadingEnabled="true"

    maxRequests="32"

    maxSessions="10"

    maxTransactions="5"

    useStatementNamespaces="false"

  />

  <sqlMap resource="sqlmaps/Image.xml" />

</sqlMapConfig>


SQL Map 파일  - Image.xml


<?xml version="1.0" encoding="UTF-8" standalone="no"?>

DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"

"http://www.ibatis.com/dtd/sql-map-2.dtd">

<sqlMap namespace="Image">      

       <typeAlias alias="image" type="com.mydomain.domain.Image" />      

       <cacheModel id="oneDayProduct" type="LRU">

             <flushInterval hours="24" />

       </cacheModel> 

       <resultMap id="imageMap" class="image">

             <result property="id" column="id" />

             <result property="name" column="name" />

             <result property="mimeType" column="mimetype" />

             <result property="width" column="width" />

             <result property="height" column="height" />

             <result property="resolution" column="resolution" />

             <result property="fileSize" column="filesize" />

             <result property="regDate" column="regdate" />

             <result property="license" column="license" />

             <result property="author" column="author" />

             <result property="description" column="description" />

       </resultMap> 

       <select id="getImages" resultClass="image">

             SELECT * FROM images            

       </select>

.........

SQLMaps : 데이터베이스 접속에서부터 실제 사용할 SQL Map 들까지 모든 것들을 프레임워크에 제공해 준다 .

SQLMaps 프레임워크를 사용하기 위해 당신은 당신의 애플리케이션을 통해 실행될 SQL 쿼리문의 모든 리스트를 가지는 XML 파일을 생성한다 . 각각의 SQL 쿼리를 위해 당신은 쿼리문이 파라미터와 ResultSets 교체되는 자바 클래스를 정의한다 .
 
자바 코드내에서 당신이 특정 쿼리문을 실행하길 원할때 당신은 쿼리 파라미터와 필요한 조건을 넘기기 위한 객체를 생성할 것이고 SQLMaps 실행하기 위한 쿼리의 객체와 이름을 넘겨준다 . 쿼리가 실행되었을때 SQLMaps 쿼리 결과를 받기 위해 정의된 클래스의 인스턴스를 생성할 것이고 데이터베이스에 의해 반환된 ResultSet 부터 넘겨진 값으로 이것을 생성할것이다 .

 

SQL Map 파일  - Mapped Statement

<statement id="statementName"

[parameterClass="some.class.Name"]

[resultClass="some.class.Name"]

[parameterMap="nameOfParameterMap"]

[resultMap="nameOfResultMap"]

[cacheModel="nameOfCache"]

> 

<![CDATA

select * from PRODUCT where PRD_ID = [?|#propertyName#]

order by [$simpleDynamic$]

]]>


name : 'buri'

# : 데이터형에 맞는 sql 데이터형으로 변환

#name# : 'buri'

$ : 기존 데이터를 그대로 사용

'%$name$%' : '%buri%'

? : parameterMap 정의된 순서대로 ?  바인딩


맵핑된 (Mapped) Statements

SQL Maps 개념은 맵핑된 statement 집중한다 . 맵핑된 statement 어떠한 SQL 문을 사용할수도 있고 파라미터 maps(input) result maps(output) 가질수 있다 . 만약 간단한 경우라면 맵핑된 statement 파라미터와 result 위한 클래스로 직접 설정할수 있다 . 맵핑된 statement 메모리내에 생산된 results 캐슁하기 위해 캐쉬 모델을 사용하도록 설정할수도 있다 .

 

parameter class

당신이 parameterMap 사용한다면 parameterClass 속성을 사용할 필요가 없다 . 예를 들면 당신이

라미터로 전달하기 위한 "examples.domain.Product" 타입의 객체를 허락하길 원한다면 당신은 다음처럼 할수 있을것이다 .

 

resultClass

mapped statement 통한  ResultSet columns JavaBeans property mapping 하는 역할

 

parameterMap

 

resultMap

자주 사용되고 중요한 attribute resultMap 으로 정의

 

cacheModel

Query mapped statements 통한 결과를 cacheModel parameters 통하여 caching 있다 .


XML CDATA 섹션

하나의문서에서 SQL XML 혼합하기 때문에 특수문자의 충돌이 잠재적으로 존재한다 . 대부분의 공통적인 것은 greater-than less-than 문자들이다 .(<>). 이것들은 SQL 문에서 공통적으로 요구되고 XML 에서는 예약어이다 . 당신의 SQL 문에 들어갈 필요가 있는 특수 XML 문자를 처리하기 위한 간단한 해결법이 있다 . 표준적인 XML CDATA 섹션을 사용함으로써 특수문자의 어떤것도 파싱되지 않고 문제는 해결된다


JavaBeans

public class Image {

 

       private String description;

       public String getDescription() {

             return description;

       }

       public void setDescription(String description) {

             this.description = description;

       }

       // ....

}



매핑 구문의 타입

- <insert>

          - child element : <selectKey>

- <update>

- <delete>

- <select>

- <statement>

- <procedure>

 

SQL Map API

- insert()

- update()

- delete()

- queryForObejct()

- queryForList()

- queryForMap()

 

Auto Generation Key

<insert id="insertImage" parameterClass="image">

             INSERT INTO images(name,mimetype,width,height,resolution,filesize,regdate,license,author,description)

             VALUES (#name#, #mimeType#, #width#, #height#, #resolution#,#fileSize#, #regDate#, #license#, #author#, #description#)

             <selectKey keyProperty="id" resultClass="int">

                    values IDENTITY_VAL_LOCAL()

             </selectKey>

</insert>


Cache Model

< cacheModel id = " oneDayProduct " type = " LRU " >

          < flushInterval hours = " 24 " / >

< / cacheModel >


Dynamic Query

< update id = " dynamicUpdateImage " parameterClass = " image " >

          Update images

          < dynamic prepend = " SET " >

                    < isNotNull property = " name " prepend = " , " >

                                name = #name#

                      < / isNotNull >

                      < isNotNull property = " mimeType " prepend = " , " >

                                mimetype = #mimeType#

                      < / isNotNull >

                      < isNotNull property = " width " prepend = " , " >

                                width = #width#

                      < / isNotNull >

                      < isNotNull property = " height " prepend = " , " >

                                height = #height#

                      < / isNotNull >

                      < isNotNull property = " resolution " prepend = " , " >

                                resolution = #resolution#

                      < / isNotNull >

                      < isNotNull property = " fileSize " prepend = " , " >

                                fileSize = #fileSize#

                      < / isNotNull >

                      < isNotNull property = " regDate " prepend = " , " >

                                regDate = #regDate#

                      < / isNotNull >

                      < isNotNull property = " license " prepend = " , " >

                                license = #license#

                      < / isNotNull >

                      < isNotNull property = " author " prepend = " , " >

                                author = #author#

                      < / isNotNull >

                      < isNotNull property = " description " prepend = " , " >

                                description = #description#

                      < / isNotNull >

            < / dynamic >

            WHERE id=#id#

< / update >


Reuse SQL

<include>를 쓰지 않았을 경우

< select id = " selectItemCount " resultClass = " int " >

 SELECT COUNT(*) AS total

 FROM images

 WHERE id = 1

< / select >

< select id = " selectItems " resultClass = " image " >

 SELECT id, name

 FROM images

 WHERE id = 1

< / select >

        

<include>를 썼을 경우

< sql id = " selectItem_fragment " >

 FROM images

 WHERE id = #value#

< / sql >

< select id = " selectItemCount " parameterClass = " int " resultClass = " int " >

 SELECT COUNT(*) AS total

  < include refid = " selectItem_fragment " / >

< / select >


< select id = " selectItems " parameterClass = " int " resultClass = " image " >

 SELECT id, name

  < include refid = " selectItem_fragment " / >

< / select >

 






반응형