일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 이클립스 단축키
- This Android SDK requires An...e ADT to the latest version
- 체크박스
- MySQL
- eclipse 단축키
- 불독맨션 좋아요
- 펌방지해제
- lol 서포터
- eclipse svn
- bruno mars marry you
- 문자열자르기
- 자바스크립트강의
- sax vs dom
- Split
- java 인스턴스
- Marry You
- 자바정의
- 스크린세이버
- dom vs sax
- jason maraz
- Mysql명령어
- marry you 프로포즈
- 타루 예뻐할께
- 갈릴레오 svn
- java파일삭제
- javascript강의
- java 객체
- java파일복사
- jason marz im yours
- 자바 객체
- Today
- Total
쿰뱅이
02 - iBATIS - Map Type, namespace 본문
01에서 해본 select는 vo객체를 이용해서 인자값을 주거나 받았다. 물론 그런상황도 필요하겠지만, 쿼리 xml에서 parameterClass나 resultClass를 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" />)
그리고 parameterClass나 resultClass를 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","
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
3 : BoJeong.Choi : CUSTOMER03 : DongJack Goo
9 : Chingon.Lee : CUSTOMER09 : DongJack Goo
21 : Jiseon.Kim : CUSTOMER10 : KangNam Goo
CUSTOMER04
DongWan.Park
YoungSan Goo
Christian.Yi :
Charlie and the Chocolate Factory :
----------------------
Christian.Yi :
Secret :
----------------------
======================================================
그럼 이걸로 이번 iBATIS 정리를 끝내겠다.
'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 |