728x90
ibatis iterate list 반복문으로 merge update insert 하는 방법
‼️참고‼️
티베로DB에서 조회한 데이터를 오라클DB로 insert 하는 방법
👉
1. java
ibatis를 이용한 for문을 구현하려면 먼저 java단에서 List로 조회한 데이터를 List 방식으로 sqlmap에 던진다. ibatis에서 받은 List를 이용해 반복문을 수행한다.
// controller
public void copyTiberoData() throws Exception{
Map param = new HashMap();
// 티베로DB에서 데이터 조회
List<Map> list = ggoyoService.selectTiberoList(param)
if(list.size() > 0){
// 오라클DB로 데이터 저장
ggoyoService.saveTiberoToOracle(list);
}
}
...
// service
public void saveTiberoToOracle(List<Map> list) throws Exception{
myDAO.saveTiberoToOracle(list);
}
...
// dao
public void saveTiberoToOracle(List<Map> list) throws Exception{
insert("myDAO.insertDataList", list);
}
2. sqlmap
- <iterate conjunction="UNION"> 구문이 반복문이 도는 부분.
- 리스트에 있는 컬럼을 지정하고자 할 때는 #[].컬럼명#으로 써줌.
- iterate의 property 태그를 이용해 property="List", #List[]# 이렇게 쓰기도 한다는데 에러가 나는 경우를 봐서 나는 리스트를 생략하고 [] 이것만 해서 구현했다.
- merge문의 경우 insert 구문에서 반복하는 것이 아니라 처음 select 구문을 반복해야 에러가 나지 않는다.
- 반복문 안에서 지정하는 컬럼명은 List 결과에서 어떻게 컬럼이 나오는지 봐야함. camel case에 유의할 것.
<insert id="myDAO.insertDataList" parameterClass="java.util.List">
MERGE INTO GGOYOTB A USING (
<iterate conjunction="UNION">
SELECT
#[].userId# AS USER_ID,
#[].userName# AS USER_NAME,
#[].userAge# AS USER_AGE,
#[].groupCode# AS GROUP_CODE
FROM DUAL
</iterate>
)B ON ( A.USER_ID = B.USER_ID )
WHEN MATCHED THEN
UPDATE SET
USER_NAME = B.USER_NAME,
USER_AGE = B.USER_AGE,
GROUP_CODE = B.GROUP_CODE,
UPDATE_YMD = SYSDATE
WHEN NOT MATCHED THEN
INSERT (
USER_ID,
USER_NAME,
USER_AGE,
GROUP_CODE,
INSERT_YMD,
UPDATE_YMD
)VALUES (
B.USER_ID,
B.USER_NAME,
B.USER_AGE,
B.GROUP_CODE,
SYSDATE,
SYSDATE
)
</insert>