Daejeon IT Developer Conference iBATIS2

2,173 views

Published on

Daejeon IT Developer Conference iBATIS2

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,173
On SlideShare
0
From Embeds
0
Number of Embeds
46
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Daejeon IT Developer Conference iBATIS2

  1. 1. 본 문서의 배포 및 변경 , 출력 및 활용에 관한 모든 권리는 작성자에 있습니다 . 본 서비스는 제 1 회 대전 IT 개발자 커뮤니티 참석자를 위해 제공됩니다 .
  2. 2. iBATIS 2 이동국 NHN September 28 th , 2008
  3. 3. Overview <ul><li>소개 </li></ul><ul><li>사용하기 </li></ul><ul><li>iBATIS 3.0 소식 </li></ul><ul><li>현재 진행중인 이슈 </li></ul>
  4. 4. Simple Lightweight 소개 iBATIS..?
  5. 5. <ul><li>매우 간단한 XML 서술자를 사용해서 클래스와 SQL 구문을 매핑하는 퍼시스턴스 프레임워크 </li></ul>CLASS SQL XML 소개 소개
  6. 6. <ul><li>JDBC </li></ul><ul><li>conn = DriverManager.getConnection(url, user, pass); </li></ul><ul><li>stmt = conn.prepareStatement(); </li></ul><ul><li>String sql = &quot;SELECT * FROM employees&quot;; </li></ul><ul><li>rs = stmt.executeQuery(sql); </li></ul><ul><li>while (rs.next()) { </li></ul><ul><li>rs.getString(&quot;...&quot;); </li></ul><ul><li>rs.getString(&quot;...&quot;); </li></ul><ul><li>... </li></ul><ul><li>} </li></ul><ul><li>rs.close(); </li></ul><ul><li>stmt.close(); </li></ul><ul><li>conn.close(); </li></ul>JDBC 와 iBATIS 소개
  7. 7. <ul><li>iBATIS </li></ul><ul><li>sqlMapClient.queryForList(&quot;selectEmployees&quot;) </li></ul><ul><li><select id=&quot;selectEmployees&quot; resultClass=&quot;Employee&quot;> </li></ul><ul><li>SELECT * FROM employees </li></ul><ul><li></select> </li></ul>JDBC 와 iBATIS 소개
  8. 8. <ul><li>JDBC </li></ul><ul><li>conn = DriverManager.getConnection(url, user, pass); </li></ul><ul><li>String sql = &quot;insert into employees values(?,?,?,?)&quot;; </li></ul><ul><li>stmt = conn.prepareStatement(sql); </li></ul><ul><li>stmt.setString(1, &quot;..&quot;); </li></ul><ul><li>stmt.setString(2, &quot;..&quot;); </li></ul><ul><li>stmt.setString(3, &quot;..&quot;); </li></ul><ul><li>stmt.setString(4, &quot;..&quot;); </li></ul><ul><li>int result = stmt.executeUpdate(); </li></ul><ul><li>stmt.close(); </li></ul><ul><li>conn.close(); </li></ul>JDBC 와 iBATIS 소개
  9. 9. <ul><li>iBATIS </li></ul><ul><li>sqlMapClient.insert(&quot;insertEmployees&quot;, employee) </li></ul><ul><li><insert id=&quot;insertEmployees&quot; parameterClass=&quot;Employee&quot;> </li></ul><ul><li>insert into employees values(#id#,#name#,#val1#,#val2#) </li></ul><ul><li></insert> </li></ul>JDBC 와 iBATIS 소개
  10. 10. <ul><li>3.0 에서 추가될 코드 컨벤션에 따른 SQL 구문 자동생성 </li></ul><ul><li>Employee getEmployee(int id); </li></ul><ul><li>-> SELECT id, firstName, lastName FROM Employee WHERE id = #id# </li></ul><ul><li>List<Employee> listAllEmployees(); </li></ul><ul><li>-> SELECT id, firstName, lastName FROM Employee </li></ul>JDBC 와 iBATIS 소개
  11. 11. <ul><li>장점 </li></ul><ul><li>SQL 문과 소스 코드 분리로 소스 코드의 간결함을 유지 할 수 있다 . </li></ul><ul><li>데이터베이스 자원에 대한 필요이상의 제어를 자동으로 해결해 준다 . </li></ul><ul><li>단점 </li></ul><ul><li>SQL 문과 소스 코드를 분리한다는 점에서는 잇점이지만 오히려 지나치게 많은 파일을 생성해서 관리상의 어려움을 초래 할 수도 있다 . </li></ul><ul><li>클래스 파일에 대한 리로드 기능은 WAS 및 기타 제품에 의해 적절히 보장 받을 수 있으나 XML 리로드에 대해서는 별도의 대책이 요구된다 . </li></ul>장점과 단점 소개
  12. 12. 데이터 타입 사용하기 장점 단점 Bean 성능 컴파일시 타입및 이름검사 리팩토리 코드량 증가 Map 코드량 감소 느림 오류가 컴파일 시 체크되지 않고 실행 시 체크됨 잦은 형변환
  13. 13. <ul><li># </li></ul><ul><li>SELECT * FROM account WHERE acc_id = #id# </li></ul><ul><li>-> SELECT * FROM account WHERE acc_id = ? </li></ul><ul><li>$ SELECT * FROM account WHERE acc_id = $id$ </li></ul><ul><li>-> SELECT * FROM account WHERE acc_id = 1 </li></ul># 과 $ 사용하기
  14. 14. < sql id=&quot;selectAccount_frag&quot;> SELECT acc_id, acc_first_name, acc_last_name, acc_email FROM account </sql> <select id=&quot;selectAllAccounts&quot; resultClass=&quot;Account&quot;> <include refid=&quot;selectAccount_frag&quot; /> </select> SQL 재사용하기 사용하기
  15. 15. <ul><li>일반적인 Result Map </li></ul><ul><li><resultMap id=&quot;accountMap&quot; class=&quot;Account&quot;> </li></ul><ul><li> <result property=&quot;id&quot; column=&quot;acc_id&quot; /> </li></ul><ul><li> <result property=&quot;emailAddress&quot; column=&quot;acc_email&quot; /> </li></ul><ul><li></resultMap> </li></ul>Result Map 사용하기
  16. 16. <ul><li>복합 Collection Result Map 에 사용되는 객체 구조 </li></ul><ul><ul><li>public class Account { </li></ul></ul><ul><ul><li>private int id; </li></ul></ul><ul><ul><li>private String firstName; </li></ul></ul><ul><ul><li>..... </li></ul></ul><ul><ul><li>private List<AccountFamily> families = null; </li></ul></ul>Result Map 사용하기 -account
  17. 17. <ul><li>복합 Collection Result Map 을 JDBC 로 구현한다면 </li></ul><ul><ul><li>String accountSql = &quot;SELECT * FROM account WHERE acc_id = ?&quot;; </li></ul></ul><ul><ul><li>String familySql = &quot;SELECT * FROM Account_family WHERE acc_id = ?&quot;; </li></ul></ul><ul><ul><li>accountStmt = conn.prepareStatement(accountSql); </li></ul></ul><ul><ul><li>accountRs = accountStmt.executeQuery(); </li></ul></ul><ul><ul><li>while (accountRs.next()){ </li></ul></ul><ul><ul><li>accountRs.getString(&quot;...&quot;); </li></ul></ul><ul><ul><li>accountRs.getString(&quot;...&quot;); </li></ul></ul><ul><ul><li>familyStmt = conn.prepareStatement(familySql); </li></ul></ul><ul><ul><li>familyRs = familyStmt.executeQuery(); </li></ul></ul><ul><ul><li>while( familyRs ){ </li></ul></ul><ul><ul><li>familyRs.getString(&quot;&quot;); </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>account.setFamilies(...); </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>} </li></ul></ul>ResultSet 내에서 하위 ResultSet 처리 Result Map 사용하기
  18. 18. <ul><li>복합 Collection Result Map </li></ul><ul><li><resultMap id=&quot;get_account_nplus1&quot; class=&quot;Account&quot;> </li></ul><ul><li><result property=&quot;id&quot; column=&quot;acc_id&quot; /> </li></ul><ul><li><result property=&quot;families“ column=&quot;{id1=acc_id, id2=acc_id}&quot; select=&quot;SubList.selectFamilyList&quot; /> </li></ul><ul><li></resultMap> </li></ul><ul><li>로그 </li></ul><ul><li>Connection </li></ul><ul><li>Executing Statement: SELECT * FROM account WHERE acc_id = ? </li></ul><ul><li>Executing Statement: SELECT * FROM Account_family WHERE acc_id = ? ResultSet </li></ul><ul><li>Header: [id, fullName] </li></ul><ul><li>Result: [1, HongGilDong] Result: [1, SpiderMan] </li></ul><ul><li>Header: [acc_id, acc_first_name, acc_last_name, acc_email, acc_id] </li></ul><ul><li>Result: [1, DongGuk, Lee, fromm0@gmail.com, 1] </li></ul>Result Map 사용하기
  19. 19. <ul><li>복합 Collection Result Map 에서 테이블조인을 JDBC 로 구현한다면 </li></ul><ul><ul><li>String sql = &quot;SELECT * FROM account a LEFT JOIN account_family f ON a.acc_id = f.acc_id WHEREa.acc_id=?&quot;; </li></ul></ul><ul><ul><li>stmt = conn.prepareStatement(sql); </li></ul></ul><ul><ul><li>rs = stmt.executeQuery(); </li></ul></ul><ul><ul><li>int i = 0; </li></ul></ul><ul><ul><li>while (rs.next()){ </li></ul></ul><ul><ul><li>family = new Family(); </li></ul></ul><ul><ul><li>if( i == 0 ){ </li></ul></ul><ul><ul><li>account.setId(); </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>family.setId(); </li></ul></ul><ul><ul><li>list.add(family); </li></ul></ul><ul><ul><li>i++; </li></ul></ul><ul><ul><li>} </li></ul></ul>Result Map 사용하기
  20. 20. <ul><li>복합 Collection Result Map </li></ul><ul><li><resultMap id=&quot;get_account_family_avoidnplus1&quot; class=&quot;Account&quot; groupBy=&quot;id&quot;> </li></ul><ul><li><result property=&quot;id&quot; column=&quot;acc_id&quot; /> </li></ul><ul><li><result property=&quot;families&quot; resultMap=&quot;Base.get_family_avoidnplus1&quot; /> </li></ul><ul><li></resultMap> </li></ul><ul><li>로그 </li></ul><ul><li>Connection </li></ul><ul><li>Executing Statement: SELECT * FROM account a LEFT JOIN account_family f ON a.acc_id = f.acc_id WHEREa.acc_id=? </li></ul><ul><li>ResultSet </li></ul><ul><li>Header: [acc_id, acc_first_name, acc_last_name, acc_email, acc_id, family_fullname] </li></ul><ul><li>Result: [1, DongGuk, Lee, fromm0@gmail.com, 1, HongGilDong] </li></ul><ul><li>Result: [1, DongGuk, Lee, fromm0@gmail.com, 1, SpiderMan] </li></ul><ul><li>Result: [1, DongGuk, Lee, fromm0@gmail.com, 1, BatMan] </li></ul>Result Map 사용하기
  21. 21. <ul><li>인라인 파라미터 </li></ul><ul><li>문법 </li></ul><ul><li>#propertyName# </li></ul><ul><li>#propertyName:jdbcType# </li></ul><ul><li>#propertyName:jdbcType:nullValue# </li></ul><ul><li>샘플 </li></ul><ul><li><insert id=&quot;insertAccount&quot;> </li></ul><ul><li>INSERT INTO account ( </li></ul><ul><li> acc_id, acc_first_name, acc_last_name, acc_email </li></ul><ul><li>) VALUES ( </li></ul><ul><li> #id,jdbcType = INTEGER, javaType = int, </li></ul><ul><li>nullValue =-99999#, #firstName, jdbcType = VARCHAR, javaType = string,nullValue=NULL#, </li></ul><ul><li>#lastName, jdbcType = VARCHAR, javaType = string, nullValue = Hong#, #emailAddress, jdbcType = VARCHAR, javaType = string, nullValue = NULL# </li></ul><ul><li>) </li></ul><ul><li></insert> </li></ul>파라미터 처리 사용하기
  22. 22. <ul><li>파라미터 맵 </li></ul><ul><li>문법 </li></ul><ul><li><parameterMap id=”parameterMapName” [class=”com.domain.Product”]> </li></ul><ul><li><parameter property =”propertyName” [jdbcType=”VARCHAR”] [javaType=”string”] </li></ul><ul><li>[nullValue=“-9999”] </li></ul><ul><li>[typeName=”{REF or user-defined type}”] </li></ul><ul><li>[resultMap=someResultMap] </li></ul><ul><li>[mode=IN|OUT|INOUT] </li></ul><ul><li>[typeHandler=someTypeHandler] </li></ul><ul><li>[numericScale=2]/> </li></ul><ul><li><parameter …… /> </li></ul><ul><li><parameter …… /> </li></ul><ul><li></parameterMap> </li></ul>파라미터 처리 사용하기
  23. 23. <ul><li>샘플 </li></ul><ul><li><parameterMap id=&quot;accountParam&quot; class=&quot;Account&quot;> </li></ul><ul><li> <parameter property=&quot;id&quot; jdbcType=&quot;INTEGER&quot; javaType=&quot;int“ nullValue=&quot;-9999999&quot; /> </li></ul><ul><li> <parameter property=&quot;lastName&quot; jdbcType=&quot;VARCHAR&quot; javaType=&quot;string&quot; nullValue=&quot;Hong&quot; /> </li></ul><ul><li> <parameter property=&quot;firstName&quot; jdbcType=&quot;VARCHAR&quot; javaType=&quot;string&quot; nullValue=&quot;NULL&quot; /> </li></ul><ul><li> <parameter property=&quot;emailAddress&quot; jdbcType=&quot;VARCHAR&quot; javaType=&quot;string&quot; nullValue=&quot;NULL&quot; /> </li></ul><ul><li></parameterMap> </li></ul><ul><li><insert id=&quot;insertAccount&quot; parameterMap=&quot;Base.accountParam&quot;> </li></ul><ul><li>INSERT INTO account (acc_id, acc_first_name, acc_last_name, acc_email </li></ul><ul><li>) VALUES ( ?,?,?,? ) </li></ul><ul><li></insert> </li></ul>파라미터 처리 사용하기
  24. 24. <ul><li>대개는 인라인 파라미터에서 프로퍼티명만 표기하는 형태로 사용 </li></ul><ul><li>파라미터맵을 명시하는 경우 파라미터 인덱스 값으로 값을 셋팅하기 때문에 쿼리문의 파라미터를 # 프로퍼티명 # 형태로 처리하지 않고 ? 형태로 처리해야 함 </li></ul>파라미터 처리 사용하기
  25. 25. <ul><li><dynamic> </li></ul><ul><li>이항연산 요소 </li></ul><ul><li><isEqual> <isNotEqual> <isGreaterThan> </li></ul><ul><li><isGreaterEqual> <isLessThan> </li></ul><ul><li><isLessEqual> </li></ul>동적 SQL 사용하기
  26. 26. <ul><li>단항연산 요소 </li></ul><ul><li><isPropertyAvailable> </li></ul><ul><li><isNotPropertyAvailable> </li></ul><ul><li><isNull> </li></ul><ul><li><isNotNull> </li></ul><ul><li><isEmpty> </li></ul><ul><li><isNotEmpty> </li></ul><ul><li>파라미터 요소 </li></ul><ul><li><isParameterPresent> </li></ul><ul><li><isNotParameterPresent> </li></ul><ul><li><iterate> </li></ul>동적 SQL 사용하기
  27. 27. <ul><li>단항연산 요소 </li></ul><ul><li><isPropertyAvailable> </li></ul><ul><li><isNotPropertyAvailable> </li></ul><ul><li><isNull> </li></ul><ul><li><isNotNull> </li></ul><ul><li><isEmpty> </li></ul><ul><li><isNotEmpty> </li></ul><ul><li>파라미터 요소 </li></ul><ul><li><isParameterPresent> </li></ul><ul><li><isNotParameterPresent> </li></ul><ul><li><iterate> </li></ul>동적 SQL 사용하기
  28. 28. <select id=&quot;getAccountByDynamicSQL&quot; parameterClass=&quot;int&quot; resultClass=&quot;Account&quot;> SELECT acc_id, acc_first_name, acc_last_name, acc_email FROM account WHERE acc_id = #id# <isNotEqual compareValue=&quot;1&quot;> and acc_email = '' </isNotEqual> </select> 동적 SQL 사용하기
  29. 29. <ul><li>3.0 에서 추가될 동적 SQL </li></ul><ul><li>public class GetAccountListSQL extends SQLSource { </li></ul><ul><li>public String getSQL(Object param) { </li></ul><ul><li>Account acct = (Account) param; </li></ul><ul><li>append(&quot;select * from ACCOUNT&quot;); </li></ul><ul><li>prepend(&quot;WHERE&quot;); </li></ul><ul><li>if (exists(acct.getEmailAddress())) { </li></ul><ul><li>append(&quot;AND&quot;, &quot;ACC_EMAIL like #EmailAddress#&quot;); </li></ul><ul><li>} </li></ul><ul><li>if (greaterThan(0, acct.getID())) { </li></ul><ul><li>append(&quot;AND&quot;, &quot;ACC_ID = #ID#&quot;); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li><Select id=&quot;getAccountList“ source=&quot;org.apache.GetAccountListSQL&quot; ...> </li></ul>동적 SQL 사용하기
  30. 30. <ul><li>자동 트랜잭션 </li></ul><ul><li>메서드 호출 단위의 트랜잭션 </li></ul><ul><li>로컬 트랜잭션 </li></ul><ul><ul><li>startTransaction </li></ul></ul><ul><li> 트랜잭션 시작 </li></ul><ul><ul><li>commitTransaction </li></ul></ul><ul><li> 트랜잭션 커밋 </li></ul><ul><ul><li>endTransaction </li></ul></ul><ul><li> 커밋이 되지 않은 경우 롤백 , JDBC 자원 회수 </li></ul><ul><li>Spring 과 같은 서비스 계층에서의 트랜잭션 관리 </li></ul>트랜잭션 사용하기
  31. 31. <ul><li>GC 기반 </li></ul><ul><li>MEMORY </li></ul><ul><li>시간 기반 </li></ul><ul><li>LRU </li></ul><ul><li>FIFO </li></ul><ul><li>외부 캐시 </li></ul><ul><li>OSCACHE </li></ul>캐시 타입 사용하기
  32. 32. <ul><li>캐시되는 데이터 </li></ul><ul><ul><li>SQL 맵 구문 아이디 </li></ul></ul><ul><ul><li>실제 쿼리문 </li></ul></ul><ul><ul><li>com.ibatis.sqlmap.engine.mapping.statement 아래 각각의 Statement 객체 내 메서드 명 </li></ul></ul><ul><ul><li>예 ) executeQueryForList </li></ul></ul><ul><ul><li>이외 iBATIS 의 캐시 객체에서 지정하는 몇 가지 값들 </li></ul></ul>캐시 사용하기
  33. 33. <ul><li>SqlMapClientDaoSupport 를 통해 SqlMapClientTemplate 사용하기 </li></ul><ul><li>mappingLocations </li></ul><ul><li><bean id=&quot;sqlMapClient&quot; class=&quot;org.springframework.orm.ibatis.SqlMapClientFactoryBean&quot;> </li></ul><ul><li> <property name=&quot;dataSource&quot; ref=&quot;dataSource&quot;/> </li></ul><ul><li> <property name=&quot;configLocation“ value=&quot; classpath:kr/or/openframework/dao/ibatis/SqlMapConfig.xml &quot;/> </li></ul><ul><li> <property name=&quot;mappingLocations&quot; value=&quot; classpath:kr/or/openframework/dao/ibatis/AccountWithFamily*. xml“ /> </li></ul><ul><li></bean> </li></ul><ul><li>Spring 2.5.5 에서 추가됨 </li></ul><ul><li>iBATIS 2.3.2 이상의 버전이 필요함 </li></ul>Spring 에서 iBATIS 사용하기 사용하기
  34. 34. <ul><li>SqlMapConfig.xml </li></ul><ul><li><?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?> </li></ul><ul><li><!DOCTYPE sqlMapConfig </li></ul><ul><li>PUBLIC &quot;-//ibatis.apache.org//DTD SQL Map Config 2.0//EN&quot; </li></ul><ul><li>&quot;http://ibatis.apache.org/dtd/sql-map-config-2.dtd&quot;> </li></ul><ul><li><sqlMapConfig> </li></ul><ul><li><settings </li></ul><ul><li>cacheModelsEnabled=&quot;true&quot; </li></ul><ul><li>enhancementEnabled=&quot;true&quot; </li></ul><ul><li>lazyLoadingEnabled=&quot;false&quot; </li></ul><ul><li>useStatementNamespaces=&quot;true&quot; /> </li></ul><ul><li><sqlMap resource=&quot;openframework/dao/ibatis/Dummy.xml&quot; /> </li></ul><ul><li><!--sqlMap resource=&quot;openframework/dao/ibatis/Account1.xml&quot; /> </li></ul><ul><li><sqlMap resource=&quot;openframework/dao/ibatis/Account2.xml&quot; /> </li></ul><ul><li><sqlMap resource=&quot;openframework/dao/ibatis/Account3.xml&quot; /> </li></ul><ul><li><sqlMap resource=&quot;openframework/dao/ibatis/Account4.xml&quot; /--> </li></ul><ul><li></sqlMapConfig> </li></ul>Spring 에서 iBATIS 사용하기 사용하기
  35. 35. <ul><li>parameterMap 이나 parameterClass 속성을 명시적으로 선언 </li></ul><ul><li><update id=&quot;updateAccount&quot; parameterClass=&quot;Account&quot;> </li></ul><ul><li></update> </li></ul><ul><li><resultMap> 를 명시적으로 정의하고 결과의 재매핑 (remapResults = true) 옵션은 사용하지 말라 . </li></ul><ul><li>Map 이나 XML 이 아닌 자바 Bean 을 사용하라 . </li></ul><ul><li>표현이나 배열 또는 혼합된 Bean 이나 Map 프로퍼티가 아닌 간단한 프로터티를 사용하라 . </li></ul><ul><li><settings> 요소에 바이트코드 향상 기능을 활성화한다 . </li></ul><ul><li>- enhancementEnabled=&quot;true&quot; </li></ul>성능을 향상시키는 방법 사용하기
  36. 36. <ul><li>SQL 구문을 설정하는 애노테이션 추가 </li></ul><ul><li>@Select(&quot;SELECT #id(EMP_ID:NUMERIC), #name(NAME:VARCHAR) &quot;, </li></ul><ul><li> &quot;FROM EMPLOYEE&quot;) </li></ul><ul><li>List<Employee> selectAllEmployees(); </li></ul><ul><li>@Select({&quot;SELECT #id(EMP_ID:NUMERIC), #name(NAME:VARCHAR) &quot;, </li></ul><ul><li>&quot;FROM EMPLOYEE &quot;, </li></ul><ul><li>&quot;WHERE EMP_ID = @id&quot;}) </li></ul><ul><li>Employee selectEmployee(int id); </li></ul>iBATIS 3.0 소식 iBATIS 3.0 소식
  37. 37. <ul><li>ResultMap 을 대체하는 애노테이션 </li></ul><ul><li>@ResultClass (Employee.class) </li></ul><ul><li>@PropertyResults({ </li></ul><ul><li> @Result(property=&quot;departments.id&quot;, column=&quot;D.DEPT_ID&quot;), </li></ul><ul><li> @Result(property=&quot;departments.name&quot;, column=&quot;D.NAME&quot;), </li></ul><ul><li>}) </li></ul><ul><li>@Collections ({ </li></ul><ul><li> @Collection(type=Department.class, property=&quot;departments&quot;, groupBy=&quot;id&quot;), </li></ul><ul><li>}) </li></ul><ul><li>@Select(&quot;SELECT #id, #name, &quot; + </li></ul><ul><li> &quot;#departments.id, #departments.name &quot; + </li></ul><ul><li>&quot;FROM COMPANY C, DEPARTMENT D &quot; + </li></ul><ul><li>&quot;WHERE C.COMP_ID = D.COMP_ID&quot;) </li></ul><ul><li>List<Company> selectAllCompaniesWithJoin(); </li></ul>iBATIS 3.0 소식 iBATIS 3.0 소식
  38. 38. <ul><li>Support for JDBC 3 Named parameters </li></ul><ul><li>http://issues.apache.org/jira/browse/IBATIS-96 </li></ul><ul><li>이를테면 다음과 같은 형태의 parameterMap 을 사용 .. </li></ul><ul><li><parameterMap id=&quot;insert-product-param&quot; class=&quot;com.domain.Product&quot;> </li></ul><ul><li><parameter property=&quot;description&quot; parameter=&quot;desc&quot; /> </li></ul><ul><li><parameter property=&quot;id&quot; parameter=&quot;productId&quot; /> </li></ul><ul><li></parameterMap> </li></ul>현재 진행중인 이슈 현재 진행중인 이슈
  39. 39. <ul><li>Auto Reloading Sql-map configuration. By Observing modifed date (adding datetime in Variables) or making a method reload conf. </li></ul><ul><li>http://issues.apache.org/jira/browse/IBATIS-208 sqlmap 설정파일에 대한 Hot Deploy 기능 지원 </li></ul>현재 진행중인 이슈 현재 진행중인 이슈
  40. 40. <ul><li>Improving startup time (Dynamically loading SQL maps based on namespace) </li></ul><ul><li>http://issues.apache.org/jira/browse/IBATIS-425 </li></ul><ul><li>설정파일이 너무 많은 경우 WAS 가 정상적으로 시작되는 시간이 너무 오래 걸려서 운영 시 어려움이 있다 . namespace 기반으로 초기 일부만 로딩하고 나머지는 해당 namespace 를 기준으로 차후 로딩을 하는 형태의 기능 요청 . </li></ul>현재 진행중인 이슈 현재 진행중인 이슈
  41. 41. <ul><li>Ability to build SqlMapClient programmatically without SqlMapConfig.xml file </li></ul><ul><li>http://issues.apache.org/jira/browse/IBATIS-416 </li></ul><ul><li>Spring 과 사용하는 경우 sql-map-config.xml 파일에는 특별히 많은 내용이 들어가지 않기 때문에 별도로 설정파일을 만들 필요 없이 iBATIS 관련 API 호출로 설정파일의 갯수를 줄이는 방안에 대한 요청 . </li></ul><ul><li>이미 Spring 에서도 버전을 올라가면서 관련 설정을 줄일 수 있는 기능을 하나씩 추가하고 있음 . </li></ul>현재 진행중인 이슈 현재 진행중인 이슈
  42. 42. <ul><li>Using Java constants in statements </li></ul><ul><li>http://issues.apache.org/jira/browse/IBATIS-147 </li></ul><ul><li>parameterClass 가 아닌 다른 상수만을 가지는 외부 클래스의 값을 SQL 구문에서 그대로 사용하기 위한 기능 요청 . </li></ul><ul><li>Support generics </li></ul><ul><li>http://issues.apache.org/jira/browse/IBATIS-273 </li></ul><ul><li>JDK 1.5 이상에서 지원하는 제네릭을 지원해달라는 요청 . </li></ul>현재 진행중인 이슈 현재 진행중인 이슈
  43. 43. <ul><li>관련 사이트 </li></ul><ul><li>iBATIS - http://ibatis.apache.org </li></ul><ul><li>openframework 위키 – http://openframework.or.kr/Wiki.jsp?page=PersistentLayer#refpersistentLayer-2 </li></ul><ul><li>관련 서적 </li></ul><ul><li>iBATIS 인 액션 ( 이동국 , 위키북스 ) </li></ul><ul><li>Pro Spring (Rob Harrop, Jan Machac 다 ) </li></ul>참고자료 현재 진행중인 이슈
  44. 44. 감사합니다 .

×