sustainability solu ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 ·...

54
Sustainability Solu Ibatis Ibatis (2 nd ) : ([email protected]) 2008 . 04 . 29

Upload: others

Post on 19-Apr-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

Sustainability Solu

IbatisIbatis (2nd)작성자작성자작성자작성자 : 박찬연박찬연박찬연박찬연([email protected])

2008 . 04 . 29

Page 2: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

목차� 소개� datasource

� sqlMap

� 트렌젝션� 배치� SqlMapClient

� 로깅� SimpleDataSource

� ScriptRunner

Page 3: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

소개� SQL Maps 프레임워크는 관계형 데이터베이스에 접근할 때 필요한 자바코드를 현저하게 줄일 수 있도록 도와줍니다. SQL Maps는 간단한 XML서술자를 사용해서 간단하게 자바빈즈를 SQL statement에 맵핑시킵니다. � 간단함이란 다른 프레임워크와 객체관계맵핑툴에 비해 SQL Maps의 가장큰 장점입니다. SQL Maps를 사용하기 위해서 여러분은 자바빈즈와

XML 그리고 SQL에 친숙할 필요가 있습니다. � 여러분은 배워야 할것도 거의 없고 테이블을 조인하거나 복잡한 쿼리문을수행하기 위해 필요한 복잡한 스키마도 없습니다. SQL Maps를 사용하면당신은 실제 SQL문의 모든 기능을 가질수 있습니다.

Page 4: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

소개� -다운로드� http://ibatis.apache.org/

Page 5: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

datasource� <dataSource> 요소� database에연결하기 위해 datasource를 설정합니다.� 프레임워크에서 제공되는 3가지 데이터소스타입이 있지만 여러분만의데이터소스를 사용할수도 있습니다. � SimpleDataSourceFactory

� SimpleDataSource 는 데이터소스를 제공하는 컨테이너가 없는 경우에connection을 제공하기 위해 기본적으로 풀링(pooling) 데이터소스 구현을제공합니다. 이것은 iBATIS SimpleDataSource connection풀링을 기초로합니다.

� sql-map-config.xml 코드 참조

Page 6: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

datasource� DbcpDataSourceFactory

� 이구현물은 DataSource API를 통해 connection풀링서비스를 제공하기위해 Jakarta DBCP (Database Connection Pool)을 사용합니다. 이DataSource는 애플리케이션/웹 컨테이너가 DataSource구현물을 제공하지못하거나 직접 standalone애플리케이션을 구동할 때 이상적입니다.

� sql-map-config-dbcp.xml 코드 참조

Page 7: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

datasource� JndiDataSourceFactory

� 이구현물은 애플리케이션 컨테이너내 JNDI컨텍스트로부터 DataSource구현물을 가져와야 할것입니다. 이것은 전형적으로 애플리케이션서버를사용중이고 컨테이너관리 connection풀 그리고 제공되는 DataSource구현물이 있을 때 사용합니다. JDBC DataSource구현물에 접근하기 위한표준적인 방법은 JNDI컨텍스트를 통하는것입니다.� JndiDataSourceFactory는 JNDI를 통해 DataSource에 접근하는 기능을제공합니다.� <transactionManager type="JDBC" >① <dataSource type="JNDI">② <property name="DataSource"③ value="java:comp/env/jdbc/jpetstore"/>④ </dataSource>

� </transactionManager>

Page 8: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

datasource� 전역(global)트랜잭션을 설정� <transactionManager type="JTA" >① <property name="UserTransaction"

value="java:/ctx/con/UserTransaction"/>② <dataSource type="JNDI">

� <property name="DataSource"

� value="java:comp/env/jdbc/jpetstore"/>③ </dataSource>

� </transactionManager>

Page 9: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� <sqlMap> 요소� <!--CLASSPATH RESOURCES -->

� <sqlMap resource="com/ibatis/examples/sql/Customer.xml" />

� <sqlMap resource="com/ibatis/examples/sql/Account.xml" />

� <sqlMap resource="com/ibatis/examples/sql/Product.xml" />

� <!--URL RESOURCES -->

� <sqlMap url="file:///c:/config/Customer.xml " />

� <sqlMap url="file:///c:/config/Account.xml " />

� <sqlMap url="file:///c:/config/Product.xml" />

Page 10: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMapstatement

Page 11: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� 쿼리의 <와> 문제 해결법� <statement id="getPersonsByAge" parameterClass=”int”

resultClass="examples.domain.Person">① <![CDATA[

� SELECT *

� FROM PERSON

� WHERE AGE > #value#② ]]>

� </statement>

Page 12: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� 저장 프로시저� 파라미터 객체(map)내에서 두개의 칼럼사이에 두개의 이메일주소를 교체하는 예제� 저장 프로시저는 <procedure> statement요소를 통해 지원됩니다. � <parameterMap id="swapParameters" class="map" >① <parameter property="email1" jdbcType="VARCHAR"

javaType="java.lang.String" mode="INOUT"/>② <parameter property="email2" jdbcType="VARCHAR" javaType="java.lang.String"③ mode="INOUT"/>

� </parameterMap>

� <procedure id="swapEmailAddresses" parameterMap="swapParameters" >① {call swap_email_address (?, ?)}

� </procedure>

Page 13: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� parameterClass

� <statement id=”statementName” parameterClass=” examples.domain.Product”>① insert into PRODUCT values (#id#, #description#, #price#)

� </statement>

Page 14: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� parameterMap

� <parameterMap id=”insert-product-param” class=”com.domain.Product”>① <parameter property=”id”/>② <parameter property=”description”/>

� </parameterMap>

� <statement id=”insertProduct” parameterMap=”insert-product-param”>① insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (?,?);

� </statement>

� 좀더세부적인설정이필요하다면다음과같이합니다.

� <parameterMap id=”insert-product-param” class=”com.domain.Product”>① <parameter property=”id” jdbcType=”NUMERIC” javaType=”int” nullValue=”-9999999”/>② <parameter property=”description” jdbcType=”VARCHAR” nullValue=”NO_ENTRY”/>

� </parameterMap>

Page 15: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� parameterMap(inline)

� <statement id=”insertProduct” parameterClass=”com.domain.Product”>① insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (#id#, #description#);

� </statement>

� 타입을선언하는것은다음의문법을사용함으로써인라인파라미터로할수있습니다.� <statement id=”insertProduct” parameterClass=”com.domain.Product”>

� insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (#id:NUMERIC#, #description:VARCHAR#);

� </statement>

� 타입을선언하는것과 null값대체는다음문법을사용함으로써인라인파라미터로할수있습니다.� <statement id=”insertProduct” parameterClass=”com.domain.Product”>

� insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (#id:NUMERIC:-999999#, #description:VARCHAR:NO_ENTRY#);

� </statement>

Page 16: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� resultClass

� <statement id="getPerson" parameterClass=”int” resultClass="examples.domain.Person">① SELECT② PER_ID as id,③ PER_FIRST_NAME as firstName,④ PER_LAST_NAME as lastName,⑤ PER_BIRTH_DATE as birthDate,⑥ PER_WEIGHT_KG as weightInKilograms,⑦ PER_HEIGHT_M as heightInMeters⑧ FROM PERSON⑨ WHERE PER_ID = #value#

� </statement>

Page 17: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� cacheModel

� 24시간마다 또는 관련된 update문이 수행될때마다 지워집니다.(flush) ① LRU 캐쉬는 객체가 자동으로 캐시로부터 어떻게 삭제되는지 결정하기 위해 Least Recently

Used(가장최근에 사용된) 알고리즘을 사용합니다. 캐쉬가 가득 찼을 때 가장 최근에 접근된 객체는캐쉬로부터 삭제됩니다.② FIFO = First In First Out(먼저 들어온 것을 먼저 보낸다.)③ OSCACHE = http://www.opensymphony.com/oscache/

� <cacheModel id="product-cache" imlementation="LRU">① <flushInterval hours="24"/>② <flushOnExecute statement="insertProduct"/>③ <flushOnExecute statement="updateProduct"/>④ <flushOnExecute statement="deleteProduct"/>⑤ <property name=”size” value=”1000” />

� </cacheModel>

� <statement id=”getProductList” parameterClass=”int” cacheModel=”product-cache”>① select * from PRODUCT where PRD_CAT_ID = #value#

� </statement>

Page 18: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� 캐쉬 타입들� <cacheModel id="product-cache" type="MEMORY">

� <flushInterval hours="24"/>

� <flushOnExecute statement="insertProduct"/>

� <flushOnExecute statement="updateProduct"/>

� <flushOnExecute statement="deleteProduct"/>

� <property name=”reference-type” value=”WEAK” />

� </cacheModel>

� WEAK

� (default)

� 이참조타입은대부분의경우에가장좋은선택이고참조타입을정의하지않는다면디폴트로설정되는값입니다. 이것은대개의결과에성능을향상시킬것입니다. 하지만할당된다른객체내에서사용되는메모리를완전히제거할것입니다. � 그결과는현재사용중이지않다는것을가정합니다.

Page 19: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� 캐쉬 타입들� <cacheModel id="product-cache" type="MEMORY">

� <flushInterval hours="24"/>

� <flushOnExecute statement="insertProduct"/>

� <flushOnExecute statement="updateProduct"/>

� <flushOnExecute statement="deleteProduct"/>

� <property name=”reference-type” value=”SOFT” />

� </cacheModel>

� SOFT

� 이참조타입은결과물이현재사용중이지않고메모리가다른객체를위해필요한경우에메모리가바닥나는가능성을제거할것입니다. 어쨌든이것은할당되고좀더중요한객체에유효하지않는메모리에대해대부분공격적인참조타입이아닙니다.

Page 20: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� 캐쉬 타입들� <cacheModel id="product-cache" type="MEMORY">

� <flushInterval hours="24"/>

� <flushOnExecute statement="insertProduct"/>

� <flushOnExecute statement="updateProduct"/>

� <flushOnExecute statement="deleteProduct"/>

� <property name=”reference-type” value=”STRONG” />

� </cacheModel>

� STRONG

� 이참조타입은명시적을캐쉬가삭제될때까지메모리내에저장된결과물을보증합니다. 이것은 1) 매우작음, 2) 절대적으로정적, and 3) 매우종종사용되는결과에좋습니다. 장점은특수한쿼리를위해매우좋은성능을보입니다. 단점은결과물에의해사용되는메모리가필요할때다른객체를위해메모리를반환하지않습니다.

Page 21: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� xmlResultName� <select id="getPerson" parameterClass=”int” resultClass="xml" xmlResultName=”person”>① SELECT② PER_ID as id,③ PER_FIRST_NAME as firstName,④ PER_LAST_NAME as lastName,⑤ PER_BIRTH_DATE as birthDate,⑥ PER_WEIGHT_KG as weightInKilograms,⑦ PER_HEIGHT_M as heightInMeters⑧ FROM PERSON WHERE PER_ID = #value#

� </select>

� 위 select statement는 다음 구조의 XML객체를 생성합니다.� <person>① <id>1</id>② <firstName>Clinton</firstName>③ <lastName>Begin</lastName>④ <birthDate>1900-01-01</birthDate>⑤ <weightInKilograms>89</weightInKilograms>⑥ <heightInMeters>1.77</heightInMeters>

� </person>

Page 22: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� 원시타입 파라미터� 원시타입 래퍼객체(String, Integer, Date등등)를 파라미터로 사용 할 수있습니다.� <statement id=”insertProduct” parameter=”java.lang.Integer”>① select * from PRODUCT where PRD_ID = #value#

� </statement>

Page 23: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� Map 타입 파라미터� <statement id=”insertProduct” parameterClass=”java.util.Map”>

� select * from PRODUCT

� where PRD_CAT_ID = #catId#

� and PRD_CODE = #code#

� </statement>

Page 24: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� result maps

� <resultMap id=”resultMapName” class=”some.domain.Class” [extends=”parent-resultMap”]>① <result property=”propertyName” column=”COLUMN_NAME”

� [columnIndex=”1”] [javaType=”int”] [jdbcType=”NUMERIC”]

� [nullValue=”-999999”] [select=”someOtherStatement”]② />③ <result ……/>④ <result ……/>⑤ <result ……/>

� </resultMap>

Page 25: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� 내포하는 Result Maps

� <statement id=”getProduct” resultClass=”com.ibatis.example.Product”>① select② PRD_ID as id,③ PRD_DESCRIPTION as description④ from PRODUCT⑤ where PRD_ID = #value#

� </statement>

Page 26: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� 원시타입의 Results (이를 테면 String, Integer, Boolean)

� <resultMap id=”get-product-result” class=”java.lang.String”>① <result property=”value” column=”PRD_DESCRIPTION”/>

� </resultMap>

� 좀더 간단한 접근법은 맵핑된 statement안에서 간단하게 result class를사용하는것입니다.(“as”키워드를 사용해서 “value”라는 칼럼별칭을 사용하는 것을 주의깊게 보세요.)� <statement id=”getProductCount” resultClass=”java.lang.Integer”>① select count(1) as value② from PRODUCT

� </statement>

Page 27: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� Map Results

� <resultMap id=”get-product-result” class=”java.util.HashMap”>① <result property=”id” column=”PRD_ID”/>② <result property=”code” column=”PRD_CODE”/>③ <result property=”description” column=”PRD_DESCRIPTION”/>④ <result property=”suggestedPrice” column=”PRD_SUGGESTED_PRICE”/>

� </resultMap>

� 간단하게 사용하는 법� <statement id=”getProductCount”

resultClass=”java.util.HashMap”>① select * from PRODUCT

� </statement>

Page 28: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� 복합(Complex) Properties (이를 테면 사용자에 의해 정의된 클래스의프라퍼티)� <resultMap id=”get-product-result” class=”com.ibatis.example.Product”>① <result property=”id” column=”PRD_ID”/>② <result property=”description” column=”PRD_DESCRIPTION”/>③ <result property=”category” column=”PRD_CAT_ID” select=”getCategory”/>

� </resultMap>

� <resultMap id=”get-category-result” class=”com.ibatis.example.Category”>① <result property=”id” column=”CAT_ID”/>② <result property=”description” column=”CAT_DESCRIPTION”/>

� </resultMap>

� <statement id=”getProduct” parameterClass=”int” resultMap=”get-product-result”>① select * from PRODUCT where PRD_ID = #value#

� </statement>

� <statement id=”getCategory” parameterClass=”int” resultMap=”get-category-result”>① select * from CATEGORY where CAT_ID = #value#

� </statement>

Page 29: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� N+1 Selects (1:1) 피하기� 복합 프로퍼티 사용시 퍼포먼스에 악영향이 있을 수 있습니다.

� 해결방법(조인사용)

� <resultMap id=”get-product-result” class=”com.ibatis.example.Product”>① <result property=”id” column=”PRD_ID”/>② <result property=”description” column=”PRD_DESCRIPTION”/>③ <result property=”category.id” column=”CAT_ID” />④ <result property=”category.description” column=”CAT_DESCRIPTION” />

� </resultMap>

� <statement id=”getProduct” parameterClass=”int” resultMap=”get-product-result”>① select * from PRODUCT, CATEGORY where PRD_CAT_ID=CAT_ID and PRD_ID =

#value#

� </statement>

� 하지만위의 조인이항상 좋은것만은아니니주의해서 사용해야합니다.

Page 30: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� 복합 키또는 다중 복합 파라미터 프라퍼티� <resultMap id=”get-order-result” class=”com.ibatis.example.Order”>① <result property=”id” column=”ORD_ID”/>② <result property=”customerId” column=”ORD_CST_ID”/>③ …④ <result property=”payments” column=”{itemId=ORD_ID, custId=ORD_CST_ID}”

select=” getOrderPayments”/>

� </resultMap>

� <statement id=”getOrderPayments” resultMap=”get-payment-result”>① select * from PAYMENT② where PAY_ORD_ID = #itemId#③ and PAY_CST_ID = #custId#

� </statement>

Page 31: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� 동적으로 맵핑되는 Statements

� <select id="dynamicGetAccountList” cacheModel="account-cache” resultMap="account-result" >① select * from ACCOUNT② <isGreaterThan prepend="and" property="id" compareValue="0">

� where ACC_ID = #id#③ </isGreaterThan>④ order by ACC_LAST_NAME

� </select>

Page 32: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� 바이너리 조건적인 요소� <isEqual> ① 프라퍼티와값 또는다른 프라퍼티가같은지체크.� <isNotEqual> ① 프라퍼티와값 또는다른 프라퍼티가같지않은지 체크.� <isGreaterThan> ① 프라퍼티가값 또는다른 프라퍼티보다큰지체크.� <isGreaterEqual> ① 프라퍼티가값 또는다른 프라퍼티보다크거나같은지 체크.� <isLessThan> ① 프라퍼티가값 또는다른 프라퍼티보다작은지체크.� <isLessEqual> 프라퍼티가 값 또는 다른 프라퍼티보다 작거나 같은지 체크.사용법 예제:① <isLessEqual prepend=”AND” property=”age” compareValue=”18”>

� ADOLESCENT = ‘TRUE’② </isLessEqual>

Page 33: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� 단일 조건적인 요소� <isPropertyAvailable> ① 프라퍼티가유효한지체크(이를테면파라미터빈의프라퍼티이다.)� <isNotPropertyAvailable> ① 프라퍼티가유효하지않은지체크(이를테면파라미터의프라퍼티가아니다.)� <isNull> ① 프라퍼티가 null인지체크� <isNotNull> ① 프라퍼티가 null이아닌지체크� <isEmpty> ① Collection, 문자열또는 String.valueOf() 프라퍼티가 null이거나 empty(“” or size()

< 1)인지체크� <isNotEmpty> ① Collection, 문자열또는 String.valueOf() 프라퍼티가 null이아니거나 empty(“” or

size() < 1)가아닌지체크.② Example Usage:③ <isNotEmpty prepend=”AND” property=”firstName” >

� FIRST_NAME=#firstName#④ </isNotEmpty>

Page 34: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� 다른 요소들� <isParameterPresent> ① 파라미터객체가 존재(not null)하는지보기위해체크.� <isNotParameterPresent> ① 파라미터객체가 존재하지(null) 않는지 보기위해체크.② Example Usage:③ <isNotParameterPresent prepend=”AND”>

� EMPLOYEE_TYPE = ‘DEFAULT’④ </isNotParameterPresent>

Page 35: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

sqlMap� 다른 요소들� <iterate> ① java.util.List타입의프라퍼티반복� 사용법 예제:� <iterate prepend=”AND” property=”userNameList” open=”(”

close=”)” conjunction=”OR”>① username=#userNameList[]#

� </iterate>

� 주의: iterator요소를 사용할 때 리스트 프라퍼티의 끝에 중괄호[] 를 포함하는 것은 중요합니다. 중괄호는 문자열처럼 리스트를 간단하게 출력함으로부터 파서를 유지하기 위해 리스트처럼 객체를 구별합니다.

Page 36: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

트랜잭션� 트랜잭션� private Reader reader = new Resources.getResourceAsReader

("com/ibatis/example/sqlMap-config.xml");

� private SqlMapClient sqlMap = XmlSqlMapBuilder.buildSqlMap(reader);

� public updateItemDescription (String itemId, String newDescription) throws SQLException {① try {

� sqlMap.startTransaction ();

� Item item = (Item) sqlMap.queryForObject ("getItem", itemId);

� item.setDescription (newDescription);

� sqlMap.update ("updateItem", item);

� sqlMap.commitTransaction ();② } finally {

� sqlMap.endTransaction ();//반드시해줘야합니다.③ }

� }

Page 37: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

트랜잭션� 트랜잭션(두개의 트랜젝션)� SQL Map설정파일에 <transactionManager> type 속성을 “JTA”로 설정해야만 하고 “UserTransaction”을

SqlMapClient인스턴스가 UserTransaction인스턴스를 찾는곳에 전체 JNDI이름에 셋팅해야 합니다.� try {① orderSqlMap.startTransaction();② storeSqlMap.startTransaction();③ orderSqlMap.insertOrder(…);④ orderSqlMap.updateQuantity(…);⑤ storeSqlMap.commitTransaction();⑥ orderSqlMap.commitTransaction();

� } finally {① try {

� storeSqlMap.endTransaction();② } finally {

� orderSqlMap.endTransaction();③ }

� }

Page 38: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

배치� 배치(Batches)

� sqlMap.startBatch();

� //…execute statements in between

� sqlMap.executeBatch();

Page 39: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

SqlMapClient� SqlMapClient 주요 메소드� public int insert(String statementName, Object parameterObject) throws

SQLException

� public int update(String statementName, Object parameterObject) throws SQLException

� public int delete(String statementName, Object parameterObject) throws SQLException

� public Object queryForObject(String statementName,ObjectparameterObject) throws SQLException

� public Object queryForObject(String statementName,ObjectparameterObject, Object resultObject) throws SQLException

� public List queryForList(String statementName, Object parameterObject) throws SQLException

Page 40: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

SqlMapClient� SqlMapClient 주요 메소드� public List queryForList(String statementName, Object parameterObject,

� int skipResults, int maxResults) throws SQLException

� public List queryForList (String statementName,Object parameterObject, RowHandler rowHandler) throws SQLException

� public PaginatedList queryForPaginatedList(String statementName,ObjectparameterObject, int pageSize) throws SQLException

� public Map queryForMap (String statementName, Object parameterObject,String keyProperty) throws SQLException

� public Map queryForMap (String statementName, Object parameterObject,String keyProperty, String valueProperty) throws SQLException

Page 41: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

SqlMapClient� SqlMapClient 예제� Example 1: Update (insert, update, delete) 수행하기.

� sqlMap.startTransaction();

� Product product = new Product();

� product.setId (1);

� product.setDescription (“Shih Tzu”);

� int rows = sqlMap.insert (“insertProduct”, product);

� sqlMap.commitTransaction();

Page 42: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

SqlMapClient� SqlMapClient 예제� Example 2: 객체를 위한 쿼리 수행하기. (select)

� sqlMap.startTransaction();

� Integer key = new Integer (1);

� Product product = (Product)sqlMap.queryForObject (“getProduct”, key);

� sqlMap.commitTransaction();

Page 43: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

SqlMapClient� SqlMapClient 예제� Example 3: 미리 할당된 result객체를 가지고 객체를 위한 쿼리 수행하기.

� sqlMap.startTransaction();

� Customer customer = new Customer();

� sqlMap.queryForObject(“getCust”, parameterObject, customer);

� sqlMap.queryForObject(“getAddr”, parameterObject, customer);

� sqlMap.commitTransaction();

Page 44: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

SqlMapClient� SqlMapClient 예제� Example 4: 리스트를 위한 뭐리 수행하기. (select)

� sqlMap.startTransaction();

� List list = sqlMap.queryForList (“getProductList”, null);

� sqlMap.commitTransaction();

Page 45: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

SqlMapClient� SqlMapClient 예제� Example 5: 자동 커밋� // When startTransaction is not called, the statements will

� // auto-commit. Calling commit/rollback is not needed.

� int rows = sqlMap.insert (“insertProduct”, product);

Page 46: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

SqlMapClient� SqlMapClient 예제� Example 6: 결과 경계를 가지고 리스트를 위한 쿼리 수행하기.

� sqlMap.startTransaction();

� List list = sqlMap.queryForList (“getProductList”, null, 0, 40);

� sqlMap.commitTransaction();

Page 47: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

SqlMapClient� SqlMapClient 예제� Example 7: RowHandler를 가지고 쿼리 수행하기. (select)

� public class MyRowHandler implements RowHandler {① public void handleRow (Object object, List list) throws SQLException {

� Product product = (Product) object;

� product.setQuantity (10000);

� sqlMap.update (“updateProduct”, product);

� // Optionally you could add the result object to the list.

� // The list is returned from the queryForList() method.② }

� }

� sqlMap.startTransaction();

� RowHandler rowHandler = new MyRowHandler();

� List list = sqlMap.queryForList (“getProductList”, null, rowHandler);

� sqlMap.commitTransaction();

Page 48: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

SqlMapClient� SqlMapClient 예제� Example 8: 페이지 처리된 리스트를 위한 쿼리 수행하기. (select)

� PaginatedList list =

� sqlMap.queryForPaginatedList (“getProductList”, null, 10);

� list.nextPage();

� list.previousPage();

Page 49: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

SqlMapClient� SqlMapClient 예제� Example 9: map을 위한 쿼리 수행하기.

� sqlMap.startTransaction();

� Map map = sqlMap.queryForMap (“getProductList”, null, “productCode”);

� sqlMap.commitTransaction();

� Product p = (Product) map.get(“EST-93”);

Page 50: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

Logging� Log4j

� log4j.properties� # Global logging configuration

� log4j.rootLogger=ERROR, stdout

� # SqlMap logging configuration...

� #log4j.logger.com.ibatis=DEBUG

� #log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG

� #log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG

� #log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG

� #log4j.logger.java.sql.Connection=DEBUG

� #log4j.logger.java.sql.Statement=DEBUG

� #log4j.logger.java.sql.PreparedStatement=DEBUG

� #log4j.logger.java.sql.ResultSet=DEBUG

� # Console output...

� log4j.appender.stdout=org.apache.log4j.ConsoleAppender

� log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

� log4j.appender.stdout.layout.ConversionPattern=%5p [%t] -%m%n

Page 51: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

SimpleDataSource (com.ibatis.common.jdbc.*)� SimpleDataSource

� 예제 : SimpleDataSource 사용하기① properties셋팅� JDBC.Driver ,Yes ,JDBC 드라이버클래스명� JDBC.ConnectionURL ,Yes, JDBC connection URL.

� JDBC.Username ,Yes, 데이터베이스에로그인하기위한유저명� JDBC.Password ,Yes, 데이터베이스에로그인하기위한패스워드

� DataSource dataSource = new SimpleDataSource(props); //properties usually loaded from a file

� Connection conn = dataSource.getConnection(); //…..database queries and updates

� conn.commit();

� conn.close(); //connections retrieved from SimpleDataSource will return to the pool when closed

Page 52: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

ScriptRunner (com.ibatis.common.jdbc.*)� ScriptRunner

� 예제 사용법 1: 현재 존재하는 connection을 사용하기� Connection conn = getConnection(); //some method to get a

Connection

� ScriptRunner runner = new ScriptRunner ();

� runner.runScript(conn, Resources.getResourceAsReader("com/some/resource/path/initialize.sql"));

� conn.close();

Page 53: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

ScriptRunner (com.ibatis.common.jdbc.*)� ScriptRunner

� 예제 사용법 2: 새로운 connection을 사용하기� ScriptRunner runner = new ScriptRunner (“com.some.Driver”,

“jdbc:url://db”, “login”, “password”);

� runner.runScript(conn, new FileReader("/usr/local/db/scripts/ initialize-db.sql"));

Page 54: Sustainability Solu Ibatispds11.egloos.com/pds/200901/18/76/ibatis.pdf · 2009-01-18 · realcool@empal.com datasource DbcpDataSourceFactory & S DataSourceAPI% : connection 6G % oz(N

[email protected]

ScriptRunner (com.ibatis.common.jdbc.*)� ScriptRunner

� 프로퍼티① driver=org.hsqldb.jdbcDriver② url=jdbc:hsqldb:.③ username=dba④ password=whatever⑤ stopOnError=true

� 예제 사용법 3: 프라퍼티로부터 새로운 connection을 사용하기� Properties props = getProperties (); // some properties from

somewhere

� ScriptRunner runner = new ScriptRunner (props);

� runner.runScript(conn, new FileReader("/usr/local/db/scripts/ initialize-db.sql"));