Map<String, Object> lstParam = new HashMap<String, Object>();
Map<String, Object> mapParam;
List<Map<String, Object>> dsBuildList;
List<Map<String, Object>> dsObjList;
List<Map<String, Object>> dsBuildMrtggList;
List<Map<String, Object>> dsPldgList;
List<Map<String, Object>> dsClauseList;
List<Map<String, Object>> dsLoanList;
lstParam.put("mapParam",mapParam);
lstParam.put("dsBuildList",dsBuildList);
lstParam.put("dsObjList",dsObjList);
lstParam.put("dsBuildMrtggList",dsBuildMrtggList);
lstParam.put("dsPldgList",dsPldgList);
lstParam.put("dsClauseList",dsClauseList);
lstParam.put("dsLoanList",dsLoanList);
일반적으로 Mybatis에 Parameter를 넣을 때, 보통 Map<String, Object>, List<Map<String, Object>>와 같은 형태로 집어 넣은 상태를 많이 봤었다.
복수의 List와 Map이 섞인 형태의 Parameter가 필요한 경우가 생길 수 있다.
한 번 Database를 건드릴 때, 일반적으로 하나의 테이블을 각각 Dao를 통해서 건드리게 되는 것이 일반적이지만 insert 도중, 에러가 발생하면 전체 롤백이 필요할 수 있기 때문이다.
다른 방법도 있겠지만 일단 앞에서 개발한 사람 것에 맞추는 것이 일반적이니까...
일단 Object가 최상위 Class 형태니까 위와 같이 하면 List든 Map이든 다 들어간다.
<insert id="savePreLink" parameterType="java.util.Map">
DECLARE
v_frid VARCHAR2(10); -- 등록자
v_chng_val VARCHAR2(10); -- 변경구분
BEGIN
v_frid := #{mapParam.FRID};
v_chng_val := #{mapParam.CHNG_TYPE};
BEGIN
<foreach item="item" index="key" collection="dsBuildMrtggList" separator="">
v_row_03 := v_row_03 + 1;
INSERT INTO IF_BEN_HYU_CALC_SECT
(
SECTCD_NO
, SECTCD
, SECTMODYN
)
VALUES
(
v_row_03
, CASE
WHEN #{item.MRTGG_CD} = 'T405' THEN '12'
WHEN #{item.MRTGG_CD} = 'U989' THEN '01'
WHEN #{item.MRTGG_CD} = 'W990' THEN '01'
WHEN #{item.MRTGG_CD} = 'T152' THEN '05'
WHEN #{item.MRTGG_CD} = 'T050' THEN '12'
END
, #{item.NOW_ROWTYPE}
);
</foreach>
END;
....
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE_APPLICATION_ERROR(-20000, 'ERROR - '|| v_step);
END;
</insert>
코드를 다 올려선 안되기에 일부 삭제가 되었지만 위와 같이 Map에서 Map을 꺼내거나 foreach를 이용하여 List를 사용하는 식으로 사용할 수 있다.
처음엔 이런 내용이 검색해도 안보여서 뭔가 했는데 사실 이렇게 쓰면 안좋아서 쓰는 사람이 없어서 관련 내용이 없었던 것 같다.