Background Image
Java
2009.05.19 02:57

iBATIS framework with CUBRID

조회 수 54546 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
iBATIS framework with CUBRID

소개: 본 문서는 보다 편리하게 CUBRID를 사용할 수 있도록 지원 할 수 있는 Java 기반 프레임워크인 iBATIS를 큐브리드에 사용하는 방법을 설명한다.

iBatis는 데이터베이스에 있는 자원들을 보다 편리하게 가져오기 위한 프레임워크이다. 하지만 DB에 있는 테이블과 자바 객체간의 직접적인 동기화를 이루는 ORM(Object Relational Mapper)는 아니며, 자바빈즈를 PreparedStatement의 바인드 변수인 파라미터와 ResultSet으로 맵핑시켜주는 기능으로 지금에 와서는 SQL Maps 또한 ORM이라고도 한다.

 

적용 대상: CUBRID ALL

1.   적용 환경

본 문서는 아래와 같은 환경에서 적용 되었다.

JDK 또는 JRE 버전1.5 (JDK 1.5 이상에서 작동)

Tomcat 6.x       (Tomcat 5.x 이상에서 작동)

iBATIS Release 2.3.4 ( iBATIS 2.x 이상에서 작동)

 

 2.   iBATIS 개요

 

다음과 같은 iBATIS sqlMapConfig.xml 에서 JDBC connection 획득할 JDBC정보를 정의한 <dataSource> element, 트랜잭션 타입을 정의하는 <transactionManager> element , Mapped Statements 관리 하는 <sqlMap> element 정의 한다.

iBatis 이용할 장점

iBATIS

JDBC

비고

Connection 관리

O

X

iBATIS Connection 관리를  해줌

SQL

X

X

 

Statement/PrepareStatement 관리

O

X

iBATIS Statement 관리

ResultSet 관리

O

X

iBATIS ResultSet 처리를 해줌( Java Beans, Java Map, Primitive Type, XML)

Parameter Setting

O

X

iBATIS Parameter Setting 해줌

Transaction 관리

O

X

iBATIS에서 Transaction 지원(JTA,JDBC)

 

예제) sqlMapConfig.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>

               <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="cubrid.jdbc.driver.CUBRIDDriver" />

                                              <property name="url" value="jdbc:cubrid:localhost:33000:demodb:::" />

                                              <property name="username" value="dba" />

                                              <property name="password" value="dba" />

                                              <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 db_root" />

                                              <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="cubrid/Account.xml" />

</sqlMapConfig>

3.  iBATIS 설치

3.1 설치 방법

먼저 http://ibatis.apache.org/javadownloads.cgi 에서 "iBATIS R2.3.4" 을 다운로드 받는다.

다운로드 받은 iBATIS의 압축을 풀어 TOMCAT 서버의 Context ROOT 디렉토리에 옮긴다.

만약 톰캣 설치 경로가 C:/tools/tomcat6.0 이라면 다음과 같은 위치에 파일을 옮긴다.

 C:tools/tomcat6.0/webapps/ROOT/WEB-INF/lib 디렉토리에 ibatis-2.3.4.726.jar 파일을 옮긴다.

3.2 CUBRID JDBC 드라이버 설치

CUBRID JDBC 드라이버 설치를 위해서는 CUBRID 홈페이지나 nFORGE CUBRID 프로젝트에서 CUBRID를 다운받아 설치하여야 한다.

CUBRID의 설치방법은 본 문서에서는 특별히 언급 하지 않으며, CUBRID 설치 가이드 등을 참고하여 설치한다.

기본값으로 큐브리드를 설치하였다면, C:CUBRIDjdbc cubrid_jdbc.jar 이라는 이름의 JDBC 드라이버가 설치 되었을 것이다.

CUBRID jdbc driverC:tools/tomcat6.0/lib 이나 C:tools/tomcat6.0/webapps/ROOT/WEB-INF/lib 디렉토리로 copy한다.

4. iBATIS 설정

4.1 JDBC 정보 설정 <dataSource> Element

JDBC 접근을 위하여 iBATIS <dataSource> Element 지원한다.

지원하는 타입은 다음과 같이 3가지 타입을 지원한다..

l  SimpleDataSourceFactory

SimpleDataSoruce는 데이터소스를 제공하는 컨테이너가 없는 경우에 connection을 제공하기 위해 기본적으로 풀링(pooling)데이터소스 구현을 제공한다. 이것은 iBATIS SimpleDataSource connection풀링을 기초로 한다.

예제)

<transactionManager type = "JDBC">
        <dataSource type = "
SIMPLE
">
            <property name = "JDBC.Driver" value = "
cubrid.jdbc.driver.CUBRIDDriver "/>
            <property name = "JDBC.ConnectionURL" value = "
jdbc:cubrid:localhost:33000:demodb:::
"/>
            <property name = "JDBC.Username" value = "dba"/>
            <property name = "JDBC.Password" value = ""/>
            <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 db_root"/>
            <property name = "Pool.PingEnabled" value = "false"/>
            <property name = "Pool.PingConnectionsOlderThan" value = "1"/>
            <property name = "Pool.PingConnectionsNotUsedFor" value = "1"/>
        </dataSource>
    </transactionManager>

l  DbcpDataSourceFactory

이 구현물은 DataSource API를 통해 connection플링서비스를 제공하기 위해 Jakarta DBCP(Database Connection Pool)를 사용한다. DataSource는 애플리케이션/웹 컨테이너가 DataSource구현물을 제공하지 못하거나 standalone애플리케이션을 구동할 때 이상적이다. DbcpDataSourceFactory를 위해 명시해야 하는 설정파라미터의 예제는 다음과 같다.

예제)

<transactionManager type = "JDBC">
   <dataSource type="DBCP">

                                              <property name="driverClassName" value="cubrid.jdbc.driver.CUBRIDDriver" />

                                              <property name="url" value="jdbc:cubrid:localhost:33000:demodb:::" />

                                              <property name="username" value="dba" />

                                              <property name="password" value="" />

                                              <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>

l  JndiDataSourceFacotry

이 구현물은 애플리케이션 컨테이너내 JNDI컨텍스트로부터 DataSource구혐물을 가지고 온다. 이것은 전형적으로 애플리케이션 서버를 사용중이고 컨테이너 관리 connection풀 그리고 제공되는 DataSource구현물이 있을 때 사용한다. JDBC DataSource구현물에 접근하기 위한 표준적인 방접은 JNDI컨텍스트를 통하는 것이다. JndiDataSourceFactory JNDI를 통해 DataSource에 접근하는 기능을 제공한다. 데이터소스내에 명시되어야 하는 설정 파라미터는 다음과 같다.

예제)

<transactionManager type = "JTA">
    <property name = "UserTransaction" value = "java:/ctx/con/UserTransaction"/>
    <dataSource type = "JNDI">
        <property name = "DataSource" value = "java:comp/env/jdbc/cubridDataSource"/>
    </dataSource>
</transactionManager>

JNDI 설정은 http://www.cubrid.com/zbxe/bbs_developer_tutorial/32358/page/2 DBCP 설정법을 참고 바란다.

4.2 JDBC 정보 설정 <transactionManager> Element

iBATIS 에서는 트랜잭션 관리를 위하여 < transactionManager> Element 지원한다.

지원하는 타입은 아래와 같이 JDBC, JTA, EXTERNAL 3가지 타입을 지원한다.

l  JDBC

Connection commit() rollback()메소드를 통해 트랜잭션을 제어하기 위한 JDBC를 사용하게 된다.

l  JTA

트랜잭션관리자는 SQL Maps가 다른 데이터베이스나 트랜잭션 자원을 포함하는 더욱더 넓은 범위의 트랜잭션을 포함하도록하는 JTA전역트랜잭션을 사용한다. 이 설정은 JNDI자원으로부터 사용자 트랜잭션을 위치시키기 위한 UserTransaction 속성값을 요구한다.

l  EXTERNAL

이것은 당신 자신이 트랜잭션을 관리하도록 한다. 당신은 여전히 데이터 소스를 설정할 수 있지만 프레임워크 생명주기의 부분처럼 트랜잭션이 커밋되거나 롤백되지 않는다. 이것은 당신 애플리케이션의 부분이 외부적으로 SQL Maps 트랜잭션을 관리해야 한다는 것이다. 이 셋팅은 비-트랜잭션(예를 들면 읽기전용)데이터베이스에 유용하다.

4.3 JDBC 정보 설정 <sqlMap> Element

sqlMap요소는 명시적으로 SQL Map이나 다른 SQL Map설정파일을 포함할 때 사용한다. SqlMapClient인스턴스에 의해 사용되는 각각의 SQL Map XML파일은 반드시 선언되어야 한다. SQL Map XML파일은 클래스패스나 URL 로부터 스트림(stream) 자원처럼 로드될 것이다. 당신은 SQL Maps를 명시해야 하면 아래와 같다.

<!-- CLASSPATH RESOURCES -->
<sqlMap resource = "com/ibatis/examples/sql/Customer.xml"/>
<sqlMap resource = "com/ibatis/examples/sql/Account.xml"/>
<sqlMap resource = "com/ibatis/examples/sql/Product.xml"/>

<!-- URL RESOURCES -->
<sqlMap url = "file:///c:/config/Customer.xml"/>
<sqlMap url = "file:///c:/config/Account.xml"/>
<sqlMap url = "file:///c:/config/Product.xml"/>

4.4 JDBC 정보 설정 <settings> Element

더 상세한 설정은 다음의 URL에서 한글로 작성된 pdf매뉴얼을 참조 하기 바란다.

http://svn.apache.org/repos/asf/ibatis/trunk/java/ibatis-2/ibatis-2-docs/ko/iBATIS-SqlMaps-2_ko.pdf

http://svn.apache.org/repos/asf/ibatis/trunk/java/ibatis-2/ibatis-2-docs/ko/iBATIS-SqlMaps-2-Tutorial_ko.pdf

5. iBATIS 사용

샘플 프로그램

5.1  iBatis 설정 파일 생성 : C:toolstomcat6.0webappsROOTWEB-INFclassescubrid Account.xml , Account.class, SimpleDao.class, SqlMapConfig.xml 을 작성 한다.

 

SqlMapConfig.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>

                    <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="cubrid.jdbc.driver.CUBRIDDriver" />

                                                             <property name="url" value="jdbc:cubrid:localhost:33000:demodb:::" />

                                                             <property name="username" value="dba" />

                                                             <property name="password" value="" />

                                                             <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 db_root" />

                                                             <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="cubrid/Account.xml" />

</sqlMapConfig>

 

 

Account.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 namespace="Account">

 

  <!-- Use type aliases to avoid typing the full classname every time. -->

  <typeAlias alias="Account" type="cubrid.Account"/>

 

  <!-- Result maps describe the mapping between the columns returned

       from a query, and the class properties.  A result map isn't

       necessary if the columns (or aliases) match to the properties

       exactly. -->

  <resultMap id="AccountResult" class="Account">

    <result property="id" column="ACC_ID"/>

    <result property="firstName" column="ACC_FIRST_NAME"/>

    <result property="lastName" column="ACC_LAST_NAME"/>

    <result property="emailAddress" column="ACC_EMAIL"/>

  </resultMap>

 

  <!-- Select with no parameters using the result map for Account class. -->

  <select id="selectAllAccounts" resultMap="AccountResult">

    select * from ACCOUNT

  </select>

 

  <!-- A simpler select example without the result map.  Note the

       aliases to match the properties of the target result class. -->

  <select id="selectAccountById" parameterClass="int" resultClass="Account">

    select

      ACC_ID as id,

      ACC_FIRST_NAME as firstName,

      ACC_LAST_NAME as lastName,

      ACC_EMAIL as emailAddress

    from ACCOUNT

    where ACC_ID = #id#

  </select>

   

  <!-- Insert example, using the Account parameter class -->

  <insert id="insertAccount" parameterClass="Account">

    insert into ACCOUNT

    values (

      #id#, #firstName#, #lastName#, #emailAddress#

    )

  </insert>

 

  <!-- Update example, using the Account parameter class -->

  <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 example, using an integer as the parameter class -->

  <delete id="deleteAccountById" parameterClass="int">

    delete from ACCOUNT where ACC_ID = #id#

  </delete>

 

</sqlMap>

 

Account.java

package cubrid;

public class Account {

 

  private int id;

  private String firstName;

  private String lastName;

  private String emailAddress;

 

  public int getId() {

    return id;

  }

 

  public void setId(int id) {

    this.id = id;

  }

 

  public String getFirstName() {

    return firstName;

  }

 

  public void setFirstName(String firstName) {

    this.firstName = firstName;

  }

 

  public String getLastName() {

    return lastName;

  }

 

  public void setLastName(String lastName) {

    this.lastName = lastName;

  }

 

  public String getEmailAddress() {

    return emailAddress;

  }

 

  public void setEmailAddress(String emailAddress) {

    this.emailAddress = emailAddress;

  }

 

}

 

SimpleDao.java

 

package cubrid;

 

import java.io.IOException;

import java.io.Reader;

import java.sql.SQLException;

import java.util.List;

 

import com.ibatis.common.resources.Resources;

import com.ibatis.sqlmap.client.SqlMapClient;

import com.ibatis.sqlmap.client.SqlMapClientBuilder;

 

public class SimpleDao {

 

               /**

                * SqlMapClient instances are thread safe, so you only need one. In this

                * case, we'll use a static singleton. So sue me. ;-)

                */

               private static SqlMapClient sqlMapper;

 

               /**

                * It's not a good idea to put code that can fail in a class initializer,

                * but for sake of argument, here's how you configure an SQL Map.

                */

               static {

                               try {

                                              Reader reader = Resources

                                                                            .getResourceAsReader("cubrid/SqlMapConfig.xml");

                                              sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);

                                              reader.close();

                               } catch (IOException e) {

                                              // Fail fast.

                                              throw new RuntimeException(

                                                                            "Something bad happened while building the SqlMapClient instance."

                                                                                                           + e, e);

                               }

               }

 

               public static List selectAllAccounts() throws SQLException {

                               return sqlMapper.queryForList("selectAllAccounts");

               }

 

               public static Account selectAccountById(int id) throws SQLException {

                               return (Account) sqlMapper.queryForObject("selectAccountById", id);

               }

 

               public static void insertAccount(Account account) throws SQLException {

                               sqlMapper.insert("insertAccount", account);

               }

 

               public static void updateAccount(Account account) throws SQLException {

                               sqlMapper.update("updateAccount", account);

               }

 

               public static void deleteAccount(int id) throws SQLException {

                               sqlMapper.delete("deleteAccount", id);

               }

 

}

 

 

테스트 프로그램

Test_ibatis.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" %>

<%@ page import="cubrid.*" %>

<%@ page import="java.util.*" %>

<html>

<head>

<title>Insert title here</title>

</head>

<body>

<%

     Account acc = new Account();

     acc.setId(1);

     acc.setFirstName("Woo");

     acc.setLastName("Kwang");

     acc.setEmailAddress("Myong");

 

     SimpleDao.insertAccount(acc);

     //List result = SimpleDao.selectAllAccounts();

     //out.println(result);  

%>

success

</body>

</html>

 

6. 참고 자료

iBATIS-SqlMaps-2

iBATIS-SqlMaps-2-Tutorial

iBATIS in Action - Manning press


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
46 CCI/DB API CCI-API 에서 OID 사용 예제 file 남재우 2009.07.01 24861
45 CCI/DB API CCI-API 사용 예제 file 남재우 2009.07.01 25103
44 PHP CUBRID_기술문서_CUBRID PHP 함수 unisql_ 계열 cubrid_로 변환하기 file 남재우 2009.06.23 22355
43 PHP cubrid_fetch_all 함수 추가하기 2 남재우 2009.06.16 20828
42 기타 Oracle의 SYS_CONNECT_BY_PATH 함수 흉내내기 CUBRID_DEV 2009.06.15 26526
41 Java CUBRID에서 log4sql을 사용하자 정병주 2009.06.12 44302
40 기타 오래 걸리는 질의 및 동일 시간에 수행 중인 질의 추출하기 손승일 2009.05.26 20058
39 Java jsp용 jdbc 샘플입니다. file 시난 2009.05.25 47606
» Java iBATIS framework with CUBRID file 웁쓰 2009.05.19 54546
37 기타 CUBRID와 타DBMS의 python 사용방법 비교 cubebridge 2009.05.19 29520
36 Java SQuirreL SQL Client에서 CUBRID 사용하기 3 Prototype 2009.04.18 34533
35 Java Power*Architect 에서 CUBRID 사용하기 Prototype 2009.04.18 23879
34 Java AquaDataStudio 에서 CUBRID 사용하기 Prototype 2009.04.18 23666
33 Install CUBRID Manager 사용시 로그인에 대하여 1 file admin 2009.04.01 42038
32 Java Spring framework 사용 예제 admin 2009.04.01 53119
31 기타 connect by 구현 방법 admin 2009.04.01 52371
30 기타 python 에서 broker_log_top 사용 1 admin 2009.04.01 17830
29 기타 오라클 개발자를 위한 CUBRID 개발 안내 1 admin 2009.04.01 49817
28 Linux HP-UX에서 CUBRID 사용을 위한 kernel 설정값 조정 1 admin 2009.04.01 54135
27 Linux cron을 이용한 백업 자동화 admin 2009.04.01 33118
Board Pagination Prev 1 2 3 4 5 6 7 8 9 Next
/ 9

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2113 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales