반응형
목차
다중 업데이트를 하는 방법 중 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에 수정문이 누락되어서 그렇다.
다시 사진을 변경해 글을 수정하긴 귀찮다..
반응형
'IT > development' 카테고리의 다른 글
[springBoot/html] table값 변경 후 DB update(feat.contenteditable) (0) | 2022.12.17 |
---|---|
[티스토리] 코드블럭 클립보드에 복사 추가하기(feat. clipboard.js) (0) | 2022.12.17 |
[thymeleaf/javascript]thymeleaf값을 javascript에서 사용 (0) | 2022.12.08 |
[IntelliJ] camelCase <-> snake_case 변환(feat. CamelCase plugin) (0) | 2022.12.08 |
[bootstrap] bootstrap modal창 띄우기 (2) | 2022.12.08 |