티스토리 뷰

WEB/WEB Etc

02 - iBATIS - Map Type, namespace

주년 2011. 10. 11. 13:58

01에서 해본 select vo객체를 이용해서 인자값을 주거나 받았다. 물론 그런상황도 필요하겠지만, 쿼리 xml에서 parameterClassresultClass Map Type으로 사용한다면 그런 수고를 덜게 된다. 그리고 namespace를 이용하여 쿼리 xml을 나누는 것도 같이 해 보겠다. 일단 쿼리 xml부터 보자.

 

Customer.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="CUSTOMER">

        <!-- 1. SELECT TYPE 01 -->

        <statement id="getCustomerList" parameterClass="java.util.Map" resultClass="java.util.HashMap" remapResults="true">

             <![CDATA[

                    SELECT *

                    FROM CUSTOMER

                    WHERE NAME like '%$NAME$%'

             ]]>

       </statement>

                                                                                                                                                                             <statement id="getCustomerBySsn" parameterClass="java.util.Map" resultClass="java.util.HashMap" remapResults="true">

             <![CDATA[

                    SELECT ID, NAME, ADDRESS

                    FROM CUSTOMER

                    WHERE SSN = $SSN$

             ]]>

       </statement>

      

       <statement id="insertCustomer" parameterClass="java.util.Map" resultClass="java.util.HashMap" remapResults="true">

             <![CDATA[

             INSERT INTO CUSTOMER(ID,NAME,ADDRESS,PASSWORD,PHONE,GRADE)

             VALUES (#ID#,#NAME#,#ADDRESS#,#PASSWORD#,#PHONE#,#GRADE#)

             ]]>

       </statement>

      

</sqlMap>

======================================================

 

book.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="BOOK">

        <!-- 1. SELECT TYPE 01 -->

        <statement id="lendInfo" parameterClass="java.util.Map" resultClass="java.util.HashMap" remapResults="true">

             <![CDATA[

                    SELECT C.NAME, B.SUBJECT, BL.LEND_DATE

                    FROM   CUSTOMER C,

                           BOOK B,

                           BOOK_LEND BL

                    WHERE  BL.SSN = #SSN#

                    AND    C.SSN = BL.SSN

                    AND    B.ISBN = BL.ISBN

             ]]>

       </statement>

      

</sqlMap>

======================================================

이전과 바뀐점은 <sqlMap />에 속성으로 namespace가 붙어있다는 점과, 위에서도 설명했듯이 자체적인 vo를 사용하는 것이 아닌 Map형식을 이용하고 있다는 것이다.

namespace는 쿼리xml의 구분자 역할을 한다. 그리고 dao에서 id를 넣을 때 namespace.id의 형식으로 넣어주면 된다.( - sqlMap.queryForList("BOOK.lendInfo", map);) 그리고 01에서 잠깐 설명했지만 설정 xml에서도 namespace를 사용한다는 것을 표시해야 한다. (<settings useStatementNamespaces="true" />)

그리고 parameterClassresultClass Map형식을 사용하면 자동적으로 컬럼명,값 의 MAP형식으로 객체가 만들어지므로 그냥 갔다가 쓰기만 하면 되겠다. 그럼 dao를 보자.

 

CustomerDao.java

======================================================

package dao;

 

import java.io.Reader;

import java.util.*;

import java.sql.SQLException;

 

import com.ibatis.common.resources.Resources;

import com.ibatis.sqlmap.client.SqlMapClient;

import com.ibatis.sqlmap.client.SqlMapClientBuilder;

 

public class CustomerDao {

      

       private static CustomerDao cs = new CustomerDao();

       private SqlMapClient sqlMap = null;

       private CustomerDao(){

             try{

               String resource = "dao/SqlMapConfig.xml";

               Reader reader = Resources.getResourceAsReader(resource);

               sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);

             }catch(Exception e){

                    e.printStackTrace();

             }

       }

      

       public static CustomerDao getInstance(){

             if(cs == null){

                    cs = new CustomerDao();

             }

             return cs;

       }

      

       public List getCustomerList(HashMap map)throws SQLException{

                                //sqlMap namespace="CUSTOMER"

             List list = (List)sqlMap.queryForList("CUSTOMER.getCustomerList", map);

               return list;

       }

      

       public HashMap getCustomerBySsn(HashMap map)throws SQLException{

       

             HashMap result = (HashMap)sqlMap.queryForObject("CUSTOMER.getCustomerBySsn", map);

             return result;

       }

      

       public void insertCustomer(HashMap map)throws SQLException{

       

             sqlMap.insert("CUSTOMER.insertCustomer", map);

            

       }

      

       public List lendInfo(HashMap map)throws SQLException{

            

             List list = (List)sqlMap.queryForList("BOOK.lendInfo", map);

             return list;

       }

      

}

======================================================

01에서 달라진건 메서드들의 쿼리에 들어갈 값들이 HashMap이다. 쿼리 xml의 이름(#SSN#)HashMap에 들어있는 이름을 매칭시켜 쿼리에 값을 넣어준다.

받아오는 값을 보면 List 자료형이다. 조회한 데이터 레코드 하나는 map객체로, 그 객체가 모인 것이 List이다. 쿼리 ID를 넘겨주는 인자값 앞에는 namespace가 붙는다. .이구분자이다. 그럼 main을 보자.

 

TestMain.java

======================================================

import java.util.List;

import java.util.HashMap;

 

import dao.*;

 

public class TestMain {

 

 public static void main(String[] args) throws Exception {

 

        //인자값을 넘겨주는데 HashMap 사용

        CustomerDao cs = CustomerDao.getInstance();

        HashMap param = new HashMap();

        

        param.put("NAME", "i");

        List list = cs.getCustomerList(param);

        for(int i = 0; i < list.size(); i++){

              HashMap map = (HashMap)list.get(i);

              System.out.print(map.get("SSN")+" : ");

              System.out.print(map.get("NAME")+" : ");

              System.out.print(map.get("ID")+" : ");

              System.out.print(map.get("ADDRESS")+" : ");

              System.out.print(map.get("PHONE")+" : ");

              System.out.print(map.get("GRADE"));

              System.out.println();

        }

        

        //자동 형변환

        param = new HashMap();

        param.put("SSN", "4"); //DB컬럼상 숫자타입인데 문자로 넣어줌.

        HashMap result = cs.getCustomerBySsn(param);

        System.out.println(result.get("ID"));

        System.out.println(result.get("NAME"));

        System.out.println(result.get("ADDRESS"));

        

        //insert test

        param = new HashMap();

        param.put("ID","Lee");

        param.put("NAME","Seoul");

        param.put("ADDRESS","151-901");

        param.put("PASSWORD","1111");

        param.put("PHONE","11-111-1111");

        param.put("GRADE","F");

        cs.insertCustomer(param);

        

        //namespace test

        param = new HashMap();

        param.put("SSN", "1");

        list = cs.lendInfo(param);

        for(int i = 0; i < list.size(); i++){

              HashMap map = (HashMap)list.get(i);

              System.out.println(map.get("NAME")+" : ");

              System.out.println(map.get("SUBJECT")+" : ");

              System.out.println(map.get("LEND_DATE")+" : ");

              System.out.println("----------------------");

        }

 }

}

======================================================

한번에 테스트하느라 여러가지로 지저분하지만, 맨위가 이름에 i가들어가는 애들 뿌려주는거, 두번째가 자동형변환 테스트, 세번째가 입력 테스트, 마지막이 namespace테스트가 되겠다. 실행시켜보자~

======================================================

1 : Christian.Yi : CUSTOMER01 : KangNam Goo Seoul Korea : 010-1111-1111 : A+

3 : BoJeong.Choi : CUSTOMER03 : DongJack Goo Seoul Korea : 010-1111-1113 : B

9 : Chingon.Lee : CUSTOMER09 : DongJack Goo Seoul Korea : 010-1111-1119 : B+

21 : Jiseon.Kim : CUSTOMER10 : KangNam Goo Seoul Korea : 010-1111-1120 : B

CUSTOMER04

DongWan.Park

YoungSan Goo Seoul Korea

Christian.Yi :

Charlie and the Chocolate Factory :

2009-08-11 :

----------------------

Christian.Yi :

Secret :

2009-08-11 :

----------------------

======================================================

그럼 이걸로 이번 iBATIS 정리를 끝내겠다.

출처 : http://www.cyworld.com/konsanchi/2836448

'WEB > WEB Etc' 카테고리의 다른 글

FreeMarker(프리마커) 문법  (0) 2011.10.11
자카르타 톰캣 과 아파치 는 왜 설치 해야하는걸까?!  (0) 2011.10.11
WAS(Web Application Server)란?  (0) 2011.10.11
Velocity[벨로씨티]  (2) 2011.10.11
xml 특수문자처리  (0) 2011.10.11