반응형
Mybatis insert, update batch 처리하기
Mybatis에서 insert, update를 하면서 여러개를 한꺼번에 넣거나 업데이트 해야 하는 경우가 있다. 배치 처리를 하지 않고 서비스를 여러번 호출해서 하게 되면 두 세개야 금방 처리할 수 있지만, 넣어야 하는 값들이 커지면 서비스에서 소모되는 시간이 길어 감당이 안될 수 있다.
이 문서에서는 배치 처리를 해야 할 경우 mapper interface와 mapper xml파일을 어떻게 사용하면 되는지에 대해 설명한다.
1. Mapper Interface
public interface StudyMaterialMapper {
...
public void insert(StudyMaterial studyMaterial);
public void insertBatch(List<StudyMaterial> studyMaterials);
public void update(StudyMaterial studyMaterial);
public void updateBatch(List<StudyMaterial> studyMaterials);
}
2. Mapper.xml
2.1 insert
<insert id="insert" parameterType="com.bootproj.pmcweb.Domain.StudyMaterial" useGeneratedKeys="true" keyProperty="id">
insert into study_material (attachment_id, study_id, type)
values (#{attachmentId}, #{studyId}, #{type});
</insert>
2.2 insert batch
<insert id="insertBatch" parameterType="com.bootproj.pmcweb.Domain.StudyMaterial" useGeneratedKeys="true" keyProperty="id">
insert into study_material (attachment_id, study_id, type)
values
<foreach collection="list" item="attachment" index="index" separator=",">
(#{attachment.attachmentId}, #{attachment.studyId}, #{attachment.type})
</foreach>
;
</insert>
2.3 update
<update id="update" parameterType="com.bootproj.pmcweb.Domain.StudyMaterial">
update study_material set attachment_id = #{attachmentId}, study_id = #{studyId}, type = #{type}
where id = #{id};
</update>
2.4 update batch
<update id="updateBatch" parameterType="com.bootproj.pmcweb.Domain.StudyMaterial">
<foreach collection="list" item="attachment" index="index" open="" close="" separator=";">
update study_material
<set>
attachment_id = #{attachment.attachmentId},
study_id = #{attachment.studyId},
type = #{attachment.type}
</set>
where id = #{attachment.id}
</foreach>
</update>
주의: update batch처리를 할 때 separator로 ;를 주는 것을 볼 수 있다. 즉 update문을 여러번 써서 다중 쿼리를 작성하는건데 이렇게 다중쿼리를 사용하려면 아래와 같이 application.properties의 jdbc에 allowMultiQueries=true 옵션을 주어야 한다.
...
spring.datasource.hikari.jdbc-url=jdbc:mysql:{url}/study?serverTimezone=UTC&characterEncoding=UTF-8&allowMultiQueries=true
...
반응형
'개발 > Spring' 카테고리의 다른 글
[Spring 프로젝트] Annotation 동작 원리와 사용법 (0) | 2020.12.07 |
---|---|
[Spring 프로젝트] AOP Logging (Post 메서드의 Json Body 값 로깅하기) (0) | 2020.12.04 |
[Spring 프로젝트] Junit5 테스트 코드 작성하기 (Junit4와 차이점 정리) (0) | 2020.11.20 |
[Spring] 컴포넌트 스캔 (0) | 2020.11.17 |
[Spring] 스프링 의존 자동 주입 (Auto Injection)이란? (0) | 2020.11.16 |