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 >
'backend > iBatis' 카테고리의 다른 글
[iBatis] iBatis에서 Log4j를 이용하여 쿼리를 로그로 남기려면? (4) | 2009.01.20 |
---|---|
[iBatis] 자동 생성 Key (2) | 2009.01.18 |
[iBatis] 자바빈즈와 Map 타입의 결과 (0) | 2009.01.18 |
[iBATIS] 8. Annotation 기반으로 JUnit4를 이용한 Spring TDD ~ 9. Reference (4) | 2008.09.03 |
[iBATIS] 7. iBATIS + Spring + transaction (0) | 2008.09.02 |
[iBATIS] 6. iBATIS + Spring (0) | 2008.09.01 |
[iBATIS] 5. Transaction (2) | 2008.09.01 |
[iBATIS] 1.Overview ~ 3. Introduce iBATIS (4) | 2008.08.28 |