54.iBATIS, MyBatis2011. 12. 13. 11:36
반응형

iBatis 실행구조
  • 개발자에게 JavaBeans objects를 PreparedStatement parameters와 ResultMaps로 쉽게 매핑을 할 수 있도록 한다.
  • 이를 통하여 database에 접근하기 위한 자바 코드의 양을 줄일 수 있다.
iBatis 실행구조
iBatis 실행구조

[편집] 실행절차

  • 객체를 파라미터로 전달
    • 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
  • Dynamic Query
Binary Condition UnBinary Condition Loop
<isEqual>
<isNotEqual>
<isGreaterThan>
<isLessThan>
<isLessEqual>
<isPropertyAvailable>
<isNotPropertyAvailable>
<isNull>
<isNotNull>
<isEmpty>
<isNotEmpty>

<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

Posted by 1010