블로그 이미지
좋은느낌/원철
이것저것 필요한 것을 모아보렵니다.. 방문해 주셔서 감사합니다..

calendar

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

Notice

    2009. 11. 12. 20:59 개발/Oracle
    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>
    posted by 좋은느낌/원철