Java

iBATIS 사용법-3

griffy 2010. 7. 2. 11:27

이제 실제 소스를 보며 따라 해보자!!!

1. ibatis.persistent.sqlmapdao.sql.sql-map-config.xml

<?xml version="1.0" encoding="EUC-KR" ?>

<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
 "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
 <properties resource="ibatis/properties/ds_mobile.properties"/>

 <settings
  cacheModelsEnabled="true"
  enhancementEnabled="true"
  lazyLoadingEnabled="true"
  maxTransactions="8"
  maxSessions="64"
  maxRequests="128"
  useStatementNamespaces="true"           //네임스페이스 사용여부, 네임스페이스는 많은 sql들의 이름중에서 같은게 있을 경우 프로젝트별로 test.insertsql 이런식으로 구분하기 위해 사용...
 />

 <transactionManager type="JDBC" >
  <dataSource type="SIMPLE">
   <property name="JDBC.Driver" value="${JDBCDriver}"/>    //properties에 있는 리소스를 여기처럼 가져다 쓸 수 있다.
   <property name="JDBC.ConnectionURL" value="${JDBCConnectionURL}"/>
   <property name="JDBC.Username" value="${user}"/>
   <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"/>

   <property name="Pool.PingQuery" value="select 1 from ACCOUNT"/>
   <property name="Pool.PingEnabled" value="false"/>
   <property name="Pool.PingConnectionsOlderThan" value="1"/>
   <property name="Pool.PingConnectionsNotUsedFor" value="1"/>
  </dataSource>
 </transactionManager>

 <sqlMap resource="ibatis/persistent/sqlmapdao/sql/product.xml" />   //요게 실제 SQL문이 담겨있는 xml이다.
</sqlMapConfig>

이럼 우선 ibatis의 DB연결이 끝났다. 초 간단 킹왕짱 쉽지 않은가? .. 미안하다..

이제 두번째로 이렇게 연결된 것중 sql은 어떤 문법으로 작성되어야 하는가???


2.ibatis/persistent/sqlmapdao/sql/product.xml

<?xml version="1.0" encoding="EUC-KR" ?>

<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
 "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="EventGift">
 <typeAlias alias="gift" type="ibatis.domain.EventGift"/>   //내가 사용할 POJO를 미리 선언한다. EventGift는 gift로 별명을 줄것이다!!
 
 <select id="getEventGift" resultClass="gift"><![CDATA[
  SELECT * FROM MEDIA_EVENT_GIFT
  WHERE bcheck='N' and win_date <= #win_date#      //##으로 둘러쌓인곳은 POJO에서 getter로 자동 가져온다.
 ]]></select>

 <update id="updateEventGift" parameterClass="gift"><![CDATA[
  UPDATE MEDIA_EVENT_GIFT SET BCHECK = 'Y', cphone=#cphone# 
  WHERE SEQ=#seq#
 ]]></update>

 <insert id="insertEventGift" parameterClass="gift"><![CDATA[
  INSERT INTO MEDIA_EVENT_GIFT (SEQ, GIFT_NAME, GIFT_NUMBER, WIN_DATE, SVCCODE, EVENT, BCHECK)
  VALUES (MEDIA_EVENT_GIFT_SEQ.nextval, #gift_name#, #gift_number#, #win_date#, #svccode#, #event#, #bcheck#)
 ]]></insert>
 
 <insert id="deleteEventGift" parameterClass="gift"><![CDATA[
  DELETE FROM MEDIA_EVENT_GIFT WHERE cphone=#cphone# AND SEQ = #seq#
 ]]></insert> 
 
</sqlMap>

이 작업까지 완성되었다면 ibatis로 DB에 연결하고 그 DB를 이용해서 SQL문을 입력할 준비까지 모두 마친 것이다. 이 XML 두개로 기존 DB를 열고 select해서 resultset을 다 가져다가 하나씩 POJO에 세팅 하는 작업을 대체하게 되는것이지...

그럼 이제 이 XML로 세팅된 properties를 가져다가 JAVA에서 사용을 해야하겠지???? 무브. 무브~~


3. ibatis.persistent.SqlMapFactory

package ibatis.persistent;

import java.io.Reader;

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

/**
 * SqlMapClient의 Instance 리턴.
 *
 * @since 2007. 11. 27
 * @author mose2005 
 */
public class SqlMapFactory {
 private static final SqlMapClient sqlMap;

 //아까 설정한 sql-map properties를 가져와서 SqlMapClient 객체로 만들어요

 static{
  try{
   String resource = "ibatis/persistent/sqlmapdao/sql/sql-map-config.xml";  
   Reader reader = Resources.getResourceAsReader(resource);
   sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
  }catch(Exception e){
   e.printStackTrace();
   throw new RuntimeException("Error initializing SqlMapObject : " + e );
  }
 }
 
//다들 잘 아시는 싱글턴이져~~~
 public static SqlMapClient getInstance(){
  return sqlMap;
 }
}


위에처럼 설정한 ibatis 정보를 가져다가 SqlMapClient 객체로 만들었다. 이제 저 객체를 가지고 sql이름을 불러주면 내게로 와서 꽃이 되겠구나!!!!  그럼 이제 이 DAO에서 메소드를 제공해줘야겠지??? 메소드 고고!!

4. ibatis.persistent.sqlmapdao.EventGiftDao

package ibatis.persistent.sqlmapdao;

import java.sql.SQLException;
import java.util.List;

import ibatis.domain.EventGift;                       //POJO
import ibatis.persistent.SqlMapFactory;          //아까 그 ibatis 싱글턴 객체 넘겨주는곳
import ibatis.persistent.iface.iEventGiftDao;    //인터페이스.. 그냥 구색 맞출려고 넣었다. 작은 프로젝트에서 인터페이스는 사치지....

import com.ibatis.sqlmap.client.SqlMapClient;

/**
 * EventGiftDao
 *
 * @since 2007. 11. 27
 * @author mose2005 
 *
 */
public class EventGiftDao implements iEventGiftDao {
 
 private static SqlMapClient sqlMap = SqlMapFactory.getInstance();

 public List getEventGift(String todate) throws SQLException {
  return (List)sqlMap.queryForList("EventGift.getEventGift", todate);
 }

 /**
  * 필수 : gift_name, gift_number, win_date, svccode, event, bcheck
  */
 public void insertEventGift(EventGift eventGift) throws SQLException {
  sqlMap.insert("EventGift.insertEventGift", eventGift);
 }

 /**
  * 필수 : cphone, seq
  */
 public int updateEventGift(EventGift eventGift) throws SQLException {
  return sqlMap.update("EventGift.updateEventGift", eventGift);
 }
 
 /**
  * 필수 : cphone, seq
  */
 public int deleteEventGift(EventGift eventGift) throws SQLException {
  return sqlMap.update("EventGift.updateEventGift", eventGift);
 }
 
}

머 딱히 설명할께 없다.. 그냥 아까 xml에 적었던 SQL 문을 사용할 수 있게 메소드 제공하는 기능이다.

대략 여기까지 persistent 폴더에 담긴 파일 설명을 다 했다.

너무 간단하게 했나???? 덧붙임이 필요하신 분은 아래 댓글로..

그럼 다음편에서 이걸 사용하기 위한 presentation 부분을 보자..
머 ibatis를 사용하려면 위 내용으로 충분하지만 이왕 만든거 사용하는 부분도 알아야 할거 아닌가???



아 참고로 DB properties는 
JDBCDriver=oracle.jdbc.driver.OracleDriver
JDBCConnectionURL=jdbc:oracle:thin:@127.0.0.1:1521:DBTEST
user=test
password=test
이런식으로 작성하면 된다.