반응형
iBatis 실행구조
- 개발자에게 JavaBeans objects를 PreparedStatement parameters와 ResultMaps로 쉽게 매핑을 할 수 있도록 한다.
- 이를 통하여 database에 접근하기 위한 자바 코드의 양을 줄일 수 있다.
[편집] 실행절차
- 객체를 파라미터로 전달
- JavaBeans, Map or primitive wrapper
- 매핑되는 SQL문장을 수행
- SQL Maps 프레임워크는 PreparedStatment 인스턴스 생성
- 객체로부터 제공되는 값들을 파라미터로 설정
- SQL 문장을 수행하고 ResultSet으로부터 결과 객체를 생성.
- Update의 경우에는 영향을 받은 rows 수가 반환
- 쿼리의 경우 하나 혹은 여러 객체들이 반환
[편집] iBatis관련 파일구성
- SQL Map Configuration XML 파일
- 설정 관련 정보 제공
- SQL Map XML 파일
- SQL 문장들을 제공
- ibatis 라이브러리
- 런타임 엔진 제공
[편집] slqmap 위치설정(sqlmap-config.xml)
- src 의 config 안에 sql-map. xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> <sqlMapConfig> <!--cacheMap namespace="GlobalCache"> //new definition <cacheModel id="cache" readOnly="true" serialize="true" type="LRU"> <flushOnExecute statement="insert*"/> <flushOnExecute statement="update*"/> <flushOnExecute statement="delete*"/> <property name="size" value="100000"/> <flushInterval hours="24"/> </cacheModel> </cacheMap--> <!--settings cacheModelsEnabled="true" /--> <settings cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="true" maxRequests="32" maxSessions="10" maxTransactions="5" useStatementNamespaces="false"/> //Dao의 xml을 등록. <!-- ==========Framework Configuration Section============= --> <sqlMap resource="com/daewoobrenic/com/menu/dao/sqlmap/Menu.xml"/> <sqlMap resource="com/daewoobrenic/com/program/dao/sqlmap/Program.xml"/> <sqlMap resource="com/daewoobrenic/com/menu/authority/dao/sqlmap/Auth.xml"/> <sqlMap resource="com/daewoobrenic/com/user/dao/sqlmap/User.xml"/> <sqlMap resource="com/daewoobrenic/com/code/dao/sqlmap/Code.xml"/> <sqlMap resource="com/daewoobrenic/com/term/dao/sqlmap/Term.xml"/> </sqlMapConfig>
[편집] SQL Map 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="Program"> <typeAlias alias="program" type="com.daewoobrenic.com.program.model.Program"/> <resultMap id="program-resultMap" class="program" > <result property="id" column="program_id"/> <result property="name" column="program_name"/> <result property="path" column="program_path"/> <result property="desc" column="program_desc"/> <result property="div" column="div_code"/> <result property="scrtgrad" column="scrtgrad_code"/> </resultMap> <statement id="insertProgram" parameterClass="program" > INSERT INTO PROGRAM( program_id, program_name, program_path, program_desc, div_code, scrtgrad_code, first_insert_time, last_update_time ) VALUES( #id#, #name#, #path#, #desc#, #div#, #scrtgrad#, SYSTIMESTAMP, SYSTIMESTAMP ) </statement> <statement id="selectProgram" parameterClass="string" resultMap="program-resultMap" cacheModel="program-cache"> SELECT program_id, program_name, program_path, program_desc, div_code, scrtgrad_code FROM PROGRAM WHERE program_id = #id# </statement> <statement id="selectProgramList" parameterClass="program" resultMap="program-resultMap" cacheModel="program-cache"> SELECT program_id, program_name, program_path, program_desc, div_code, scrtgrad_code FROM PROGRAM ORDER BY program_id </statement> <statement id="updateProgram" parameterClass="program"> UPDATE PROGRAM SET program_id = #id#, program_name = #name#, program_path = #path#, program_desc = #desc#, div_code = #div#, scrtgrad_code = #scrtgrad#, last_update_time = SYSTIMESTAMP WHERE program_id = #id# </statement> <statement id="deleteProgram" parameterClass="string"> DELETE FROM PROGRAM WHERE program_id = #id# </statement> </statement> </sqlMap>
- namespace
- typeAlias - SQL maping을 할 model의 이름
- resultMap
- Query 컬럼명과 result 클래스의 property가 동일 할 경우에 ResultMap 생략 가능
- class
- resultMap 의 class 유형
- JavaBean과 java.util.Map 모두 사용 가능
- JavaBean 일 때
- Query 조회결과 Row별로 JavaBean을 생성
- Result element 속성에 Column 값을 저장
- java.util.HashMap일때
- Query 조회결과 Row별로 HashMap 생성
- Result element의 id를 Key, Column 값을 Value로 HashMap에 저장
- property : model
- program_id : db의 column
- ParameterClass, ParameterMap - db에 데이터가 들어갈 때
- resultMap,resultClass- db에서 데이터를 꺼내올때
- 여기서 #id# 는 id를 resultMap에서 정한 db에 컬럼에 맞는 값으로 binding 한다는 의미
- 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>
[편집] <![CDATA[ …. ]]>의 사용법
<statement id="getPersonsByAge" parameterClass="int" resultClass="examples.domain.Person"> <![CDATA[ SELECT * FROM PERSON WHERE AGE > #value# ]]> </statement>
[편집] cache 사용법
- cacheModel
<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>
- Statement의 where조건을 기준으로 데이터 cache
- imlementation: cache-types
- memory : MEMORY cache는 reference type 을 이용하여 cache behavior 를 관리한다. 즉 garbage collector가 효출적으로 cache내에서의 저장여부를 결정한다.
- LRU :Least Recently Used algorithm
- FIFO : First In First Out algorithm
- OSCACHE : OSCaching framework
- 매 24시간 주기로 갱신
- insertProduct, updateProduct, deleteProduct 문이 실행 시 갱신
- Cache 사이즈: 1000 Kbyte
- imlementation: cache-types
- Dynamic Query
Binary Condition | UnBinary Condition | Loop |
|
|
<iterate> |
<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>
[편집] Dao 구조
package com.daewoobrenic.com.program.dao; import java.util.List; import com.daewoobrenic.com.program.model.Program; import com.daewoobrenic.jcf.dao.BaseSqlMapClientDAO; public class ProgramDAOImpl extends BaseSqlMapClientDAO implements ProgramDAO { public int deleteProgram(String programId) { return executeDelete("deleteProgram", programId); } public int insertProgram(Program program) { return executeUpdate("insertProgram", program); } public Program selectProgram(String programId) { return (Program) executeQueryForObject("selectProgram", programId); } public List selectProgramList() { return executeQueryForList("selectProgramList", null); } public int updateProgram(Program program) { return executeUpdate("updateProgram", program); } }
- jcf.dao.ibatis.BaseSqlMapClientDAO을 상속받음.
- sqlmap 설정파일에서 받을 수 있는 parameter형태를 넘겨야함.
- executeQueryForObject 는 1건의 조회시 사용하며 반드시 어떤타입으로 받을지 ClassCasting을 하도록 함
- executeQueryForList는 여러건 조회시 사용하며 List형태로 리턴함.
- executeUpdate는 insert/update와 같이 데이터에 변경을 가할 때 사용함.
출처 : http://wiki.dev.daewoobrenic.co.kr/mediawiki/index.php/IBatis_Framework