달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'프레임워크'에 해당되는 글 22

  1. 2006.10.30 iBATIS 2.0 Developer's Guide 정리 1
  2. 2006.10.30 ServletContext에서 ApplicationContext를 얻는 방법 2
2006. 10. 30. 19:45

iBATIS 2.0 Developer's Guide 정리 1 프레임워크2006. 10. 30. 19:45

1. SQL Map XML Configuration File
 1.1 <settings> element
 1.2 <typeAlias> Element
 1.3 <transactionManager> Element
 1.4 <dataSource> Element
 1.5 <sqlMap> Element
 1.6 SqlMap 파일 예
2. Mapped Statements
 2.1 Auto-Generated Keys
 2.2 Stored Procedures
 2.3 parameterClass
 2.4 parameterMap
 2.5 Inline Parameters
 2.6 resultClass
 2.7 resultMap
 2.8 cacheModel
 2.9 xmlResultName
3. Parameter Maps and Inline Parameters
   3.1 Inline Parameter Maps
   3.2 Primitive Type Parameters
   3.3 Map Type Parameters

1. SQL Map XML Configuration File

1.1 <settings> element

maxRequests
동시에 SQL 문장을 수행할 수 있는 최대 쓰레드 개수
이 개수를 초과한 쓰레드가 수행될 경우 해당 쓰레드는 다른 쓰레드의 수행이 종료될 때 까지 block 된다.
보통 이 값은 maxTransactions의 적어도 10배 정도의 값을 설정한다. 그리고 항상 maxSessions, maxTransactions 보다 큰 값을 설정한다.
종종 동시 요청의 최대 값을 줄임으로써 성능을 증가시킬 수 있다.
디폴트는 512이다.

maxSessions
해당 시점에 활성화될 수 있는 세션의 개수
세션은 프로그램에 의해 생성되는 명시적 세션, SqlMapClient 인스턴스 사용으로 인한 자동 세션이 있다.
maxTransactions <= maxSessions < maxRequests
이 값을 줄이면 메모리 사용을 줄일 수 있다.
디폴트는 128이다.

maxTransactions
동시에 SqlMapClient.startTransaction()에 진입할 수 있는 최대 쓰레드 개수
지정된 수를 초과하는 쓰레드는 다른 쓰레드가 종료할 때 까지 block된다.
maxTransactions <= maxSessions
maxTransactions << maxRequests
이 값을 줄이면 성능이 증가하는 경우가 많다.
디폴트는 32

cacheModelsEnabled
전역적으로 SqlMapClient에 대한 모든 캐쉬 모델들을 enable/disable 한다.
디버깅시 유용하다.
디폴트는 true(enabled)

lazyLoadingEnabled
전역적으로 SqlMapClient에 대한 lazy loading을 enable/disable 한다.
디버깅시 유용하다.
디폴트는 true(enabled)

enhancementEnabled
enhanced lazy loading, 최적화된 JavaBean 프로퍼티 access를 위해 런타임 bytecode enhancement를 enable한다.
디폴트는 false(disabled)

useStatementNamespaces
이 값이 enable되면 mapped statement를 항상 fully qualified name(sqlMap 이름과 statement 이름)으로 참조해야 한다.
예). queryForObject("sqlMapName.statementName");
디폴트는 false(disabled)

1.2 <typeAlias> Element


일반적으로 긴 fully qualified name을 짧은 이름으로 참조하는 것을 허용하도록 한다.

예). <typeAlias alias="shortName" type="com.long.class.path.Class" />

아래와 같은 predefied alias가 SQL Map Config 파일에서 사용된다.

Transaction Manager Aliases

JDBC com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransactionConfig
JTA com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig
EXTERNAL com.ibatis.sqlmap.engine.transaction.external.ExternalTransactionConfig

Data Source Factory Aliases

SIMPLE com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory
DBCP com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory
JNDI com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory

1.3 <transactionManager> Element


JDBC, JTA, EXTERNAL이 가능

JDBC - JDBC가 Connection의 commit(), rollback() 메소드를 통해 트랜잭션을 제어하도록 한다.
JTA - SQL Map Activities가 JTA 트랜잭션에 일부로써 포함되도록 한다. 이 구성은 JNDI 자원에서 user transaction을 locate할 수 있도록 UserTransaction 프로퍼티를 설정하는 것을 필요로 한다.
EXTERNAL - 개발자가 트랜잭션을 제어하도록 한다.

1.4 <dataSource> Element


SimpleDateSourceFactory, DbcpDataSourceFactory, JndiDataSourceFactory를 제공한다.

1.4.1 SimpleDateSourceFactory


컨테이너가 제공하는 Datasource가 없을 때 pooling data source를 제공하는 기본 구현
iBATIS의 SimpleDateSource 컨넥션 풀 구현에 기본한다.

아래와 같이 구성한다.

<transactionManager type="JDBC">
 <dataSource type="SIMPLE">
   <property name="JDBC.Driver" value="org.postgresql.Driver"/>
   <property name="JDBC.ConnectionURL" value="jdbc:postgresql://server:5432/dbname"/>
   <property name="JDBC.Username" value="user"/>
   <property name="JDBC.Password" value="password"/>
   <!-- OPTIONAL PROPERTIES BELOW -->
   <property name="Pool.MaximumActiveConnections" value="10"/>
   <property name="Pool.MaximumIdleConnections" value="5"/>
   <property name="Pool.MaximumCheckoutTime" value="120000"/>
   <property name="Pool.TimeToWait" value="10000"/>
   <property name="Pool.PingQuery" value="select * from dual"/>
   <property name="Pool.PingEnabled" value="false"/>
   <property name="Pool.PingConnectionsOlderThan" value="0"/>
   <property name="Pool.PingConnectionsNotUsedFor" value="0"/>
 </dataSource>
</transactionManager>

1.4.2 DbcpDataSourceFactory


자카르타 DBCP(Database Connection Pool)을 이용하여 DataSource API를 통해 컨넥션 풀링 서비스를 제공한다.
Application/Web 컨테이너가 DAtaSource 구현을 제공하지 못하거나 standalone 애플리케이션을 개발할 때 적절한 방법

아래와 같이 구성한다.

<transactionManager type="JDBC">
 <dataSource type="DBCP">
   <property name="JDBC.Driver" value="${driver}"/>
   <property name="JDBC.ConnectionURL" value="${url}"/>
   <property name="JDBC.Username" value="${username}"/>
   <property name="JDBC.Password" value="${password}"/>
   <!-- OPTIONAL PROPERTIES BELOW -->
   <property name="Pool.MaximumActiveConnections" value="10"/>
   <property name="Pool.MaximumIdleConnections" value="5"/>
   <property name="Pool.MaximumWait" value="60000"/>
   <!-- Use of the validati??|??р誘м?????on query can be problematic.
   If you have difficulty, try without it. -->
   <property name="Pool.ValidationQuery" value="select * from ACCOUNT"/>
   <property name="Pool.LogAbandoned" value="false"/>
   <property name="Pool.RemoveAbandoned" value="false"/>
   <property name="Pool.RemoveAbandonedTimeout" value="50000"/>
 </datasource>
</transactionManager>

1.4.3 JndiDataSourceFactory

애플리케이션 컨테이너에서 JNDI 컨텍스트를 통해 DataSource 구현을 검색한다. 애플리케이션 서버가 사용되고, container managed connection pool과 관련된 DataSource 구현이 제공될 때 적절한 방법

아래와 같이 구성한다.

<transactionManager type="JDBC" >
 <dataSource type="JNDI">
   <property name="DataSource" value="java:comp/env/jdbc/jpetstore"/>
 </dataSource>
</transactionManager>

<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>

1.5 <sqlMap> Element

명시적으로 SQL Map이나 다른 SQL Map Configuration 파일을 포함하기 위해 사용된다.
SqlMapClient 인스턴스에 의해 사용될 각 SQL Map XML 파일은 반드시 선언되어야 한다.
SQL Map XML 파일은 classpath나 URL로 부터 얻어지는 stream resource로써 로딩된다.
아래와 같이 모든 Data Mapper를 명시해야 한다.


<!-- 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" />

1.6 SqlMap 파일 예

지금까지의 설명을 종합한 예를 보면 아래와 같다.

<sqlMap id="Product">
 <cacheModel id="productCache" type="LRU">
   <flushInterval hours="24"/>
   <property name="size" value="1000" />
 </cacheModel>

 <typeAlias alias="product" type="com.ibatis.example.Product" />

 <parameterMap id="productParam" class="product">
   <parameter property="id"/>
 </parameterMap>

 <resultMap id="productResult" class="product">
   <result property="id" column="PRD_ID"/>
   <result property="description" column="PRD_DESCRIPTION"/>
 </resultMap>

 <select id="getProduct" parameterMap="productParam"
     resultMap="productResult" cacheModel="product-cache">
   select * from PRODUCT where PRD_ID = ?
 </select>
</sqlMap>

위의 예를 간략하게 변경하면 아래와 같다.

<sqlMap id="Product">
 <select id="getProduct" parameterClass="com.ibatis.example.Product"
     resultClass="com.ibatis.example.Product">
   select
     PRD_ID as id,
     PRD_DESCRIPTION as description
   from PRODUCT
   where PRD_ID = #id#
 </select>
</sqlMap>

위의 두 문장은 완전히 동일한 것은 아니다. 아래와 같은 차이가 있다.
1. 후자는 캐쉬를 정의하지 않아서 요청은 항상 데이터베이스로 전파된다.
2. 후자는 iBATIS 프레임워크의 auto-mapping 기능을 사용한다. 이 기능은 약간의 오버헤드를 유발한다.


2. Mapped Statements

Mapped Statements는 파라미터 맵(input)과 result map(output)을 갖는 SQL 문장이다.
mapped statement는 캐쉬 모델을 사용하여 빈번히 발생하는 result를 메모리에 캐쉬하도록 설정될 수 있다.

<statement id="statementName"
 [parameterClass="some.class.Name"]
 [resultClass="some.class.Name"]
 [parameterMap="nameOfParameterMap"]
 [resultMap="nameOfResultMap"]
 [cacheModel="nameOfCache"]
>
 select * from PRODUCT where PRD_ID = [?|#propertyName#]
 order by [$simpleDynamic$]
</statement>

Statement ElementAttributesChild ElementsMethods
<statement>id
parameterClass
resultClass
parameterMap
resultMap
cacheModel
xmlResultName
All dynamic elements

insert
update
delete
All query methods

<insert>id
parameterClass
parameterMap
All dynamic elements
<selectKey>
insert
update
delete
<update>id
parameterClass
parameterMap
All dynamic elementsinsert
update
delete
<delete>id
parameterClass
parameterMap
All dynamic elementsinsert
update
delete
<select>id
parameterClass
resultClass
parameterMap
resultMap
cacheModel
All dynamic elementsAll query methods
<procedure>id
parameterClass
resultClass
parameterMap
resultMap
xmlResultName
All dynamic elementsinsert
update
delete
All query methods

xml에 정의하는 SQL 문장 중에 XML에서 사용되는 문자(<, > 등)가 포함되는 경우 아래와 같이 CDATA를 사용한다.

<statement id="getPersonsByAge" parameterClass=”int” resultClass="examples.domain.Person">
<![CDATA[
 SELECT *
 FROM PERSON
 WHERE AGE > #value#
 ]]>
 </statement>

2.1 Auto-Generated Keys

Data Mapper는 <insert> 문에 <selectKey>문을 이용하여 auto-generated key를 지원한다. <selectKey>는 pre-generated key(oracle sequence)와 post-generated key(MS-SQL 서버)를 모두 지원한다.

<!-Oracle SEQUENCE Example -->
<insert id="insertProduct-ORACLE" parameterClass="com.domain.Product">
<selectKey resultClass="int" >
 SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL
 </selectKey>
 insert into PRODUCT (PRD_ID,PRD_DESCRIPTION)
 values (#id#,#description#)
</insert>


<!- Microsoft SQL Server IDENTITY Column Example -->
<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">
 insert into PRODUCT (PRD_DESCRIPTION)
 values (#description#)
 <selectKey resultClass="int" >
 SELECT @@IDENTITY AS ID
 </selectKey>
 </insert>

2.2 Stored Procedures

<procedure> 문장을 통해 stored procedure를 제공한다. 아래 예는 output 파라미터를 갖는 SP가 어떻게 호출되는지 보여준다.

<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>

2.3 parameterClass

parameterClass 속성의 값은 java class에 대한 fully qualified name이다.
parameterClass 속성은 optional이지만 highly recommended된다.
parameterClass 속성은 statement로 전달되는 파라미터를 제한하기도 하지만 성능 최적화에도 영향을 미친다.
parameterMap을 사용하면 parameterClass 속성을 사용할 필요가 없다. 아래 예는 examples.domain.Product을 파라미터로 전달하는 예이다.

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

2.4 parameterMap


parameterMap 속성의 값은 정의된 parameterMap element의 이름이다.
parameterMap 속성은 parameterClass 속성이나 inline parameter에 비해 잘 사용되지 않는다.
하지만 XML의 purity/consistency가 주요한 이슈이거나 보다 descriptive parameterMap을 원한다면 parameterMap 속성은 좋은 접근법이 된다.

주의 !
dynamic mapped statements는 inline parameters만 지원하고 parameterMap과는 함께 사용될 수 없다.

parameterMap 속성의 개념은 JDBC PreparedStatement에 사용될 값들에 대한 ordered list를 정의하는 것이다.

<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>

2.5 Inline Parameters

inline parameter는 mapped statement 내부에서 아래와 같이 사용된다.

<statement id="insertProduct" >
 insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
 values (#id#, #description#);
 </statement>

위의 예에서 inline parameter는 #id#와 #description#이다. inline parameter는 빈의 프로퍼티를 나타낸다.

2.6 resultClass

resultClass 속성은 java class에 대한 fully qualified name이다.
resultClass 속성은 ResultSetMetaData에 의해 JDBC ResultSet에 자동으로 맵핑될 클래스를 명시하도록 한다.
자바 빈의 프로퍼티 이름과 테이블의 컬럼 이름이 매치되면 프로퍼티는 컬럼의 값으로 채워진다.

<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>

위의 예에서 Person 클래스는 id, firstName 등과 같은 프로퍼티를 갖는다.
alias를 통해 컬럼의 값은 빈의 프로퍼티에 채워진다.

2.7 resultMap

resultMap의 값은 정의된 resultMap element의 이름이다. resultMap 속성을 사용하여 result set에서 데이터가 추출되는 방법과 어떤 프로퍼티가 어떤 컬럼에 맵핑되는지 제어할 수 있다.
자동으로 맵핑되는 resultClass와 달리 resultMap은 컬럼 타입, 널 값 치환 방법, complex property mapping 등을 지원한다.

<resultMap id="get-product-result" class="com.ibatis.example.Product">
 <result property="id" column="PRD_ID"/>
 <result property="description" column="PRD_DESCRIPTION"/>
 </resultMap>

<statement id="getProduct" resultMap="get-product-result">
 select * from PRODUCT
 </statement>

위의 예에서 SQL 쿼리의 result set은 resultMap 정의를 이용하여 Product 인스턴스로 맵핑된다. resultMap은 id 프로퍼티는 PRD_ID 컬럼의 값으로, description 프로퍼티는 PRD_DESCRIPTION 컬럼의 값으로 채워지도록 한다.
"select *"가 지원됨에 주의해야 한다. 이러한 기능은 result set에 반환된 모든 컬럼에 대한 맵핑을 정의할 필요는 없다는 것을 의미한다.

2.8 cacheModel


cacheModel 속성은 정의된 cacheModel element에 대한 이름이다.
cacheModel은 query mapped statement와 사용될 캐쉬를 서술하기 위해 사용된다. 각 query mapped statement는 같은 cacheModel을 사용할 수 도 있고, 서로 다른 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>

위의 예에서 product에 대해 정의된 캐쉬는 WEAK reference type을 사용한다. 이 캐쉬는 24 시간 마다 혹은 관련된 update 문장들이 수행될 때 마다 flush된다.

2.9 xmlResultName


결과를 XML 문서로 직접 맵핑할 때 xmlResultName의 값은 XML 문서의 root element의 이름이 된다.

<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>

위의 문장은 아래와 같은 구조를 갖는 XML 객체를 생성한다.

<person>
 <id>1</id>
 <firstName>Clinton</firstName>
 <lastName>Begin</lastName>
 <birthDate>1900-01-01</birthDate>
 <weightInKilograms>89</weightInKilograms>
 <heightInMeters>1.77</heightInMeters>
</person>

3. Parameter Maps and Inline Parameters

<parameterMap id="parameterMapName" [class="com.domain.Product"]>
   <parameter property ="propertyName" [jdbcType="VARCHAR"] [javaType="string"]
       [nullValue="NUMERIC"] [null="-9999999"]/>
   <parameter …… />
   <parameter …… />
</parameterMap>

class 속성은 optional이지만 사용하는 것이 좋다. parameterClass와 유사하게 class 속성은 프레임워크가 incoming parameter를 validate하고 성능을 위해 엔진을 최적화하도록 한다.

property

자바 빈의 프로퍼티

jdbcType

데이터베이스 컬럼 타입을 명시한다.

일반적인 컬럼이 nullable이면 필요 없지만 PreparedStatement.setNull(int parameterIndex, int sqlType) 메소드가 호출될 때는 필요하다. 어떤 데이터 타입에 대한 Null 값을 설정할 것인지 지정해야 하기 때문이다. 또한 명시적으로 데이터 타입을 지정한다는 점에서 유용하다. setNull 외에 Date 타입의 경우에도 유용하다. 자바는 java.util.Date 만을 제공하지만 대부분의 데이터베이스는 3개 정도의 date 관련 데이터 타입을 제공하기 때문에 명시적으로 지정하는 것이 좋다.

특히 오라클에서 컬럼 타입을 명시하지 않고 null을 설정하고자 할 때 "Invalid column type" 오류가 발생한다.

javaType

파라미터에 대한 자바 빈의 프로퍼티 타입을 지정한다.

일반적으로 이 타입은 빈의 프로퍼티 타입에서 reflection을 통해 자동으로 설정된다. 하지만 Map과 같은 타입은 프레임워크에 정확한 타입 정보를 제공할 수 없다. 만일 javaType이 설정되지 않았고 프레임워크가 타입을 결정할 수 없는 경우 타입은 Object로 간주된다.

nullValue

null을 표현할 수 없는 자바 빈의 프로퍼티에 대해 null 값을 정의하기 위해 사용된다.

아래는 parameterMap에 대한 예제이다.

<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>

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

3.1 Inline Parameter Maps

<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>

<statement id="insertProduct" parameterClass="com.domain.Product">
   insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
   values (#id:NUMERIC:-999999#, #description:VARCHAR:NO_ENTRY#);
</statement>

인라인 파라미터 맵을 사용할 경우에는 type 설정 없이 null value를 설정할 수는 없다.

3.2 Primitive Type Parameters

단지 파라미터로 사용하고자 자바 빈을 만드는 것은 바람직하지 않다. 이러한 경우 primitive type wrapper 객체(String, Integer, Date 등)를 사용한다.

<statement id="insertProduct" parameter="java.lang.Integer">
   select * from PRODUCT where PRD_ID = #value#
</statement>

3.3 Map Type Parameters

Map(HashMap, TreeMap 등)을 파라미터 객체로 사용하는 방법

<statement id="insertProduct" parameterClass="java.util.Map">
   select * from PRODUCT
   where PRD_CAT_ID = #catId#
   and PRD_CODE = #code#
</statement>

위와 같은 경우 Map에는 catId, code를 키로 갖는 값이 존재해야 한다.

4. 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>

extends 속성은 선택적으로 사용되어 베이스로 삼을 다른 resultMap을 설정하기 위해 사용된다. super resultMap의 속성은 항상 sub resultMap의 속성 보다 먼저 insert 된다. 또 parent resultMap은 항상 child 보다 먼저 정의되어야 한다.

property

column

columnIndex

설정되었을 경우 jdbc 드라이버 구현에 따라 성능 향상을 얻을 수 있다.

jdbcType

javaType

nullValue

<resultMap id="get-product-result" class="com.ibatis.example.Product">
   <result property="id" column="PRD_ID"/>
   <result property="description" column="PRD_DESCRIPTION"/>
   <result property="subCode" column="PRD_SUB_CODE" nullValue="-999"/>
</resultMap>

select

select 속성은 객체와 자동으로 로딩되는 complex(user defined 등) 프로퍼티 타입 간의 관계를 서술하기 위해 사용된다. select 속성의 값은 다른 mapped statement의 이름이여야 한다. select 속성이 정의된 프로퍼티의 데이터베이스 컬럼은 반드시 지원되는 primitive type이여야 한다.

:
Posted by codetemplate

ApplicationContext ctx = WebApplicationContextUtils.
getWebApplicationContext(servletContext);
Bar bar = (Bar) ctx.getBean("bar");

:
Posted by codetemplate