1. . SQL에 XML 문자(<, > 같은)가 들어가는 경우 해결책은?
  2. . SQL이 너무 많아 statement의 id 만으로는 구분이 어렵다면?
  3. . 실제 수행되는 쿼리 정보를 콘솔 및 로그에 찍고 싶은데?
  4. . one-to-many 관계 구성중에 복합키를 넘겨야 할때

1. SQL에 XML 문자(<, > 같은)가 들어가는 경우 해결책은?

>> 두가지 방법이 있다. (1) XML의 CDATA 섹션 사용하거나

   <statement id="getPersonsByAge" resultClass="examples.domain.Person">
   <![CDATA[
      SELECT *
      FROM PERSON
      WHERE AGE > #value#
    ]]>
   </statement>

(2) XML문자를 특수 엔터티 문자로 변환(AnyEdit 플러그인 사용하면 편함)

   <statement id="getPersonsByAge" resultClass="examples.domain.Person">
      SELECT *
      FROM PERSON
      WHERE AGE &gt; #value#
   </statement>

2. SQL이 너무 많아 statement의 id 만으로는 구분이 어렵다면?

>> iBatis는 namespace 개념을 지원한다. sql-map-config.xml 에서 useStatementNamespaces 값을 true로 준다. 이제 SQL 정의 xml 파일을 여러개로 나누고 각 파일별로 적당한 namespace를 지정한다.

  • sql-map-config.xml
  <sqlMapConfig xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <settings 
      cacheModelsEnabled="true" 
      enhancementEnabled="true" 
      useStatementNamespaces="true" 
      lazyLoadingEnabled="true" 
      maxRequests="512" 
      maxSessions="128" 
      maxTransactions="32" />
  • SQL 파일에서 이렇게.
<sqlMap namespace="Sample">

  <select id="getPersonsByAge" ...>
  • DAO 코딩 예("namespace.statement_id" 형식)

return getSqlMapClientTemplate().queryForList("Sample.getPersonsByAge", "30");

3. 실제 수행되는 쿼리 정보를 콘솔 및 로그에 찍고 싶은데?

>> log4j.properties 파일에 아래처럼 설정한다.

(log4j.logger.java.sql.Connection=DEBUG 는 반드시 있어야한다.)

<pre> log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG </pre> 아래 처럼 찍힌다. <pre> <DEBUG> sql.Connection : {conn-100003} Connection <DEBUG> sql.PreparedStatement : {pstm-100004} PreparedStatement: select user_id, password, name, user_type, user_group, regist_date, status from ws_user where user_id = ? <DEBUG> sql.PreparedStatement : {pstm-100004} Parameters: test1 <DEBUG> sql.PreparedStatement : {pstm-100004} Types: java.lang.String <DEBUG> sql.ResultSet : {rset-100005} ResultSet <DEBUG> sql.ResultSet : {rset-100005} Header: user_id, password, name, user_type, user_group, regist_date, status <DEBUG> sql.ResultSet : {rset-100005} Result: test1, test1, 테스트유저, U, 01, 20041204, A </pre> 4. one-to-many 관계 구성중에 복합키를 넘겨야 할때

예를 들면 다음처럼 1:M관계를 연결하는 부분이 있다.

<result property="comments" column="id" select="getCommentList" /> 
이는 조회된 결과의 id값을 getCommentList에 인자로 넘기는 것이다. 이는 getCommentList에서 수행되는 SQL문의 조건문이 한개일때는 가능하나 2개 이상일때는 다소 적용에 무리가 있다. 즉 2개 이상의 키값을 넘겨야 할 경우에는 다음처럼 설정하면 된다.

<result property="comments" column="{id=id,user.id=user_id}" select="getCommentList" />

여기서 {id=id,user.id=user_id} 값은

{넘겨받는 객체의 변수명=칼럼명,넘겨받는 객체의 변수명=칼럼명}

의 형식을 취하면 된다. 즉 , (comma)를 구분자로 사용하면 된다. 그럼 다음처럼 사용이 가능하다.

<statement id="getCommentList" parameterClass="comment" resultMap="get-comment-result">
    select 

        .... 

    from comment
    where seq=#id#
    and user_id=#user.id#
</statement>

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-2) was last changed on 07-Apr-2006 11:31 by 220.76.115.28