카테고리 보관물: Apache Project/Ibatis/Mybatis

IBatis에서 MSSQL의 여러개 카탈로그에 접속하기

에고…
IBatis에서 MSSQL2000 인스턴스의 카탈로그에 접속하기 위해서 한참을 헤메서 겨우 찾았네요.. ^^;;

아래는 해결책입니다.. ^^;;

해결책은 인스턴스의 실제 TCP 포트로 접속하면 됩니다.. ^^;;
넘 간단한가?? ㅋㅋ

iBatis에서 MSSQL의 Insert문의 리턴 값 가져오기

Apache iBatis에서 MSSQL DB에 Insert시에 리턴값을 받아오는 형태입니다.

1. 코드
int key = (int)sqlMap.Insert(“InsertOrganization”, organization);

2. xml 내용

<insert id=”InsertOrganization” parameterClass=”Organization” resultClass=”int”>  
    <selectKey property=”Id” type=”post” resultClass=”int”>  
        SELECT @@IDENTITY AS value  
    </selectKey>              
    INSERT INTO Organizations  
        (Org_Code, Org_Name)   
    VALUES   
        (#Code#, #Name#)  
</insert>  

DBCP와 iBatis를 통한 Connection Pooling 사용기

내용의 출처는 http://www.mimul.com/pebble/default/2007/12/09/1197199680000.html 입니다.

프로젝트 개발을 하다보면 light한 환경을 요하는 경우가 있습니다. 이럴 경우 spring framework를 대신하여 dbcp +
ibatis를 가지고 개발을 진행하는 경우도 발생할 것입니다. 이럴 경우 유용하리라 생각되어 설치과정을 공유합니다.
일단 Tomcat
환경에서 설치 과정을 설명하겠습니다.

1. DBCP 설치
 – 실치 과정은 여기
가시면 설치과정을 설명해 놓았습니다.
 
2. iBatis 설치
 – 여기에 가서 다운로드
 –
${ProjectWebRoot}/WEB-INF/lib에 ibatis-2.3.0.677.jar 카피

3.
sqlmap.xml 정의

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
        PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
        "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
    <properties resource="com/mimul/dwr/app/resource/database.properties"/>
    <settings
            cacheModelsEnabled="true"
            enhancementEnabled="true"
            lazyLoadingEnabled="true"
            maxRequests="40"
            maxSessions="20"
            maxTransactions="5"
            useStatementNamespaces="false"
            />
    <transactionManager type="JDBC">
        <dataSource type="DBCP">
            <property name="driverClassName" value="${driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>

            <!-- OPTIONAL PROPERTIES BELOW -->
                <property name="initialSize" value="5"/>
                <property name="maxActive" value="30"/>
                <property name="maxIdle" value="20"/>
                <property name="maxWait" value="60000"/>
                <property name="poolPreparedStatements" value="true"/>
                <property name="validationQuery" value="select 0 from dual"/>
                <property name="testOnBorrow" value="true"/>
                <property name="maximumActiveConnections" value="10"/>
                <property name="maximumIdleConnections" value="5"/>
                <property name="maximumWait" value="60000"/>
                <property name="logAbandoned" value="false"/>
                <property name="removeAbandoned" value="false"/>
                <property name="removeAbandonedTimeout" value="50000"/>
        </dataSource>
    </transactionManager>
    <sqlMap resource="com/mimul/dwr/app/sql/Mimul.xml"/>
</sqlMapConfig>

4.
com/mimul/dwr/app/resource/database.properties 정의

driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@mimuluserdb:1521:mimuluser
username=mimuluser
password=mimuluser

5.
com/mimul/dwr/app/sql/Mimul.xml 정의

 – DDL2iBatis.exe를 활용하여 자동
생성하게 하는 것이 개발 속도가 올라갑니다.

<?xml version='1.0'?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
    "http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="Mimul">
    <cacheModel id="mimul-cache" type="MEMORY">
        <flushInterval hours="24"/>
        <flushOnExecute statement="insertMimul"/>
        <flushOnExecute statement="updateMimul"/>
        <flushOnExecute statement="deleteMimul"/>
        <property name="reference-type" value="WEAK" />
    </cacheModel>
    <resultMap class="com.mimul.dwr.model.Mimul" id="mimul-result" >
        <result property="lseq" column="lseq" />
        <result property="sseq" column="sseq" />
        <result property="assetid" column="assetid" />
        <result property="title" column="title" />
        <result property="imgurl" column="imgurl" />
        <result property="vodurl" column="vodurl" />
        <result property="use" column="use" />
        <result property="chgdate" column="chgdate" />
    </resultMap>
    <select id="getMimul" resultClass="com.mimul.dwr.model.Mimul"
parameterClass="Integer" >
        <![CDATA[
            SELECT lseq, sseq, assetid, title, imgurl, vodurl, use, chgdate
            FROM   mimul
            WHERE  lseq = #lseq#
        ]]>
    </select>
    <update id="updateMimul" parameterClass="com.mimul.dwr.model.Mimul" >
        <![CDATA[
            UPDATE mimul
            SET    sseq = #sseq#,  assetid = #assetid#,  title = #title#, 
imgurl = #imgurl#,  vodurl = #vodurl#,  use = #use#, 
chgdate = #chgdate#
            WHERE  lseq = #lseq#
        ]]>
    </update>
    <insert id="insertMimul" parameterClass="com.mimul.dwr.model.Mimul" >
        <selectKey resultClass="int"  keyProperty="lseq" >
            SELECT mimul_lseq_seq.nextval as lseq FROM dual
        </selectKey>
        INSERT INTO mimul (lseq, sseq, assetid, title, imgurl, vodurl,
use, chgdate)
        VALUES (#lseq#, #sseq#, #assetid#, #title#, #imgurl#, #vodurl#,
#use#, #chgdate#)
    </insert>
    <delete id="deleteMimul" parameterClass="com.mimul.dwr.model.Mimul" >
        <![CDATA[
            DELETE FROM mimul
            WHERE  lseq = #lseq#
        ]]>
    </delete>
</sqlMap>

6. 
DAO에서 사용하기 위한 SqlConfig 객체 정의(dbcp+ibatis연결 정보 정의)

import java.io.File;
import java.io.Reader;

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

public class SqlConfig {
    private static SqlMapClient sqlMap = null;
    private static SqlConfig instance_ = null;
  
    private SqlConfig() throws Exception
    {
        Reader reader = null;
        StringBuffer rsc = null;
        try {
            if (sqlMap == null) {
                rsc = new StringBuffer(200);
                rsc.append("com").append(File.separator);
                rsc.append("jaeminara").append(File.separator);
                rsc.append("dwr").append(File.separator);
                rsc.append("app").append(File.separator);
                rsc.append("sql").append(File.separator).append("sqlmap.xml");
             reader = Resources.getResourceAsReader(rsc.toString());
             sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
             reader.close();
            }
        } catch (Exception e) {
            System.out.println(e);
            throw e;
        } finally {
            if (reader != null)
                reader.close();
            reader = null;
            rsc = null;
        }
    }
  
    public static SqlConfig instance()
    {
        try {
            if (instance_ == null) {
                synchronized (SqlConfig.class) {
                    if (instance_ == null)
                        instance_ = new SqlConfig();
                }
            }
        } catch (Exception e) {
            System.out.println(e);
        }
        return instance_;
    }

    /**
    * Return SqlMapClient for SDP schema
     *
     * @return
     */
    public static SqlMapClient getSqlMapInstance()
    {
        return sqlMap;
    }
}

7. DAO 클래스 정의

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.ibatis.sqlmap.client.SqlMapClient;
import com.mimul.common.log.LogPool;
import com.mimul.dwr.model.getMimulByLSEQ;

public class MimulDao
{
    private SqlMapClient smc =
SqlConfig.instance().getSqlMapInstance();
  
    public void MimulDao() {}
  
    public Mimul getMimulByLSEQ(int lseq) throws Exception
    {
        Mimul mimul = null;

        try {
            if (lseq == 0) {
                LogPool.instance("DAO").debug("getMimulByLSEQ() : Parameter is null!");
                return null;
            }
        mimul = (Mimul) smc.queryForObject("getMimul", lseq);
        } catch (Exception e) {
            LogPool.instance("DAO").error(e);
            throw e;
        }
        return mimul;
    }
    // 기타 필요한 함수 정의
}

크게
어려운 점은 없습니다. 그리고 transaction 무결성을 보장하기 위해서는 executor.startBatch();와
executor.executeBatch(); transaction 처리 로직을 넣으시면 됩니다.
나머진 자동으로 iBatis에서 트랜젝션
자원의 할당 및 해지의 라이프사이클을 관리해 줍니다.