이제 실제 소스를 보며 따라 해보자!!!
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
이런식으로 작성하면 된다.