티스토리 뷰
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 |
- Total
- Today
- Yesterday
- 문자열자르기
- dom vs sax
- 불독맨션 좋아요
- 자바스크립트강의
- 스크린세이버
- Mysql명령어
- java 인스턴스
- 체크박스
- 펌방지해제
- 갈릴레오 svn
- javascript강의
- Split
- jason marz im yours
- This Android SDK requires An...e ADT to the latest version
- java파일삭제
- lol 서포터
- jason maraz
- eclipse svn
- 자바 객체
- 타루 예뻐할께
- MySQL
- java파일복사
- 이클립스 단축키
- bruno mars marry you
- 자바정의
- sax vs dom
- java 객체
- marry you 프로포즈
- eclipse 단축키
- Marry You
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |