2012년 8월 24일

iBatis 란?


iBatis란 ?

  • SQL 구문의 실행 결과를 객체에 매핑하는 Data Mapper
  • 테이블 구조가 복잡해지고 정규화되어 있지 않더라도 사용이 가능
  • 기존에 사용하던 SQL을 그대로 사용하므로 배우기가 쉽다.

중요한 것은 xml 을 이용하여 sql문을 호출하여서 메모리 캐쉬에 가지고 있다가
결과값을 자바 객체에 맵핑 시켜주는 방법으로 jdbc 코딩시 매번 코딩해주었던
부분들을 모두 줄일수 있고 메모리 또한 효율적으로 관리 할 수 있다.
framework를 사용함으로서 시스템 또한 가벼워질수 있다.

***sql-map-config.xml
<sqlMapConfig>

  <properties resource="jdbc.properties" />

  <settings 
    cacheModelsEnabled="true" 
    enhancementEnabled="true"
    lazyLoadingEnabled="true" 
    maxRequests="32" 
    maxSessions="10"
    maxTransactions="5" 
    useStatementNamespaces="false" />
  
  <typeAlias alias="Account" type="kr.or.openframework.domain.Account"/>
  <typeAlias alias="Family" type="kr.or.openframework.domain.AccountFamily"/>

  <transactionManager type="JDBC">
    <dataSource type="DBCP">
      <property name="JDBC.Driver"
        value="${mysql.jdbc.driverClassName}" />
      <property name="JDBC.ConnectionURL"
        value="${mysql.jdbc.url}" />
      <property name="JDBC.Username"
        value="${mysql.jdbc.username}" />
      <property name="JDBC.Password"
        value="${mysql.jdbc.password}" />
      <property name="JDBC.DefaultAutoCommit" value="true" />
    </dataSource>
  </transactionManager>

  <sqlMap resource="kr/or/openframework/dao/ibatis/MySQLAccount.xml" />
</sqlMapConfig>


이 파일을 통하여 jdbc에 연결하고 sql에서 사용하는 각종 설정들을 셋팅해준다
설정들의 셋팅 정의는 


Property Name비고
enhancementEnabled런타임시 바이트코드 향상을 가능하게 한다.
useStatementNamespacesql 호출시 namespace 사용 여부
maxRequest한꺼번에 SQL문을 수행할 수 있는 쓰레드의 수를 정의
maxSession주어진 시간동안 활성화될 수 있는 세션의 수
maxTransaction한꺼번에 SqlMapClient.startTransaction()에 들어갈 수 있는 쓰레드의 최대 갯수


***sql map 부분
<sql id="selectAccount_frag">
select
  acc_id,
  acc_first_name,
  acc_last_name,
  acc_email
from account
</sql>

<select id="selectAccountById" parameterClass="int" resultClass="Account">
<include refid="selectAccount_frag"/>
where acc_id = #id#
</select>

<insert id="insertAccount" parameterClass="Account">
insert into account (
  acc_id,
  acc_first_name,
  acc_last_name,
  acc_email
) values (
  #id#, #firstName#, #lastName#, #emailAddress#
)
</insert>

<update id="updateAccount" parameterClass="Account">
update account set
  acc_first_name = #firstName#,
  acc_last_name = #lastName#,
  acc_email = #emailAddress#
where acc_id = #id#
</update>

<delete id="deleteAccount" parameterClass="int">
delete from account
where acc_id = #id#
</delete>


****자바소스

private static SqlMapClient sqlMapper;

static {
  try {
    // log4j setting
    Properties configProps = new Properties();
    ClassLoader classLoader = ClassLoader.getSystemClassLoader();
    InputStream inputStream = classLoader.getResourceAsStream("log4j.xml");
    configProps.load(inputStream);     
    PropertyConfigurator.configure(configProps);

    // iBATIS SQLMaps setting
    Reader reader = Resources.getResourceAsReader("kr/or/openframework/dao/ibatis/SqlMapConfig.xml");
    sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
    reader.close();
  } catch (IOException e) {
    throw new RuntimeException("Something bad happened while building the SqlMapClient instance." + e, e);
  }
}

public static Account selectAccountById(int id) throws SQLException {
  return (Account) sqlMapper.queryForObject("selectAccountById", id);
}
public static String insertAccount(Account account) throws SQLException {
  sqlMapper.insert("insertAccount", account);
  return "SUCCESS";
}
public static String updateAccount(Account account) throws SQLException {
  sqlMapper.update("updateAccount", account);
  return "SUCCESS";
}

public static String deleteAccount(int id) throws SQLException {
  sqlMapper.delete("deleteAccount", id);
  return "SUCCESS";
}


이렇게 xml파일로 sql문을 생성하고 맵핑 시킨 상태에서
자바소스로 메소드 호출 하듯이 xml tag를 호출시켜서 결과 값을 객체에
맵핑 시킨다 . 때문에 자바소스에서 sql문이 없어졌고 불필요한 부분이
삭제된 간결한 코드가 완성 되었다

댓글 없음:

댓글 쓰기