IT/development

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

알 수 없는 사용자 2022. 12. 16. 08:05
반응형

목차

    다중 업데이트를 하는 방법 중 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에 수정문이 누락되어서 그렇다.
    다시 사진을 변경해 글을 수정하긴 귀찮다..

    반응형