본문 바로가기

SQL

ibatis iterate list 반복문으로 merge update insert 하기

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>