iBatis에서 Log4j를 이용하여 쿼리를 로그로 남기려면~~

log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG

쿼리 출력 내용을 보면, 새줄 기호(\n)가 모두 사라져서 쿼리 문장을 보기 어려울 때는
http://www.sqlinform.com 에서 쿼리 문자열을 보기 좋게 정렬 할 수 있다. (한번 문장을 넣어보았는데~ 좋다~+_+)
또는 'sql formatter'로 검색하면 다양한 SQL 문자열 정리 도구 들을 볼 수 있다.

iBatis in Action에서 발췌.

  1. [NC]...YellOw
    2009/01/27 22:57 [Edit/Del] [Reply]
    버리님 새해 복 많이 받으세요~
    늘 좋은일만 생기길 바래요~
  2. 염장똥꾸
    2009/02/02 10:26 [Edit/Del] [Reply]
    전 플젝에서 함 써봤는데..

    좋은 기능까지 찾을줄이야..

    어째든 다음 플젝에 사용하면.. 문자열 정렬 기능도 사용해봐야겠어..

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

[iBatis] 자동 생성 Key

Posted at 2009/01/18 21:28// Posted in 나만의 작업/iBatis
이전에 포스팅했던 2008/08/29 - [나만의 작업/iBatis] - [iBATIS] 4. How to 내용에 있는
"Auto Generation Key" 부분에서 추가할 것이 있어서 좀 더 자세한 내용.

iBatis in Action 에서 발췌.

거의 모든 데이터베이스는 새롭게 삽입되는 레코드마다 자동으로 기본 키를 생성해 주는
기능을 가지고 있는데, 삽입을 완료한 후 생성된 기본키를 알 필요가 있다면....?

자동 생성되는 기본키를 사용하도록 iBatis에서 <insert> 요소의 특별한 자식 요소인 <selectKey> 요소를 사용하여 생성된 키를 모델 객체로 가져올 수 있다. 이 접근법을 따르는 두가지 패턴이 있다.

1. 레코드를 삽입하고 데이터베이스가 키를 생성한 후에 생성된 키를 가져오는 것. 

주의! ) 사용하는 드라이버가 마지막에 실행한 insert 구문에 의해 생성된 키를 반환하는 것을 확실히 보장하는지 확인해야 할 필요가 있는데 두개의 스레드가 거의 동시에 insert 구문을 실행한다면 실행순서는 [사용자 #1추가], [사용자 #2 추가], [사용자 #1을 위한 selectKey], [사용자 #2를 위한 selectKey]가 될 수 있다.

드라이버가 마지막으로 생성된 키를 (전역적으로) 반환한다면 [사용자 #1을 위한 selectKey]는 사용자 #2용으로 생성된 키 값이 되어 버리고 이로 인해 어플리케이션이 혼란에 빠지게 된다~

=> 결국 풀어보면 시점이 살짝!~ 꼬여 서로 다른 기본키 값이 들어갈 경우가 있다는 말~
이 방법을 쓸려면 대부분의 드라이버는 잘 작동하긴 하지만 확신이 없다면 꼭 테스트를 해 볼 것. 

트리거를 사용하면 이 접근법에서 문제를 일으킬 수도 있다. 
MS SQL 에서는 @@identity 값은 트리거에 의해 영향을 받아 키 값을 생성하여 레코드를 하나 추가하고, 뒤이어 트리거를 사용해서 키 값을 생성하여 테이블에 레코드를 추가하면, @@identity에 의해 반환되는 값은 첫번째 레코드용으로 생성된 키가 아닌 트리거에 의해 추가된 레코드용으로 생성된 키가 될 것!!
이런 경우엔 SCOPE_IDENTITY 함수를 대신 사용할 것.

2. 레코드를 추가하기 전에 키를 가져오는 것.

이 접근법을 하용하면 레코드를 삽입하기 전에 키 값을 할당하는 일을 해줘야해서 더 많은 작업이 필요하긴 하지만, 이 방법은 스레드를 사용할 때,  레코드 삽입 후에 키를 가져올 때 발생할 수 있는 잠재적인 문제점들을 피해갈 수 있다.

sqlmaps에서는,
<insert id="insert">
 <selectKey keyProperty="accountId" resultClass="int">
   SELECT nextVal('account_accountid_seq')
 </selectKey>
INSERT INTO Account(accountId, username, password) VALUES ( #accountId#, #username#, #password#)
</insert>
주의!! ) generated key를 확인하는 방법은 각 DB마다 다르니 맞는 sql문을 넣으면 된다~
내 경우엔(Oracle) key값이 sequence여서 
select seq.nextval from dual 이런 sql문을 넣었다.

Mysql에선, LAST_INSERT_ID() 
Mssql에선, SCOPE_IDENTITY()

함수를 이용하여 generated된 key를 확인 가능.

참고)
<selectKey>는 pre-generated key(oracle)와 post-generated key(ms-sql)를 모두 지원한다.

자바코드에서는,
Integer returnValue = (Integer) sqlMap.insert("Account.insert", account);

가장 중요!)
<selectKey> 요소에서 keyProperty 속성은 iBatis가 생성된 키 값을 가져다 입력할 객체의 값으로 설정.
이미 입력된 객체가 키 값을 가지고 있기 때문에 원한다면 반환된 값을 무시할 수도 있다.

=> keyProperty에 지정된 이름의 값이 <insert>문에서 같은 이름의 값으로 들어감.








  1. 2009/01/22 16:11 [Edit/Del] [Reply]
    덕분에 좋은 정보 얻어갑니다^^;
    딴지는 아니고, sqlMap 예제에 selectKey부분에 from절이 빠졌네요^^;;;
    • 2009/01/29 11:12 [Edit/Del]
      ^^방문해주셔서 감사해요^^
      음 위의 예제는 PostgreSQL의 경우에

      select nextval('seq');
      select currval('seq');

      이렇게 쓰는걸로 알고 있습니다. ^^

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

iBatis in Action책을 보다가 기억해 놓을 내용을 발췌해 놓는다.

iBatis framework는 결과 매핑에 (Integer, Long 혹은 그 외의 원시 타입의 래퍼 클래스 이외에) Map 이나 자바빈즈 객체를 사용할 수 있다. 이 두가지 접근 방법의 장점과 단점

접근 방식 : 자바빈즈
장점 : 성능, 컴파일 시 강력한 타입 검사, 컴파일 시 이름 검사, IDE에서의 리팩토링 지원, 형변환이 줄어듬
단점 : 코드량의 증가(get/set)

접근 방식 : Map
장점 : 코드량의 감소
단점 : 느림, 컴파일 시 검사하지 않음, 약한 타입, 실행시 오류 발생이 잦음, 리팩토링 지원 없음.

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

8. Annotation 기반으로 JUnit4를 이용한 Spring TDD

@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback=true)

@RunWith : 테스트를 실행할 org.junit.runner.Runner 구현 클래스를 지정할 수 있다.

스프링은 스프링 컨텍스트 설정 및 DI, 트랜잭션 처리 등을 지원해주는 Runner 구현 클래스를 제공하고 있다.

Junit 4 기반의 테스트에서 스프링 컨텍스트에 설정된 빈 객체를 사용하고 싶다면 SpringJunit4ClassRunner 클래스를 @RunWith 어노테이션 값으로 설정하면 된다.

@ContextConfiguration : 스프링 컨텍스트를 생성할 때 사용될 설정 파일의 경로

@Autowired, @Resource : 테스트 코드에서 필요로 하는 스프링 빈 객체 설정


  • 트랜잭션 처리를 위한 설정

@TransactionConfiguration : 테스트 클래스에 적용되며, 트랜잭션 관리자와 기본 롤백 규칙을 설정한다.

@Rollback : 테스트 메소드에 적용되며, 메소드 단위로 롤백 규칙을 설정한다.

@NotTransactional : 트랜잭션을 적용하지 않을 메소드에 적용한다.

@Transactional : 테스트 클래스에 적용. 이 어노테이션을 적용함으로써 각 테스트 메소드는 트랜잭션 범위 내에서 실행된다.

만약 테스트 메소드에서 명시적으로 롤백 여부를 설정하고 싶다면 @Rollback 어노테이션을 사용하면 된다.

@Rollback(false)

테스트 메소드에 대한 트랜잭션이 시작되기 전에 어떤 초기화 작업을 해주어야 한다며, @BeforeTransaction 어노테이션이 적용된 메소드를 작성하면 된다.

반대로 트랜잭션이 종료된 이후에 정리 작업을 해주어야 할 경우에는 @AfterTransaction 어노테이션이 적용된 메소드를 작성하면 된다.



@RunWith (SpringJUnit4ClassRunner. class )

@ContextConfiguration (locations = { "classpath:/com/mydomain/data/beans.xml" })

@TransactionConfiguration (transactionManager = "transactionManager" ,defaultRollback= true )

@Transactional

public class iBatisDaoTest {

 

          @Autowired

          private ImageService imageService ;

          private int id ;

 

          @Test

          public void testInsertImage() {}

}



9. Reference

 

SQL Maps2.0 개발자가이드 ( 한글판 )
http://ibatis.apache.org/docs/java/pdf/iBATIS-SqlMaps-2_ko.pdf

SQL Maps2.0 tutorial( 한글판 )
http://ibatis.apache.org/docs/java/pdf/iBATIS-SqlMaps-2-Tutorial_ko.pdf

iBATIS 에서   생성되는  SQL 문을   보기   위한  log4j 셋팅
http://openframework.or.kr/JSPWiki/Wiki.jsp?page=IbatisLog4jSettingToShowSQL
 
Sql2ibatis
http://openframework.or.kr/JSPWiki/Wiki.jsp?page=Sql2ibatis

DDL2iBatis
http://openframework.or.kr/JSPWiki/attach/Hibernate/DDL2iBatis-exe.zip

Spring 2.5, Eclipse and JUnit 4.4
http://dertompson.com/index.php/2007/12/12/spring-25-eclipse-and-junit-44/

iBATIS 액션: 쉽고 강력한 SQL 매핑 프레임워크 아이바티스
- 클린턴 비긴.브랜든 구딘.래리 메도스 지음 | 이동국.손권남 번역,  위키북스

스프링 2.5 프로그래밍
- 최범균 , 가메출판사

 


  1. 2008/09/03 13:50 [Edit/Del] [Reply]
    맨날 모르는 이야기만 나온다 ㅠ_ㅠ
  2. seattle
    2008/09/04 09:10 [Edit/Del] [Reply]
    잘봤습니다. 다음엔 동영상 강의도 제작해주세요!

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

7. iBATIS + Spring + transaction

1. 코드   기반의   트랜잭션   처리 (Progrmmatic Transaction)

2. 선언적   트랜잭션 (Declarative Transaction)  

- <tx:advice> 태그를   이용  

- TransactionProxyFactoryBean 태그를   이용  

- @Transactional 어노테이션을   이용


<tx:advice> 태그 이용

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:aop="http://www.springframework.org/schema/aop"

       xmlns:tx="http://www.springframework.org/schema/tx"

       xsi:schemaLocation="

       http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

       http://www.springframework.org/schema/tx

       http://www.springframework.org/schema/tx/spring-tx-2.0.xsd

       http://www.springframework.org/schema/aop

       http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

  

  <bean id="fooService" class="x.y.service.DefaultFooService"/>

  <tx:advice id="txAdvice" transaction-manager="txManager">  

      <tx:method name="get*" read-only="true"/>

      <tx:method name="*"/>

 

<aop:pointcut id="fooServiceOperation" expression="execution(* x.y.service.FooService.*(..))"/>

<aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/>

 

@ Transactional 어노테이션을   이용

@Transactional(readOnly = true)

public class DefaultFooService implements FooService {

  public Foo getFoo(String fooName) {

    // do something

  }

  // these settings have precedence for this method

  @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)

  public void updateFoo(Foo foo) {

    // do something

  }

}


<bean id="fooService" class="x.y.service.DefaultFooService"/>

<tx:annotation-driven transaction-manager="txManager"/>





댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

[iBATIS] 6. iBATIS + Spring

Posted at 2008/09/01 19:57// Posted in 나만의 작업/iBatis

6. iBATIS + Spring

SqlMapClientFactoryBean

(org.springframework.orm.ibatis.SqlMapClientFactoryBean)

SqlMapClientTemplate

(org.springframework.orm.ibatis.SqlMapClientTemplate)

SqlMapClientDaoSupport

(org.springframework.orm.ibatis.support.SqlMapClientDaoSupport)

 

스프링의 iBATIS 연동지원
 

iBATIS 에서 데이터베이스 연동을 처리할 사용되는 SqlMapClient 역시 JDBC 프로그램을 때와 마찬가지로 try-catch 블록을 사용해서 예외를 처리해 주어야 한다 .
또한 에러원인에 따라 알맞은 예외를 발생시키기보다는 SQLException 발생하고 있다 .

스프링은 SqlMapClient 사용할 발생하는 코드 중복을 없애고 SQLException 스프링이 제공하는 예외 클래스로 변환해 주는 SqlMapClientTempalte 클래스를 제공하고 있다 .

1. SqlMapClient 위한 스프링 설정

스프링이 제공하는 SqlMapClientTemplate 클래스는 내부적으로 iBATIS SqlMapClient 사용한다 .
스프링은 SqlMapClient 스프링 설정 파일에서 쉽게 설정할 있도록 돕는 SqlMapClientFactoryBean 클래스를 제공하고 있다 .
클래스를 사용하면 SqlMapClient 스프링 빈으로 설정할 있다 .
dataSource
프로퍼티에는 DataSource 전달하며 , configLocation 프로퍼티는 iBATIS 설정 파일을 명시

2. SqlMapClientTemplate 이용한 DAO 구현

SqlMapClient 위한 빈을 설정했다면 SqlMapClientTemplate 이용해서 iBATIS 연동할 있다 .
SqlMapClientTemplate
클래스는 iBATIS SqlMapClient 클래스가 제공하는 대부분의 메소드와 동일한 이름과 파라미터 타입 , 리턴 타입을 갖는 메소드를 정의하고 있다.
차이점이
있다면 SQLException 발생하는 대신 스프링이 제공하는 예외를 발생한다 .

iBATIS SqlMapExecutor 직접 사용하고 싶다면 , SqlMapClientCallback 인터페이스의 구현 객체를 전달받는 execute() 메소드를 사용하면 된다 .

SqlMapClientCallback 구현 객체의 doInSqlMapClient() 메소드에 SqlMapExecutor 파라미터가 전달되므로 , 직접 SqlMapExecutor 사용해서 데이터베이스 연동을 구현할 있다 .
 

3. SqlMapClientDaoSupport 클래스를 이용한 DAO 구현

스프링은 SqlMapClientTemplate 클래스를 DAO 클래스에서 쉽게 사용할 있도록 하기 위해 SqlMapClientDaoSupport 클래스를 제공한다 .

클래스를 상속받은 클래스는 sqlMapClientTemplate 프로퍼티를 통해서 SqlMapClientTemplate 전달받는다 .



Tag iBATIS, Spring

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

[iBATIS] 5. Transaction

Posted at 2008/09/01 19:56// Posted in 나만의 작업/iBatis

5. Transaction

iBatis 지원하는 가지 트랜잭션 범위

  * 자동 트랜잭션 : 단순한 개의 SQL 구문은 명시적으로 구분된 트랜잭션을 필요로 하지 않는다 .

   * 로컬 트랜잭션 : 간단하고 범위가 좁은 트랜잭션으로 여러 SQL 구문을 포함하지만 단일 데이터베이스에서 수행된다 .

   * 글로벌 트랜잭션 : 복잡하고 범위가 넓은 트랜잭션으로 여러 SQL 구문을 여러 데이터베이스 혹은 잠재적으로 데이터베이스가 아닌 JMS 큐나 JCA 커넥션 같은 다른 트랜잭션이 가능한 리소스상에서 실행된다 .

   * 사용자 정의 트랜잭션 : 사용자 맘대로 ~



"자동 트랜잭션" 보충 설명.

JDBC는 'autocommit(자동커밋)' 모드이고 iBatis는 자동 커밋을 직접 지원하지 않고, 대신 자동 트랜잭션을 지원한다. 이는 간단한 update 구문이나 쿼리를 한 개의 메소드 호출로 수행하면서 트랜잭션을 어떻게 구분할지에 대해서 걱정할 필요가 없게 해준다. 해당 구문은 트랜잭션 내부에서 실행될 것이지만 명시적으로 트랜잭션을 시작하고 커밋하고 종료할 필요가 없다.
자동 트랜잭션 내부에서 SQL 구문을 실행하기 위해 특별히 필요한 것은 아무것도 없다. 그냥 구문을 실행하기만 하면 된다. 

더 세밀하게 제어할 필요가 있을 때는 개발자가 명시적으로 로컬 혹은 글로벌 트랜잭션을 사용해야 한다.

  1. 쇼니
    2008/09/24 11:45 [Edit/Del] [Reply]
    오~~ 구글검색~ ㅎ

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

[iBATIS] 4. How to

Posted at 2008/08/29 10:07// Posted in 나만의 작업/iBatis

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 >

 






Tag iBATIS
  1. seattle
    2008/08/30 01:54 [Edit/Del] [Reply]
    좋은 정리 감사합니다. 와우~ 요것만 보면 되는거죠? +_+

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

iBATIS


1. Overview

2. Why use iBATIS?

3. Introduce iBATIS

4. How to

5. Transaction

6. iBATIS + Spring

7. iBATIS + Spring + transaction

8. Annotation 기반으로 JUnit4를 이용한 Spring TDD

9. Reference



1. Overview

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

현재 iBatis세가지 언어: 자바, C#, Ruby구현되어 있다.

 

2. Why use iBATIS?

OR맵핑툴을 사용하지 않을때 하위레벨의 JDBC코드를 쓰거나 관리할많은 자원을 소비 한다는것이다. 모든JDBC애플리케이션은 다음과 같은 반복코드를 가진다.

 

  1. 데이터베이스연결및트랜잭션관리

  2. 쿼리파라미터를자바객체와셋팅하기.

  3. SQL ResultSets자바객체로변환하기.

  4. 쿼리문생성하기.

 

iBatis진입장벽이 낮은 프레임워크, JDBC복잡하고 반복적인 코드를 모두 없애주면서도 SQL그대로 사용하기 때문에 "익숙해서 배우기 쉬우면서, 생산성과 유지보수성을 높여 주는 프레임워크" 자바코드의20% 사용하여 JDBC기능의 80%제공하는 간단한 프레임워크

=> 빠른 JDBC 코딩을 위한 일반화된 프레임워크


3. Introduce iBATIS

iBATIS 퍼시스턴스계층의 중요한 특징: SQL 외부저장과 캡슐화=> 간결함과 일관성

 

외부로SQL :  

SQL애플리케이션소스 코드로부터 분리하여 유지. 이렇게함으로써 SQL상대적으로 특정언어나 플랫폼에 독립적인 상태가 된다. SQL문만 튜닝을 하고 싶을때 SQL문만 보낼수있다.

 

캡슐화된SQL :

캡슐화는 코드를 응집성있는 모듈로 조직하는것뿐만 아니라 또한 세부적인 구현을 숨기고 호출하는 코드에게인터페이스만을 노출시키는 모듈화의 형태

애플리케이션의 다른 부분으로부터 SQL코드를 숨겨서 SQL캡슐화 할있다.

iBATIS SQL캡슐화 하기 위해 XML사용한다. XML모든 플랫폼에 이식가능. iBATIS XML사용하여 SQL 구문의 입력과 출력을 정의

iBATIS파라미터와 실행 결과를 객체의 프로퍼티로 매핑하게 한다.

 

특징

간단함: 가장 간단한 퍼시스턴스 프레임워크로 간주됨

생산성: JDBC 비해 62% 정도 줄어드는 간결한 코드와 간단한설정

성능: 데이터접근 속도를 높여주는 join 매핑과 같은 구조적인 강점

관심사의 분리: 차후 유지보수성을 높여줄 있도록 설계를 향상 시킬있다.

작업의 분배: 전문성을 강화하기 위해 팀을 세분화하는것을돕는다(프로그램 잘짜면 프로그램짜고, 쿼리잘짜면 쿼리짜고)

이식성



Tag iBATIS
  1. seattle
    2008/08/30 01:54 [Edit/Del] [Reply]
    역시 훌륭합니다. 저도 이런거 하고 싶네요 ㅠㅠ
  2. 오우
    2009/10/12 11:10 [Edit/Del] [Reply]
    아주 체계적으로 정리를 잘해놓으셨네요.
    아이바티스 진입장벽이 낮다는 생각은 저는 아니네요.
    어렵다..??
    어쟀든 감사합니다.
    • 2009/10/12 21:04 [Edit/Del]
      방문해 주셔서 감사해요
      ^^ 이 포스팅 내용은 iBatis2를 기준으로 한 글이에요
      iBatis 3 에선 조금씩 달라졌으니 참고하세요^^

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret