2013.04.12. iBatis
iBatis란?
- BL과 PL을 총체적으로 관리해주는 SpringFramework의 영역과 Database의 영역 간의 작업을 조율하는 Framework.
- SpringFramework와는 용도 자체가 다르며, Database와 그 안의 데이터로의 접근을 손쉽게 하는데에 목적이 있음.
(이러한 Framework를 통칭 Object Relational Mapping이라 하며, 예로 Hibernate 등)
iBatis의 특징 input / output
1. 쿼리문의 실행결과를 JavaBeans 혹은 Map객체에 매핑.
2. SQL을 프로그램 내의 소스코드가 아닌 XML파일로 따로 분리해 관리하도록 지원해줌.
3. /WEB-INF/sqlmap-config.xml파일을 기본설정으로 사용하며, sqlMap파일을 include하는 형식으로 작동.
iBatis 설정파일 (xml파일 기반)
SqlMapConfig.xml
SqlMapClient객체 Important!
- MapStatement를 호출할 수 있는 SqlMapConfig객체를 Java객체화한 객체.
- 이를 통해 각 MapStatement별 메서드로 SQL문을 실행할 수 있기 때문에 iBatis 구동의 핵심이 된다.
- Reader를 생성하여 실제 SqlMapConfig파일의 경로를 담아준 다음, 이를 SqlMapClient객체의
.SqlMapClientBuilder.buildSqlMapClient()메서드에 인자로 넣어줌으로써 SqlMapClient객체의 초기화를 완료한다.
SqlMaps와 MapStatement
- <select>, <insert>, <update>, <delete> : 각 태그당 하나의 쿼리문을 가지며, id값으로서 호출할 수 있다.
< input / output 타입 >
parameterClass – 데이터를 가진 객체를 인자로 투입 가능하며, <typeAlias>태그로 POJO객체를 정의해야 사용가능하다.
parameterMap – Sql문의 input을 ‘?’로 동적으로 할당할 경우, <parameterMap>태그로 정의해야 사용가능하다.
resultClass – 객체의 필드명과 테이블의 칼럼명이 같을 경우, MapStatement의 리턴값을 객체로 바로 가져올 수 있다.
resultMap – 객체의 필드명과 테이블의 칼럼명이 다를 경우, 데이터값이 삽입될 경로를 매핑해주는 작업이 필요하다.
동적쿼리문과 관련된 태그들
<dynamic> | prepend=“aa” open=“(”, close=“)” | body의 내용이 존재할 경우, aa를 동적쿼리문 시작 전에 붙여줌. body의 내용이 존재할 경우, 내용의 시작과 끝을 ‘( )’로 묶어줌. |
<iterate> | property=“bb” conjunction=“or” open=“(”, close=“)” | bb에는 배열 또는 Collection객체만 들어감. 인덱스만큼 반복. 각 반복구문의 사이마다 ‘or’를 삽입해줌. <dynamic>의 open / close와 동일. |
<isEqual> | property=“cc” compareValue=“dd” | 비교를 원하는 기준데이터값을 입력. 기준데이터값과 비교할 대상데이터값을 입력. cc=dd일 때 body의 내용 실행 |
동적쿼리문의 적용 (게시판 검색 적용)
1) POJO객체 활용
① 검색조건(checkbox)을 나타내는 String배열과 검색어를 나타내는 String값을 필드로 가지는 POJO객체를 생성. (ex:search)
② POJO객체에 검색조건과 검색어를 set메서드를 통해 할당해준 후, BoardDao메서드를 경유하여 SqlMaps파일에 넘겨줌.
③ Sql문에서 parameterClass=“search”로 받되, 반드시 <typeAlias>태그로 POJO객체를 정의해야 적용이 가능하다.
④ <iterate>태그의 property속성에 검색조건을 나타내는 배열을 할당, 인덱스만큼 Sql문이 반복생성되게 한다.
이때 검색조건으로서 할당된 배열은 Sql문 내에서 변수가 아닌 상수로서 표현되어야 하므로, ##이 아닌 $$를 사용한다.
2) Map객체 활용
① 검색조건(checkbox, 배열)의 경우의 수에 따라 검색조건을 나타내는 String값과 검색어를 나타내는 String값을 선언.
② Map객체를 생성하여 두 String값의 데이터를 각각의 Key와 Value로써 저장한다.
③ BoardDao객체의 메서드를 경유하여 SqlMaps파일에 바로 Map객체를 넘겨주되,
XML파일에서 Map객체를 인식하지 parameterClass를 “java.util.Map”로 표시하여 넘겨준다.
④ 속성값의 동일유무를 판별해주는 <isEqual>태그를 활용, Java코드에서의 if문의 적용과 같은 방식으로
property에 기준값과 compareValue에 비교값을 넣어 동적쿼리문이 개별적으로 적용될 환경을 구분해준다.