iBatis 사용시 NULL 에 대한 주의 할 점.

1. 입력값이 빈 경우 처리

<isNotEmpty property="detailStatsKind">
      AND STATS_DETAIL_SE = #detailStatsKind#
</isNotEmpty>

2. biding 되는 값 중 NULL 이 있을 경우 기본값(default-value)로 치환 하는 법.
    <resultMap>
       <result property="valueObject-Field-Name"     column="Column-NamenullValue='0'/>
    </resultMap>

 와 같이 <result property    /> 에 nullValue= 를 이용하여 기본값을 얻어 올 수 있도록 한다.

위와 같이 하지 않을 경우, int-type 을 return  받길 예상 했으나, 적당한 값이 Bind 되지 않아 NULL 이

반환되면 result-Map 의 Class 에 정의한 int-type 변수와 null 이 만나게 되어 Exception 이 발생합니다.

3. parameter 인자가 NULL 이 전달 될 때, 적절한 값으로 type-casting 이 되지 않아, 예외가 발생.

Inser into table(A, b, c, d) values(#a-value#, #b-value#, #c-value#,#d-value#);

와 같이 sql 을 작성하고 , 파라메터 클래스를 이용하여 파라메터를 전달 할 때, 파라메터가 NULL-value 를 

전달 하게 되면, casting 에 문제가 생길 수 있습니다.

Interger-Class 또한 NULL-value 를 받아 넣을 수 있기 때문에, 그런지 정확한 type명시기 필요 합니다.

비단 insert 의 경우 뿐 아니라, 파라메터를 전달하는 모든 경우에 해당 될 수 있습니다.

따라서 아래와 같이 수정/정리 할 수 있습니다.

Inser into table(A, b, c, d) values(#a-value#, #b-value#, #c-value#,#d-value#);

==> Inser into table(A, b, c, d) values(#a-value:VARCHAR:NO_ENTRY#
                                                , #b-value:VARCHAR:
NO_ENTRY#
                                                 ,#c-value
:VARCHAR:NO_ENTRY#
                                                 ,#d-value
:VARCHAR:NO_ENTRY#);

    설명.
    #{parameter-Name}:{value-type}:{default-value}#

[출처] ibatis nullValue|작성자 tkgotjd


출처 : http://blog.naver.com/PostView.nhn?blogId=mankeys&logNo=161195599

'Programming > 개발 노트' 카테고리의 다른 글

mht가 이상하게 열린다?!  (0) 2014.02.19
[iBatis] Dynamic SQL, iterate  (0) 2013.12.24
VirtualBox 다루기!!  (0) 2013.10.29
forward와 redirect의 차이  (0) 2013.10.28
by 으스스 2013. 12. 24. 10:28

iBatis에서 Dynamic 기능중 iterate 노드가 있다.
예를 들어 
"select * from tableName where idx in ('3','6','9')" 
와 같이 조건절에 or절이 아닌 in 으로 쿼리를 구성할때 iBatis에서는 iterate 구문으로 구현이 가능하다.

먼저 파라메터클래스로 넘겨줄 값을 배열형식의 맵으로 생성한다.


ArrayList<String> idxList = new ArrayList<String>();
idxList.add("3");
idxList.add("6");
idxList.add("9");
....
HashMap<String, ArrayList<String>> idxMap = new HashMap<String, ArrayList<String>>() ;
idxMap.put("idxArr", idxList);


그리고 iBatis query.xml 파일에 아래처럼 작성한다.


<select id="getList" parameterClass="idxMap" resultClass="dataVO">
   select * from table
  <dynamic prepend="where">
    <isNotEmpty prepend="and" property="idxArr">
      <iterate prepend=" idx in " property="idxArr" open="(" close=")" conjunction=",">
        #idxArr[]#
      </iterate>
    </isNotEmpty>
  </dynamic>
</select>


그러면 iBatis에서 내부적으로 
select * from table where idx='3' or idx='6' or idx='9'
이런 쿼리로 만들어서 실행하게 된다.
위에서 dynamic 의 prepend 속성으로 "where" 가 지정되어 있지만 하위 요소의 조건이 하나라도 만족하지 않으면 sql 문에 추가되지 않는다. 그리고 하위 요소로 isNotNull 태그에 prepend="and" 는 처음 true 가 되는 조건의 prepend 는 parent 인 dynamic 의 prepend 인 "where" 로 덮어진다.


$property명$ 로 작성된 영역은 #property명# 와 같이 prepared statement 의 바인드 변수로 처리되는 것이 아니라 
SQL 문 자체에 텍스트가 replace 되어 처리됨에 유의한다. 


'Programming > 개발 노트' 카테고리의 다른 글

mht가 이상하게 열린다?!  (0) 2014.02.19
입력값에 null/Empty 있는 경우 처리  (0) 2013.12.24
VirtualBox 다루기!!  (0) 2013.10.29
forward와 redirect의 차이  (0) 2013.10.28
by 으스스 2013. 12. 24. 10:06
| 1 |