iBaits에서 dynamic tag 사용시 typeHandler처리 관련 문의
- 작성자 :
- 전*성
- 작성일 :
- 2010-07-06 11:33:41
- 조회수 :
- 3,847
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
먼저 parameterMap에 typeHandler정의 했다고 기술했는데 안보셨나바요
test_SQL.xml
================================================================================
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="test">
<!-- com.hs.gw.appr.info.ParticipantInfo Start -->
<typeAlias alias="ParticipantInfo" type="com.hs.gw.appr.info.ParticipantInfo"/>
<parameterMap id="ParticipantInfoParameter" class="map">
<parameter jdbcType="VARCHAR" property="hsParticipantID" javaType="HsID"/>
<parameter jdbcType="DECIMAL" property="ulApprovalStatus" javaType="int" typeHandler="com.hs.gw.dao.ibatis.support.ParticipantTypeConverter"/>
</parameterMap>
<update id="updateParticipantInfo" parameterMap="ParticipantInfoParameter" >
UPDATE TN_CB_PRTCPNT
<dynamic prepend=" SET " >
<isPropertyAvailable property="ulApprovalStatus" prepend=",">
PRTCPNT_STTUS_SE=#ulApprovalStatus#
</isPropertyAvailable>
</dynamic>
WHERE PARTCPTN_ID = #hsParticipantID#
</update>
<!-- com.hs.gw.appr.info.ParticipantInfo End -->
</sqlMap>
ParticipantTypeConverter.java
================================================================================
public class ParticipantTypeConverter implements TypeHandlerCallback {
public void setParameter(ParameterSetter setter, Object parameter) throws SQLException {
System.out.println("setParameter");
}
}
test.java
================================================================================
public void testDynamicTest() {
HashMap map = new HashMap();
map.put("hsParticipantID", new HsID(IDConst.IDTYPE_APPROVALDOC,"09876543210987654321"));
map.put("ulApprovalStatus", new Integer(3));
sqlMapClient.update("test.updateParticipantInfo", map);
}
위의 코드에서 typeHandler로 지정한 ParticipantTypeConverter의 stdout가 수행되지 않습니다.
왜 수행되지 않는지는 아래에 기술했기 때문에 생략하겠습니다.
test_SQL.xml
================================================================================
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="test">
<!-- com.hs.gw.appr.info.ParticipantInfo Start -->
<typeAlias alias="ParticipantInfo" type="com.hs.gw.appr.info.ParticipantInfo"/>
<parameterMap id="ParticipantInfoParameter" class="map">
<parameter jdbcType="VARCHAR" property="hsParticipantID" javaType="HsID"/>
<parameter jdbcType="DECIMAL" property="ulApprovalStatus" javaType="int" typeHandler="com.hs.gw.dao.ibatis.support.ParticipantTypeConverter"/>
</parameterMap>
<update id="updateParticipantInfo" parameterMap="ParticipantInfoParameter" >
UPDATE TN_CB_PRTCPNT
<dynamic prepend=" SET " >
<isPropertyAvailable property="ulApprovalStatus" prepend=",">
PRTCPNT_STTUS_SE=#ulApprovalStatus#
</isPropertyAvailable>
</dynamic>
WHERE PARTCPTN_ID = #hsParticipantID#
</update>
<!-- com.hs.gw.appr.info.ParticipantInfo End -->
</sqlMap>
ParticipantTypeConverter.java
================================================================================
public class ParticipantTypeConverter implements TypeHandlerCallback {
public void setParameter(ParameterSetter setter, Object parameter) throws SQLException {
System.out.println("setParameter");
}
}
test.java
================================================================================
public void testDynamicTest() {
HashMap map = new HashMap();
map.put("hsParticipantID", new HsID(IDConst.IDTYPE_APPROVALDOC,"09876543210987654321"));
map.put("ulApprovalStatus", new Integer(3));
sqlMapClient.update("test.updateParticipantInfo", map);
}
위의 코드에서 typeHandler로 지정한 ParticipantTypeConverter의 stdout가 수행되지 않습니다.
왜 수행되지 않는지는 아래에 기술했기 때문에 생략하겠습니다.
A
안녕하세요.. 전우성님..
우선 .. inline parameterMap 과 그냥 parameterMap과 혼동을 하시고 계신 것 같습니다. inline parameterMap과 parmaterMap은 다르다는 것을 인지하셔야 할 것 같습니다.
다음으로 올려주시 내용을 확인해 보면..
ParticipantTypeConverter.java의 setParameter 메소드를 잘못 구현하셨습니다...
"parameter"의 값을 setter로 넘겨주셔여 정상적으로 preparedStatement를 set이 되기 때문입니다.
위의 경우는 int 값이기 때문에 다음과 같이 적용하시면 될 것 같습니다.
setter.setInt(((Integer)parameter).intValue());
마지막으로 inline parameterMap의 경우만 정상적으로 typeHandler가 처리됨을 확인하였습니다.
이전에 답변 드린 내용 중에.. resultMap은 정상처리가 되지만.. 그냥 parameterMap은 처리가 되지 않고.. inline 방식으로 변경하시면 될 것 같습니다.
적용된 예는 다음과 같습니다.
<update id="updateParticipantInfo" parameterClass="map" >
UPDATE TN_CB_PRTCPNT
<dynamic prepend=" SET " >
<isPropertyAvailable property="ulApprovalStatus" prepend=",">
PRTCPNT_STTUS_SE=#ulApprovalStatus,type=com.hs.gw.dao.ibatis.support.ParticipantTypeConverte#
</isPropertyAvailable>
</dynamic>
WHERE PARTCPTN_ID = #hsParticipantID#
</update>
그럼.. 즐거운 하루되십시오.
감사합니다.
우선 .. inline parameterMap 과 그냥 parameterMap과 혼동을 하시고 계신 것 같습니다. inline parameterMap과 parmaterMap은 다르다는 것을 인지하셔야 할 것 같습니다.
다음으로 올려주시 내용을 확인해 보면..
ParticipantTypeConverter.java의 setParameter 메소드를 잘못 구현하셨습니다...
"parameter"의 값을 setter로 넘겨주셔여 정상적으로 preparedStatement를 set이 되기 때문입니다.
위의 경우는 int 값이기 때문에 다음과 같이 적용하시면 될 것 같습니다.
setter.setInt(((Integer)parameter).intValue());
마지막으로 inline parameterMap의 경우만 정상적으로 typeHandler가 처리됨을 확인하였습니다.
이전에 답변 드린 내용 중에.. resultMap은 정상처리가 되지만.. 그냥 parameterMap은 처리가 되지 않고.. inline 방식으로 변경하시면 될 것 같습니다.
적용된 예는 다음과 같습니다.
<update id="updateParticipantInfo" parameterClass="map" >
UPDATE TN_CB_PRTCPNT
<dynamic prepend=" SET " >
<isPropertyAvailable property="ulApprovalStatus" prepend=",">
PRTCPNT_STTUS_SE=#ulApprovalStatus,type=com.hs.gw.dao.ibatis.support.ParticipantTypeConverte#
</isPropertyAvailable>
</dynamic>
WHERE PARTCPTN_ID = #hsParticipantID#
</update>
그럼.. 즐거운 하루되십시오.
감사합니다.