- 이 문서는 구루비에서 작성하였습니다.
- 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=26741335&
- 구루비 지식창고의 모든 문서는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.
iBatis 구성요소의 이해
1. SqlMapConfig 파일
1.1 SqlMapConfig.xml
- 쓰레드, Cache, 데이터소스 등의 iBatis 환경설정을 담당하는 파일이다.
- settings 태그를 이용하여 환경 설정을 한다.
- sqlMap 태그를 이용하여 개발자가 작성하는 SQLMap 파일을 지정한다.
SqlMapConfig.xml 예
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> <sqlMapConfig> <settings cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="true" useStatementNamespaces="true" /> <typeAlias alias="emp" type="com.oracleclub.study.mvc.model.Emp"/> <sqlMap resource="sqlmap/CacheModel.xml"/> <sqlMap resource="sqlmap/Emp.xml"/> </sqlMapConfig>
1.2 SqlMapConfig 설명
1.2.1 <settings />
- iBatis의 환경설정 부분이다.
- settings 속성
속성 설 명 사용 예 cacheModelsEnabled SqlMapClient의 캐쉬모델을 설정 한다. cacheModelsEnabled="true"
Default: true (enabled)lazyLoadingEnabled SqlMapClient의 모든 늦은(lazy)로딩을 설정한다. lazyLoadingEnabled="true"
Default: true (enabled)enhancementEnabled CGLIB에 최적화된 클래스를 통해 향상된 늦은(lazy)로딩사용여부를 선택한다. enhancementEnabled="true"
Default: false (disabled)useStatementNamespaces SQLMap XML 파일에서 namespace를 사용할 수 있다.
<sqlMap namespace="article">useStatementNamespaces="true"
Default: false (disabled)
1.2.2 typeAlias
- 클래스를 별칭으로 사용 할 수 있게 해준다.
- <typeAlias alias="emp" type="com.spring.common.model.Emp"/>
- emp 라는 별칭으로 sqlMap XML 파일에서 사용 할 수 있다.
1.2.3 sqlMap
- 개발자가 작성한 SQL문장이 기록되는 XML 파일의 경로를 지정한다.
- classes 상의 위치를 지정하면 된다.
2. Sql Map XML 파일
2.1 Sql Map XML 파일
- 개발자가 작성하는 실제 비즈니스 로직의 SQL 문장이 저장되는 파일이다.
- 아래는 Sql Map XML파일의 예이다.
SqlMap 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="emp"> <select id="selectEmpList" resultClass="emp" parameterClass="int" cacheModel="cachemodel.empCache" > SELECT empno, ename, job, sal, mgr FROM emp <isGreaterThan compareValue="0"> WHERE deptno = #deptno# </isGreaterThan> </select> <insert id="insertEmp" parameterClass="emp" > INSERT INTO emp (empno, ename, job, sal, mgr, hiredate, deptno) VALUES (#empno#, #ename#, #job#, #sal#, 0, SYSDATE, #deptno#) </insert> </sqlMap>
2.2 Sql Map XML Statement설명
- Statement 속성
Statement 속 성 설 명 <statement> id
parameterClass
resultClass
parameterMap
resultMap
cacheModel모든 쿼리 구문 사용 <insert> id
parameterClass
parameterMap데이터 입력 <update> id
parameterClass
parameterMap데이터 수정 <delete> id
parameterClass
parameterMap데이터 삭제 <select> id
parameterClass
resultClass
parameterMap
resultMap
cacheModel데이터 조회 <procedure> id
parameterClass
resultClass
parameterMap
resultMap저장 프로시저 호출
2.3 #과 $의 차이
2.3.1 # (#empno#)
- PreparedStatement 형태로 파싱되어 다이나믹 SQL 로 생성됨
- SQL Injection에 안전하며, 성능상으로 유리 (권장)
2.3.2 $ ($empno$)
- $는 단순히 문자열 치환이 되는 형태
- Static SQL로 생성됨
- SQL Injection 공격에 노출 됨(위험)
- DB 성능문제 발생, 가능한 사용하지 말 것
#과 $의 차이
# 예 SELECT * FROM emp WHERE empno = #empno# → SELECT * FROM emp WHERE empno = ? empno 파라미터 값이 바뀌어도 DB에서는 하나의 SQL 문장으로 처리 $ 예 (보안 및 성능문제가 있기 때문에 절대 사용하지 말 것 SELECT * FROM emp WHERE empno = $empno$ → SELECT * FROM emp WHERE empno = 1024 empno 파라미터 값이 바뀔 때 마다 DB에서는 서로 다른 SQL 문장으로 처리
2.4 SQL 문 작성시 조건문(<, >) 사용 문제
- < ; > ; 로 바꾸거나 (비권장)
- <![CDATA[STUDY: 쿼리]]> 로 감싸준다 (권장)
3. SqlMapClient API
- iBatis에서는 SqlMapClient API를 이용해서 SQL문을 수행 할 수 있다.
- SqlMapClient클래스에서 SQL statement를 수행하기 위한 API를 제공한다.
API | 설 명 |
---|---|
insert() | insert 쿼리 |
update() | update 쿼리 |
delete() | delete 쿼리 |
queryForObject() | select 쿼리 1개 결과 반환, object형 |
queryForMap() | select 쿼리 1개 결과 반환, map형 |
queryForList() | select 쿼리 1개 이상 row 반환 |
flushDataCache() | 캐쉬된 데이터 삭제 |
startTransaction() | transaction 시작 |
commitTransaction() | transaction 커밋 |
endTransaction() | transaction 종료 |
문서정보
- 이 문서는 구루비에서 작성하였습니다.
- 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=26741335&
- 구루비 지식창고의 모든 문서는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.