Framework/iBatis

iBatis - 기본 설정

louis.dev 2009. 6. 25. 16:42


1. iBatis Library를 추가한다.

2. 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"
 />
 
<!-- JNDI사용 -->
   <transactionManager type="JDBC" >
 <dataSource type="JNDI">
   <property name="DataSource"
      value="java:comp/env/jdbc/XE"/>
 </dataSource>
   </transactionManager>
 <sqlMap resource="com/myhome/info/sql/SqlMap.xml" />
</sqlMapConfig>

/////////////////////////////////////////////////////////////////
위의 설정은 JNDI를 사용하기 때문에 JNDI설정을 해 주어야 한다.

1. Server 의 server.xml파일에 다음을 추가한다.
(33번째 줄 <GlobalNamingResources> 태그 안에 선언한다)

<Resource auth="Container"
        driverClassName="oracle.jdbc.driver.OracleDriver"
        factory="org.apache.commons.dbcp.BasicDataSourceFactory"
        maxActive="20"
        maxIdle="10" 
        maxWait="-1"
        name="jdbc/XE"
        username="user01"
        password="user01"
        type="javax.sql.DataSource"
        url="jdbc:oracle:thin:@localhost:1521:XE" />

2. Server 의 context.xml 파일의 가장 하단에 다음을 추가 한다.

<ResourceLink global="jdbc/XE"
                  name="jdbc/XE"
                  type="javax.sql.DataSource"/>


※JNDI말고 다른 방법으로 사용 할 수 있다. SqlMapConfig.xml 파일에 다음을 추가 한다.
1.simple datasource type  사용
<transactionManager type="JDBC" commitRequired="false">
        <dataSource type="SIMPLE">
            <property name="JDBC.Driver"
                      value="oracle.jdbc.driver.OracleDriver"/>
            <property name="JDBC.ConnectionURL"
                      value="jdbc:oracle:thin:@localhost:1521:XE"/>
            <property name="JDBC.Username" value="user01"/>
            <property name="JDBC.Password" value="user01"/>
        </dataSource>
    </transactionManager>

2.DBCP datasource type 사용
<properties resource=" info/model/dao/db.properties " />
     
   <transactionManager type="JDBC" >
  <dataSource type="SIMPLE">
  <property name="JDBC.Driver" value="${driver}"/>
  <property name="JDBC.ConnectionURL" value="${url}"/>
  <property name="JDBC.Username" value="${username}"/>
  <property name="JDBC.Password" value="${password}"/>
  <property name="JDBC.DefaultAutoCommit" value="true" />
  <property name="Pool.MaximumActiveConnections" value="10"/>
  <property name="Pool.MaximumIdleConnections" value="5"/>
  <property name="Pool.MaximumCheckoutTime" value="120000"/>
  <property name="Pool.TimeToWait" value="500"/>
  </dataSource>
  </transactionManager> 
////////////////////////////////////////////////////////////////

3.SqlMap.xml 파일을 생성 한다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
 "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap>
  <typeAlias alias="Info" type="com.myhome.info.dto.InfoDTO"/><!-- alias : 별칭을 잡겠다는 의미 -->
 
  <insert id="infoInsert" parameterClass="Info"><!-- typeAlias한 Info를 넣는다 없으면 com.. 그대로 넣어도 된다. -->
   INSERT INTO INFO
    (NUM, NAME, SEX, TEL, WDATE)
   VALUES
    (NUMSEQ.NEXTVAL, #name#, #sex#, #tel#, #wdate#)<!-- ## Info 안에 가지는 프로퍼티 대소문자가 정확하게 맞아야 한다. -->
  </insert>
 
  <statement id="infoList" resultClass="Info">
   SELECT NUM, NAME, SEX, TEL, WDATE
   FROM INFO
  </statement>
 
</sqlMap>

4.SQLManager.java 파일 생성
package com.myhome.manager;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

public abstract class SQLManager {
 
 private SqlMapClient sc = null;
 
 public SQLManager(){
  try{
   sc = SqlMapClientBuilder.buildSqlMapClient(
            Resources.getResourceAsReader(
              "com/myhome/info/sql/SqlMapConfig.xml"));
  }catch(java.io.IOException ie){
   ie.printStackTrace();
  }
 }
 
 public SqlMapClient getSqlMap(){
  return sc;
     }
}

5.DAO에서 다음과 같이 사용
package com.myhome.info.dao;

import com.myhome.info.dto.InfoDTO;
import com.myhome.manager.SQLManager;
import java.sql.SQLException;
import java.util.List;

public class InfoDAO extends SQLManager{
 /*등록부분*/
 public void register(InfoDTO dto) throws SQLException{
  this.getSqlMap().insert("infoInsert",dto);
 }
 
 /*회원 리스트 부분*/
 @SuppressWarnings("unchecked")
 public List<InfoDTO> getAllQuery(){
  List<InfoDTO> list = null;
  try {
   list = (List<InfoDTO>)this.getSqlMap().queryForList("infoList");
  } catch (SQLException e) {
   e.printStackTrace();
  }
  return list;
 }
}


☆SqlMapConfig.xml의 추가 사항

1.전체적인 내용
 
<?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/>

    <properties resource=" db.properties " />

    <transactionManager></transactionManager>

    <sqlMap></sqlMap>

</sqlMapConfig>

위에서 가장 중요한 것은 transactionManager 와 sqlMap부분이며 setting과 properties resource 는 선택 사항이다.

2. settings의 내용들
cacheModelsEnalbe ="true" : SqlMapClient를 위한 모든 캐쉬모델을 가능하게 하거나 가능하지 않게 한다.
이것은 디버깅시 도움이 된다.
enhancernetEnable="true" : 향상된 lazy로딩처럼 최적화된 자바빈즈 속성 접근을 위해 런타임시 바이트코드 향상을 가능하게 한다.
lazyLoadingEnabled="true" : SqlMapClient 를 위한 모든 lazy로딩ㅇ르 가능하게 하거나 가능하지 않게 한다.
maxRequests="32" : 한꺼번에 SQL을 실행할 스래드 수이고 2에n승으로 확장할 수 있고 128이 맥시멈이다.
maxSession="10" : 주어진 시간동안 활성화 될 수 있는 세션 수
maxTransaction="5" : 한꺼번에 SqlMapClient.startTransaction()에 들어갈 수 있는 스레드의 최대 갯수
useStatementNamespaces ="false"
 

3. db.properties 파일 설정
 


driver=oracle.jdbc.driver.OracleDriver


url=jdbc:oracle:thin:@localhost:1521:XE


username=user01

password=mypwd