개발/Spring

[Spring 프로젝트] Mybatis에서 Insert, Update Batch 처리하기

nova_dev 2020. 12. 2. 13:58
반응형

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
...
반응형