💻 it/development

[mybatis] mybatis multi update(다중 업데이트)

꼬비랩 2025. 12. 10.
 

다중 업데이트를 하는 방법 중 mybatis에서 지원하는 multi update를 이용한 방법을 기록한다.
application.properteis

#allowMultiQueries=true mybatis multi update 사용하기 위해선 이걸 꼭 넣어야 한다.
spring.datasource.url=jdbc:log4jdbc:mariadb://localhost:3307/test?characterEncoding=UTF-8&allowMultiQueries=true
spring.datasource.username=test
spring.datasource.password=1234

mapper xml

<!-- 다중 업데이트(전체 update문을 foreach로 감싼 후 구분자를 ";"로 해야 SQL 에러가 나지 않는다.) -->
<!-- list를 넘겨 받았기 때문에 collection은 list로 하고 별칭(item) 정한 후 item.으로 list안의 객체 필드에 접근할 수 있다. -->
    <update id="updateCommonCodeList" parameterType="list">
        <foreach collection="list" item="item" index="index" separator=";">
            UPDATE  tb_common_code
            SET    code_id            = #{item.codeId}
                  ,code_name          = #{item.codeName}
                  ,code_order         = #{item.codeOrder}
                  ,updater            = #{item.updater}
                  ,update_date        = SYSDATE()
            WHERE  code_no            = #{item.codeNo}
        </foreach>
    </update>

mapper interface

// CommonCodeVo타입의 list를 넘긴다.
void updateCommonCodeList(List<CommonCodeVo> commonCodeVoList);

service

@Transactional
    public void updateCommonCodeList(List<CommonCodeVo> commonCodeVoList) throws Exception{
        commonCodeMapper.updateCommonCodeList(commonCodeVoList);
    }

test code

package com.test.admin.service;

import com.test.admin.vo.CommonCodeVo;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Commit;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
@Slf4j
@Transactional	// 이 애노테이션 있으면 쿼리 실행 후 롤백
class CommonCodeServiceTest {

    @Autowired CommonCodeService commonCodeService;

    @Test
    @DisplayName("다중업데이트")
    @Commit		// 클래스 레벨에 @Transactional이 있어서 실제 DB에 반영하기 위해 강제 Commit 설정을 줌
    public void 다중업데이트() throws Exception {
        //givin
        CommonCodeVo commonCodeVo1 = new CommonCodeVo();
        commonCodeVo1.setCodeId("A05");
        commonCodeVo1.setCodeName("하우스");
        commonCodeVo1.setCodeDesc("집을 뜻합니다.");
        commonCodeVo1.setUpdater("아이언맨");
        commonCodeVo1.setCodeNo(11);

        CommonCodeVo commonCodeVo2 = new CommonCodeVo();
        commonCodeVo2.setCodeId("A06");
        commonCodeVo2.setCodeName("퓨마");
        commonCodeVo2.setCodeDesc("동물 퓨마를 뜻합니다.");
        commonCodeVo2.setUpdater("세렝게티");
        commonCodeVo2.setCodeNo(12);

        CommonCodeVo commonCodeVo3 = new CommonCodeVo();
        commonCodeVo3.setCodeId("A07");
        commonCodeVo3.setCodeName("사자");
        commonCodeVo3.setCodeDesc("동물 사자를 뜻합니다.");
        commonCodeVo3.setUpdater("사파리");
        commonCodeVo3.setCodeNo(13);

        //when
        // 3개의 객체를 list에 담아서 서비스의 updateCommonCodeList()를 호출한다.
        List<CommonCodeVo> commonCodeVoList = new ArrayList<>();
        commonCodeVoList.add(commonCodeVo1);
        commonCodeVoList.add(commonCodeVo2);
        commonCodeVoList.add(commonCodeVo3);
		
        commonCodeService.updateCommonCodeList(commonCodeVoList);
        //then
        // 생략
    }
}

 

결과
SQL

DB table

 

실제 DB 테이블의 CODE_DESC가 NULL로 된 이유는.. mapper.xml에 수정문이 누락되어서 그렇다.
다시 사진을 변경해 글을 수정하긴 귀찮다..

댓글